W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
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
、A
、D
鍵即可在場(chǎng)景內(nèi)自由行走,還可以通過(guò)鼠標(biāo)實(shí)現(xiàn)觀察者視角的旋轉(zhuǎn)功能。
案例實(shí)施
GameObject
→ 3D Object
→ Plane
命令創(chuàng)建一個(gè)平面。GameObject
→ Create 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)簽。
Component
→ Physics
→ Character 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 |
高度 | 膠囊碰撞器的高度 |
Rigidbody
組件,取消選中 Use Gravity
復(fù)選框,選中 Is Kinematic
復(fù)選框使其不受物理影響,而是受腳本控制。
Character Controller
的位置和大小,使其置于平面之上。Player
。 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)景之間的碰撞。
Player
游戲?qū)ο?,在?Inspector
屬性面板中選擇 Component→Script
,選擇 Player
腳本將其鏈接到 Player
游戲?qū)ο笊稀?/li>
//攝像機(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)。
Play
按鈕進(jìn)行測(cè)試,效果如下圖所示,通過(guò)鼠標(biāo)操作可以在場(chǎng)景中旋轉(zhuǎn)視角,通過(guò) W、S、A、D 鍵可以在場(chǎng)景中向前、向后、向左、向右移動(dòng)。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: