W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
Unity 3D 中提供了第一人稱和第三人稱虛擬漫游組件,虛擬漫游可以提升游戲玩家對游戲產(chǎn)生的沉浸感。
本案例通過腳本實現(xiàn)第一人稱虛擬漫游功能的實踐操作,熟悉并掌握編寫 Unity 3D 腳本實現(xiàn)游戲功能的方法。
案例設計
本案例采用 C# 腳本開發(fā)第一人稱虛擬漫游功能。
構建簡單的 3D 場景,使用 W
、S
、A
、D
鍵即可在場景內自由行走,還可以通過鼠標實現(xiàn)觀察者視角的旋轉功能。
案例實施
GameObject
→ 3D Object
→ Plane
命令創(chuàng)建一個平面。GameObject
→ Create Empty
命令創(chuàng)建空物體,并將標簽設為 Player
。一個標簽是用來索引一個或一組游戲對象的詞。標簽是為了編程的目的而對游戲對象的標注,游戲開發(fā)人員可以使用標簽來書寫腳本代碼,通過搜索找到包含想要的標簽的對象。
添加標簽方法很簡單,選中 Inspector 面板右上方的 Tag
,點擊 Add Tag
將在檢視面板打開標簽管理器,然后在里面輸入 Player
。
然后再次選擇空物體,在 Tag
的下拉列表中找到 Player
標簽,完成添加標簽。
Component
→ Physics
→ Character Controller
命令,如下圖所示。
角色控制器主要用于第三人稱或第一人稱游戲主角控制,并不使用剛體物理效果,具體參數(shù)如下表所示。
參數(shù) | 描述 | 功能 |
---|---|---|
Slope Limit |
坡度限制 | 限制碰撞器只能爬小于等于該值的斜坡 |
Step Offset |
臺階高度 | 角色可以邁上的最高臺階高度 |
Skin Width |
皮膚厚度 | 皮膚厚度決定了兩個碰撞器可以互相滲透的深度 |
Min Move Distance |
最小移動距離 | 如果角色移動的距離小于該值,角色就不會移動 |
Center |
中心 | 該值決定膠囊碰撞器在世界空間中的位置 |
Radius |
半徑 | 膠囊碰撞器的橫截面半徑 |
Height |
高度 | 膠囊碰撞器的高度 |
Rigidbody
組件,取消選中 Use Gravity
復選框,選中 Is Kinematic
復選框使其不受物理影響,而是受腳本控制。
Character Controller
的位置和大小,使其置于平面之上。Player
。 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
提供的功能進行移動時,會自動計算移動體與場景之間的碰撞。
Player
游戲對象,在其 Inspector
屬性面板中選擇 Component→Script
,選擇 Player
腳本將其鏈接到 Player
游戲對象上。
//攝像機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 軸旋轉方向,在移動角色時,使攝像機跟隨角色運動。
Play
按鈕進行測試,效果如下圖所示,通過鼠標操作可以在場景中旋轉視角,通過 W、S、A、D 鍵可以在場景中向前、向后、向左、向右移動。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: