首先创建一个3D项目,并给项目起一个名字
然后进入商店准备下载直升机模型资源
搜索helicopter
下方选中免费资源
选中直升机模型后点击添加至我的资源
再次选择在Unity中打开
在unity项目中导入资源
在Asset中新添加的资源包中选择Models
将直升机拖拽至项目场景中
之后对直升机进行完全解压缩
创建一个3d面板,并设置面板大小
之后再Asset中新建一个文件夹,命名为script
在script文件中新建一个c#脚本
命名为Helicopter ,是直升机起飞代码 双击打开
将以下代码复制
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Helicopter : MonoBehaviour
{
public float speed = 2f;//向上的位移速度
//每一帧被调用一次
private void Update()
{
if (transform.position.z > 10f)
{
FlyDown();
}
else if (transform.position.y < 10)
{
FlyUp();
}
else
{
FlyForWard();
}
}
//向上飞
void FlyUp()
{
transform.Translate(Vector3.up * speed * Time.deltaTime);
}
//向前飞
void FlyForWard()
{
transform.Translate(Vector3.forward * speed * Time.deltaTime);
}
//向下飞
void FlyDown()
{
if (transform.position.y > 0)
transform.Translate(Vector3.down * speed * Time.deltaTime);
}
}
ctrl + s 保存
再在script文件中新建一个c#脚本,命名为Helicopter1 ,是螺旋桨加速代码
将以下代码复制
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Helicopter1 : MonoBehaviour
{
public GameObject mainRotor;//主螺旋桨
public float rotSpeed = 0f;//旋转速度
public bool isStart = false;//是否启动引擎
private void Update()
{
if (Input.GetKeyDown(KeyCode.E))
{
isStart = !isStart;
}
if (isStart)
{
rotSpeed += 0.5f;
}
else
{
rotSpeed -= 0.5f;
}
if (rotSpeed < 0)
rotSpeed = 0;
if (rotSpeed > 2000)
rotSpeed = 2000;
mainRotor.transform.Rotate(Vector3.up * rotSpeed * Time.deltaTime);
}
}
回到unity项目中,将Helicopter代码绑定在直升机主体上
再将Helicopter1代码绑定在直升机子项目的主螺旋桨上
再将主螺旋桨拖拽至c#脚本下框none中
点击运行即可飞行,后按键盘E键 著螺旋桨即可旋转
下面做完整项目:
首先取消 Helicopter 和 Helicopter1 绑定
再新建一个Helicopter2 c#脚本
双击Helicopter2脚本 将以下代码复制
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEditor.Experimental.GraphView;
using UnityEngine; public class Helicopter2 : MonoBehaviour
{
public GameObject mainRotorObj;//主螺旋桨物体
public GameObject tailRotorObj;//尾部螺旋桨
public float rotSpeed = 0f;//旋转速度
public bool isOnOff = false;//是否开关引擎
public float rotAcceleration = 0f;//旋转加速度
//定义枚举类型
public enum Status
{
ZeroEngine,//停机状态
RunEngine,//启动状态
TakeOff,//起飞状态
FlyForward,//平飞状态
Landing//降落状态
}
Status helicopterStatus;//直升机状态 void Start()
{
if (mainRotorObj == null || tailRotorObj == null)
Debug.LogError("部分子物体没有拽入参数栏");
} void Update()
{
if (Input.GetKeyUp(KeyCode.E))
{
isOnOff = !isOnOff;
}
if (isOnOff)
{
helicopterStatus = Status.RunEngine;
}
else
{
helicopterStatus = Status.ZeroEngine;
}
if (rotSpeed < 0)
rotSpeed = 0;
if (rotSpeed > 2000f)
rotSpeed = 2000;
//螺旋桨公共代码
rotSpeed += rotAcceleration;
mainRotorObj.transform.Rotate(Vector3.up * rotSpeed * Time.deltaTime);
tailRotorObj.transform.Rotate(Vector3.left * rotSpeed * Time.deltaTime);
if (rotSpeed > 800)
helicopterStatus = Status.TakeOff;
if (transform.position.y > 10f)
helicopterStatus = Status.FlyForward;
if (transform.position.x > 20f)
helicopterStatus = Status.Landing;
if (rotSpeed == -0.5)
{
helicopterStatus = Status.TakeOff;
}
if (helicopterStatus == Status.TakeOff)
rotSpeed += 0.5f;
//开关语句进行状态分支,引入枚举变量
if (helicopterStatus == Status.ZeroEngine)
{
rotAcceleration = -1f;
}
else if (helicopterStatus == Status.RunEngine)
{
rotAcceleration = 1f;
}
else if (helicopterStatus == Status.TakeOff)
{
transform.Translate(Vector3.up * 2f * Time.deltaTime);
}
else if (helicopterStatus == Status.FlyForward)
{
transform.Translate(Vector3.forward * 2f * Time.deltaTime);
}
else if (helicopterStatus == Status.Landing)
{
if (transform.position.y > 0)
transform.Translate(Vector3.down * 2f * Time.deltaTime);
rotAcceleration = -0.5f; }
}
}
ctrl + s 保存
回到unity项目之后将Helicopter2代码绑定在直升机主体上
将c#下方none 绑定 主螺旋桨 和 尾螺旋桨
即可完成,运行项目
目的要求:运行项目按E键螺旋桨加速,加速至800直升机向上飞行,达到2000转速不再加速,直升机向上飞行10m向前飞,向前飞10米向下飞并且螺旋桨减速。螺旋桨减速至0再次起飞,并且螺旋桨不再旋转。