Unity 3D 實踐案例三

2020-07-11 13:49 更新

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

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

案例設計

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

構建簡單的 3D 場景,使用 W、S、A、D鍵即可在場景內自由行走,還可以通過鼠標實現(xiàn)觀察者視角的旋轉功能。

案例實施

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

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

一個標簽是用來索引一個或一組游戲對象的詞。標簽是為了編程的目的而對游戲對象的標注,游戲開發(fā)人員可以使用標簽來書寫腳本代碼,通過搜索找到包含想要的標簽的對象。

添加標簽方法很簡單,選中 Inspector 面板右上方的 Tag,點擊 Add Tag 將在檢視面板打開標簽管理器,然后在里面輸入 Player。

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

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

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

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

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

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

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

  1. 輸入如下代碼:

    using UnityEngine;
    using System.Collections;
    public class Player:MonoBehaviour{
        public Transform m_transform;
        //角色控制器組件
        CharacterController m_ch;
        //角色移動速度
        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個值控制移動
            float xm=0, ym=0, zm=0;
            //重力運動
            ym-=m_gravity*Time.deltaTime;
            //前后左右移動
            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ù)進行移動
            m_ch.Move(m_transform.TransformDirection(new Vector3(xm, ym, zm)));
        }
    }

上述代碼主要是控制角色前后左右移動。

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

使用 CharacterController 提供的功能進行移動時,會自動計算移動體與場景之間的碰撞。

  1. 在 Hierarchy 視圖中選中 Player 游戲對象,在其 Inspector 屬性面板中選擇 Component→Script,選擇 Player 腳本將其鏈接到 Player 游戲對象上。

  1. 此時運行測試,按 W、S、A、D 鍵可以控制主角前后左右移動,但是在 Game 視圖中卻觀察不到主角在場景中移動的效果,這是因為攝像機還沒有與主角的游戲對象關聯(lián)起來,需要添加攝像機代碼。打開 "Player.cs",添加如下代碼:

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

上述代碼通過控制鼠標旋轉攝像機方向,使角色跟隨攝像機的 Y 軸旋轉方向,在移動角色時,使攝像機跟隨角色運動。

  1. 單擊 Play 按鈕進行測試,效果如下圖所示,通過鼠標操作可以在場景中旋轉視角,通過 W、S、A、D 鍵可以在場景中向前、向后、向左、向右移動。

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號