Unity 3D 實(shí)踐案例三

2020-07-11 13:49 更新

Unity 3D 中提供了第一人稱和第三人稱虛擬漫游組件,虛擬漫游可以提升游戲玩家對(duì)游戲產(chǎn)生的沉浸感。

本案例通過(guò)腳本實(shí)現(xiàn)第一人稱虛擬漫游功能的實(shí)踐操作,熟悉并掌握編寫(xiě) Unity 3D 腳本實(shí)現(xiàn)游戲功能的方法。

案例設(shè)計(jì)

本案例采用 C# 腳本開(kāi)發(fā)第一人稱虛擬漫游功能。

構(gòu)建簡(jiǎn)單的 3D 場(chǎng)景,使用 W、S、AD鍵即可在場(chǎng)景內(nèi)自由行走,還可以通過(guò)鼠標(biāo)實(shí)現(xiàn)觀察者視角的旋轉(zhuǎn)功能。

案例實(shí)施

  1. 執(zhí)行 GameObject3D ObjectPlane 命令創(chuàng)建一個(gè)平面。

  1. 執(zhí)行 GameObjectCreate Empty 命令創(chuàng)建空物體,并將標(biāo)簽設(shè)為 Player

一個(gè)標(biāo)簽是用來(lái)索引一個(gè)或一組游戲?qū)ο蟮脑~。標(biāo)簽是為了編程的目的而對(duì)游戲?qū)ο蟮臉?biāo)注,游戲開(kāi)發(fā)人員可以使用標(biāo)簽來(lái)書(shū)寫(xiě)腳本代碼,通過(guò)搜索找到包含想要的標(biāo)簽的對(duì)象。

添加標(biāo)簽方法很簡(jiǎn)單,選中 Inspector 面板右上方的 Tag,點(diǎn)擊 Add Tag 將在檢視面板打開(kāi)標(biāo)簽管理器,然后在里面輸入 Player。

然后再次選擇空物體,在 Tag 的下拉列表中找到 Player 標(biāo)簽,完成添加標(biāo)簽。

  1. 為主角添加角色控制器組件。執(zhí)行 ComponentPhysicsCharacter Controller 命令,如下圖所示。

角色控制器主要用于第三人稱或第一人稱游戲主角控制,并不使用剛體物理效果,具體參數(shù)如下表所示。

參數(shù) 描述 功能
Slope Limit 坡度限制 限制碰撞器只能爬小于等于該值的斜坡
Step Offset 臺(tái)階高度 角色可以邁上的最高臺(tái)階高度
Skin Width 皮膚厚度 皮膚厚度決定了兩個(gè)碰撞器可以互相滲透的深度
Min Move Distance 最小移動(dòng)距離 如果角色移動(dòng)的距離小于該值,角色就不會(huì)移動(dòng)
Center 中心 該值決定膠囊碰撞器在世界空間中的位置
Radius 半徑 膠囊碰撞器的橫截面半徑
Height 高度 膠囊碰撞器的高度

  1. 添加 Rigidbody 組件,取消選中 Use Gravity 復(fù)選框,選中 Is Kinematic 復(fù)選框使其不受物理影響,而是受腳本控制。

  1. 調(diào)整 Character Controller 的位置和大小,使其置于平面之上。

  1. 創(chuàng)建 C# 腳本,將其命名為 Player。

  1. 輸入如下代碼:

    using UnityEngine;
    using System.Collections;
    public class Player:MonoBehaviour{
        public Transform m_transform;
        //角色控制器組件
        CharacterController m_ch;
        //角色移動(dòng)速度
        float m_movSpeed=3.0f;
        //重力
        float m_gravity=2.0f;
        void Start(){
            m_transform=this.transform;
            //獲取角色控制器組件
            m_ch=this.GetComponent<CharacterController>();
        }
        void Update(){
            Control();
        }
        void Control(){
            //定義3個(gè)值控制移動(dòng)
            float xm=0, ym=0, zm=0;
            //重力運(yùn)動(dòng)
            ym-=m_gravity*Time.deltaTime;
            //前后左右移動(dòng)
            if(Input.GetKey(KeyCode.W)){
                zm+=m_movSpeed*Time.deltaTime;
            }else if(Input.GetKey(KeyCode.S)){
                zm-=m_movSpeed*Time.deltaTime;
            }
            if(Input.GetKey(KeyCode.A)){
                xm-=m_movSpeed*Time.deltaTime;
            }else if(Input.GetKey(KeyCode.D)){
                xm+=m_movSpeed*Time.deltaTime;
            }
            //使用角色控制器提供的Move函數(shù)進(jìn)行移動(dòng)
            m_ch.Move(m_transform.TransformDirection(new Vector3(xm, ym, zm)));
        }
    }

上述代碼主要是控制角色前后左右移動(dòng)。

Start 函數(shù)中,首先獲取 CharacterController 組件,然后在 Control 函數(shù)中通過(guò)鍵盤(pán)操作獲得 X 和 Y 方向上的移動(dòng)距離,最后使用 CharacterController 組件提供的 Move 函數(shù)移動(dòng)角色。

使用 CharacterController 提供的功能進(jìn)行移動(dòng)時(shí),會(huì)自動(dòng)計(jì)算移動(dòng)體與場(chǎng)景之間的碰撞。

  1. 在 Hierarchy 視圖中選中 Player 游戲?qū)ο?,在?Inspector 屬性面板中選擇 Component→Script,選擇 Player 腳本將其鏈接到 Player 游戲?qū)ο笊稀?/li>

  1. 此時(shí)運(yùn)行測(cè)試,按 W、S、A、D 鍵可以控制主角前后左右移動(dòng),但是在 Game 視圖中卻觀察不到主角在場(chǎng)景中移動(dòng)的效果,這是因?yàn)閿z像機(jī)還沒(méi)有與主角的游戲?qū)ο箨P(guān)聯(lián)起來(lái),需要添加攝像機(jī)代碼。打開(kāi) "Player.cs",添加如下代碼:

    //攝像機(jī)Transform
    Transform m_camTransform;
    //攝像機(jī)旋轉(zhuǎn)角度
    Vector3 m_camRot;
    //攝像機(jī)高度
    float m_camHeight=1.4f;
    //修改Start函數(shù), 初始化攝像機(jī)的位置和旋轉(zhuǎn)角度
    void Start(){
        m_transform=this.transform;
        //獲取角色控制器組件
        m_ch=this.GetComponent<CharacterController>();
        //獲取攝像機(jī)
        m_camTransform=Camera.main.transform;
        Vector3 pos=m_transform.position;
        pos.y+=m_camHeight;
        m_camTransform.position=pos;
        //設(shè)置攝像機(jī)的旋轉(zhuǎn)方向與主角一致
        m_camTransform.rotation=m_transform.rotation;
        m_camRot=m_camTransform.eulerAngles;
        //鎖定鼠標(biāo)
        Screen.lockCursor=true;
    }
    void Update(){
        Control();
    }
    void Control(){
        //獲取鼠標(biāo)移動(dòng)距離
        float rh=Input.GetAxis("Mouse X");
        float rv=Input.GetAxis("Mouse Y");
        //旋轉(zhuǎn)攝像機(jī)
        m_camRot.x-=rv;
        m_camRot.y+=rh;
        m_camTransform.eulerAngles=m_camRot;
        //使角色的面向方向與攝像機(jī)一致
        Vector3 camrot=m_camTransform.eulerAngles;
        camrot.x=0;camrot.z=0;
        m_transform.eulerAngles=camrot;
        //操作角色移動(dòng)代碼
        //使攝像機(jī)位置與角色一致
        Vector3 pos=m_transform.position;
        pos.y+=m_camHeight;
        m_camTransform.position=pos;
    }

上述代碼通過(guò)控制鼠標(biāo)旋轉(zhuǎn)攝像機(jī)方向,使角色跟隨攝像機(jī)的 Y 軸旋轉(zhuǎn)方向,在移動(dòng)角色時(shí),使攝像機(jī)跟隨角色運(yùn)動(dòng)。

  1. 單擊 Play 按鈕進(jìn)行測(cè)試,效果如下圖所示,通過(guò)鼠標(biāo)操作可以在場(chǎng)景中旋轉(zhuǎn)視角,通過(guò) W、S、A、D 鍵可以在場(chǎng)景中向前、向后、向左、向右移動(dòng)。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)