u3d学习-第一个小游戏

1.(位置大小信息)在U3D新建一个简单的项目,默认有主摄像机和灯光,然后我们新增,一个Cube,然后调整大小,将其命名成地板,下面是地板的参数,Position是位置,Rotation是旋转的信息,Scale是缩放信息,所以Z是长度,X和Y分别是平面上的宽和高

2.(刚体)然后在新建一个Cube,将其命名为Player,将其调整大小,放到地板上,默认Player是没有碰撞体积的,我们需要在Player上增加一个刚体(具有物理体积特性),点击Player然后在属性上最下面点击add Component,然后搜索rigidbody,添加上去后,将其Mass(质量)修改为2

3.(TAG)然后我们在新建一个Cube,将其命名为障碍物,然后将障碍物调整好宽高后,给它新增一个Tag(在批量操作某群实例的时候,Tag可以作为识别标识),点击障碍物,然后在属性上点击Tag,下拉菜单选择Add Tag,然后输入tag名称为障碍物,在将障碍物的Tag选择为新增的内容

4.(Prefab)因为我们会有N个障碍物,我们将障碍物从Hierarchy拖入到Assets,这里我们称之为Prefab,Prefab是一个关联性可复制的实例,然后我们在Assets中可以将刚才新加的prefab实例,拖入到场景中,用来布局障碍

5.(Script)然后我们点击Player,在属性上点击add component,搜索script,然后在Assets中找到脚本,双击就可以编辑了,这里推荐使用Visual Studio,我用的是Visual Studio 2019,然后里面默认会有一个Start和Update方法,我们将下面我已经写好的代码copy进去

using UnityEngine;
using UnityEngine.UI;

public class PlayerController : MonoBehaviour
{
    //刚体实例
    public Rigidbody rg;
    //移动速度
    public int speed = 200;
    //方向速度
    public int direction_speed = 500;
    //文本实例
    public Text text;
    //音频实例
    public AudioSource Audio;
    //背景音频实例
    public AudioSource Audio_BG;
    //是否结束
    bool isover = false;
    //是否开始
    bool start = false;
    //运行时长
    float m_timer = 0;

    /// <summary>
    /// 碰撞事件
    /// </summary>
    /// <param name="collision"></param>
    private void OnCollisionEnter(Collision collision)
    {
        //判断碰撞的实例tag内容
        switch (collision.collider.tag)
        {
            case "障碍物":
                text.text = "失败:" + transform.position.z.ToString("f2");
                isover = true;
                start = false;
                Play("音乐/lows");
                Audio_BG.volume = 40;
                break;
            case "终点":
                text.text = "胜利!";
                start = false;
                isover = true;
                Play("音乐/win");
                Audio_BG.volume = 40;
                break;
        }
    }

    /// <summary>
    /// 初始化事件
    /// </summary>
    void Awake()
    {
        Audio.playOnAwake = false;
    }

    /// <summary>
    /// 游戏开始事件
    /// </summary>
    void Start()
    {
        text.text = "点击回车开始\r\nA/D移动";
        Audio_BG.volume = 40;
    }

    /// <summary>
    /// 物理引擎更新事件
    /// </summary>
    private void Update()
    {
        
    }

    /// <summary>
    /// 重新开始
    /// </summary>
    void Gostart()
    {
        isover = false;
        start = false;
        transform.position = new Vector3(0, 1, 0);
        text.text = "点击回车开始\r\nA/D移动";
    }

    /// <summary>
    /// 播放音频
    /// </summary>
    /// <param name="str"></param>
    /// <param name="isloop"></param>
    public void Play(string str,bool isloop = false)
    {
        if (Audio.isPlaying)
        {
            Audio.Stop();
        }
        AudioClip clip = Resources.Load<AudioClip>(str);
        Audio.loop = isloop;
        Audio.clip = clip;
        Audio.Play();
    }

    /// <summary>
    /// 非物理更新
    /// </summary>
    void FixedUpdate()
    {
        //判断是否按下esc
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            start = false;
            //退出游戏
            Application.Quit();
            return;
        }
        if (Input.GetKeyDown(KeyCode.Return))
        {
            if (!isover)
            {
                start = true;
                text.text = "GAME START";
                Play("音乐/start");
                Audio_BG.volume = 80;
            }
            else
            {
                Gostart();
            }
        }

        if (start)
        {
            //给刚体施加力,Time.deltaTime为运行的帧数时长,每帧0.1
            rg.AddForce(0, 0, speed * Time.deltaTime);

            if (Input.GetKey(KeyCode.D))
            {
                rg.AddForce(direction_speed * Time.deltaTime, 0, 0);
            }
            if (Input.GetKey(KeyCode.A))
            {
                rg.AddForce(-direction_speed * Time.deltaTime, 0, 0);
            }
            //修改文本实例属性
            text.text = "距离:" + transform.position.z.ToString("f2");
            if (transform.position.y < 0)
            {
                text.text = "失败:" + transform.position.z.ToString("f2");
                isover = true;
                start = false;
                Play("音乐/lows");
                //调整音频实例声音大小
                Audio_BG.volume = 40;
            }
        }


        if (isover)
        {
            m_timer += Time.time;
            if (m_timer >= 800)
            {
                Gostart();
                m_timer = 0;
            }
        }
    }
}

然后点击Main Camera查看属性,最下面也新增 一个component为script,置入以下代码:

using UnityEngine;

public class ForwordCamera : MonoBehaviour
{

    public GameObject Cameras;
    public GameObject Player;
    public Vector3 vector;

    // Update is called once per frame
    void Update()
    {
        //相机位置等于player的位置加上间距偏移
        Cameras.transform.position = Player.transform.position + vector;
    }
}

内容有点多,剩下的以后说吧。。

游戏本页下载

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章