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;
    }
}

內容有點多,剩下的以後說吧。。

遊戲本頁下載

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