项目02——《直升机》

项目02——《直升机》_第1张图片

项目02——《直升机》_第2张图片

接下来我们布置场景,我们的预期结果(功能分析)是:

        游戏中中的直升机按E键螺旋桨加速,加速至800直升机向上飞行,达到2000转速不再加速,直升机向上飞行10m向前飞,向前飞10米向下飞并且螺旋桨减速。螺旋桨减速至0再次起飞,并且螺旋桨不再旋转。

        分析:我们需要实现的功能概括来说有,主角的移动,摄像机的移动,过关与失败的检测等

首先我们开始场景搭建:

首先进入资源商店准备下载直升机模型资源,

项目02——《直升机》_第3张图片

搜索helicopter,

项目02——《直升机》_第4张图片

将免费资源导入unity包,

项目02——《直升机》_第5张图片

项目02——《直升机》_第6张图片

将导入资源完全解压缩 以让我们进行修改,

项目02——《直升机》_第7张图片

解开预制体之后,创建一个地面Plane,

项目02——《直升机》_第8张图片

设置其大小,

项目02——《直升机》_第9张图片

设置地面颜色(可不做)

项目02——《直升机》_第10张图片

创建脚本文件夹,

项目02——《直升机》_第11张图片

创建脚本,

项目02——《直升机》_第12张图片

命名为Fly

项目02——《直升机》_第13张图片

双击打开脚本编写代码:

项目02——《直升机》_第14张图片

using UnityEngine;
public class Fly : MonoBehaviour{
    public float speed = 2f;//向上的位移速度
    //每一帧被调用一次
    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 保存,将Fly.cs代码绑定在 飞机物体上,并修改飞机名字为Helicopter,

项目02——《直升机》_第15张图片

项目02——《直升机》_第16张图片

 点击 Main Camera 按住ctrl + shift + f 可调整运行视角 与 编辑视角 一致,

项目02——《直升机》_第17张图片

运行即按照代码要求自动飞行,

项目02——《直升机》_第18张图片

但飞行并不真实,直升机的螺旋桨没有旋转,

修改Fly.cs:

项目02——《直升机》_第19张图片

using UnityEngine;
public class Fly : MonoBehaviour{
    public GameObject mainRotorObj;//主螺旋桨物体
    public GameObject tailRotorObj;//尾部螺旋桨
    public float rotSpeed;//旋转速度
    public bool isOnOff = false;//是否开关引擎
    public float rotAcceleration;//旋转加速度
    //定义枚举类型
    public enum Status{
        ZeroEngine,//停机状态
        RunEngine,//启动状态
        TakeOff,//起飞状态
        FlyForward,//平飞状态
        Landing//降落状态
    }
    Status status;//直升机状态
    void Start(){
        if (mainRotorObj == null || tailRotorObj == null)
            Debug.LogError("部分子物体没有拽入参数栏");
    }
    void Update(){
        //开关语句进行状态分支,引入枚举变量
        if (status == Status.ZeroEngine)
            rotAcceleration = -1f;
        else if (status == Status.RunEngine)
            rotAcceleration = 1f;
        else if (status == Status.TakeOff)
            transform.Translate(Vector3.up * 2f * Time.deltaTime);
        else if (status == Status.FlyForward)
            transform.Translate(Vector3.forward * 2f * Time.deltaTime);
        else if (status == Status.Landing){
            if (transform.position.y > 0)
                transform.Translate(Vector3.down * 2f * Time.deltaTime);
            rotAcceleration = -0.5f;
        }
        if (Input.GetKeyUp(KeyCode.E))
            isOnOff = !isOnOff;
        if (isOnOff)
            status = Status.RunEngine;
        else
            status = 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.up * rotSpeed * Time.deltaTime);
        if (rotSpeed > 800)
            status = Status.TakeOff;
        if (transform.position.y > 10f)
            status = Status.FlyForward;
        if (transform.position.x > 20f)
            status = Status.Landing;
        if (rotSpeed == -0.5)
            status = Status.TakeOff;
        if (status == Status.TakeOff)
            rotSpeed += 0.5f;
    }
}

将主螺旋桨与尾螺旋桨绑定在代码框选上,

项目02——《直升机》_第20张图片

运行项目 按 键盘E键 即可按照要求飞行,

项目02——《直升机》_第21张图片

End.

你可能感兴趣的:(3D游戏,c#,1024程序员节)