當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > 第一人稱視角移動問題
Unity3D作為目前比較火的游戲引擎,其在游戲移動端的市場范圍是非常大的。雖然其渲染能力以及效率有待提高,但是不妨礙它的強大優(yōu)勢。并且在2016年VR元年的確定下,它對市場絕大多數(shù)VR設(shè)備開發(fā)的支持使其越來越受到人們的歡迎。
在VR開發(fā)中,第一人稱的移動始終是至關(guān)重要的一項。無論是角色的速度、動作幅度的搖擺、人物的動作姿態(tài)等等,都是開發(fā)者需要謹(jǐn)慎對待的部分。接下來我和大家說下在VR中移動容易出現(xiàn)的一些問題。
由于公司在開發(fā)VR項目的時候沒有考慮到的多設(shè)備支持,并沒有用到市場上相關(guān)的SDK,而是使用Unity中Camera的屬性制作了簡易的VR攝像機。制作部分如下:
首先創(chuàng)建一個空物體并命名為VRCamera,用來作為兩個攝像機的父物體,并將VRCamera物體的Transform組件初始化。方便對VR攝像機的操作。
然后選中VRCamera物體,然后創(chuàng)建出兩個攝像機,分別命名為LeftCamera和RightCamera。作為VRCamera的子物體。
然后將其中任意一個Camera上的Audio Listener組件單擊右鍵選擇Remove Component移除掉(只移除一個)。
將Main Camera攝像機Transform歸0。將其拖到VRCamera下作為其子物體。并將Depth設(shè)置為-1。
將LeftCamera攝像機參數(shù)修改為下圖所示。
將RightCamera攝像機參數(shù)修改為下圖所示。
修改完之后,創(chuàng)建一個Cube調(diào)整其位置便于觀察,在Game視圖下的場景如下圖所示。
然后在VRCamera上添加碰撞體和剛體進行人物的模擬,并且在其身上掛在移動的腳本。正常情況下是掛在的接受手機陀螺儀數(shù)據(jù)的腳本。如果使用普通的移動方式,例如:
對其位置進行增減transrorm.position += 或者-=,或者使用transfrom.Translate方法此時均會產(chǎn)生低頭的時候會穿破地面,抬頭的時候會離開地面。或者干脆就停止不動。
遇到這種問題的時候,當(dāng)物體帶有剛體,需要對物體進行移動的時候,好的辦法是對其剛體組件進行操作,使用如下方法:
Rigidbody.MovePosition(transform.position +=/-= ...);
而其移動的方向是:
Vector3 dir = new Vector3(Camera.main.transform.forward.x, 0,Camera.main.transform.forward.z);
這樣就能保證當(dāng)?shù)仡^的時候,向前移動會低著頭向前走,而不是穿破地面,抬頭的時候是抬頭向前走,而不是離開地面。
下面是我做的一個模擬:
創(chuàng)建工程,然后在Inspector面板中創(chuàng)建物體Plane作為地面。
然后繼續(xù)在Inspector面板中創(chuàng)建子物體Capsule模擬人物模型,并調(diào)節(jié)Capsule物體的高度,使其底部處于Plane物體上。
在Project中創(chuàng)建Material,并填充顏色,將該材質(zhì)球賦值給Plane,以作區(qū)別。
在Project面板中創(chuàng)建腳本Move.cs,用來實現(xiàn)物體的移動和旋轉(zhuǎn)。按下“W”或者“↑”是向前走,按下“S”或者“↓”是向后走。移動鼠標(biāo)是旋轉(zhuǎn),然后將該腳本掛載在Capsule物體上。
腳本如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Move : MonoBehaviour
{
#region 變量
/// <summary>
/// 剛體
/// </summary>
private Rigidbody rigid;
/// <summary>
/// 移動的速度
/// </summary>
private float walkSpeed = 0.05f;
/// <summary>
/// 移動的方向
/// </summary>
private float moveDir;
/// <summary>
/// 旋轉(zhuǎn)的方向
/// </summary>
private float rotateDir;
/// <summary>
/// 旋轉(zhuǎn)速度
/// </summary>
private float rotateSpeed = 30f;
#endregion
#region Unity 方法
private void Awake()
{
// 初始化剛體組件
rigid = transform.GetComponent<Rigidbody>();
}
private void Update()
{
moveDir = Input.GetAxis("Vertical");
rotateDir = Input.GetAxis("Mouse X");
if (rotateDir != 0)
{
transform.Rotate
(Vector3.up * rotateDir * Time.deltaTime * rotateSpeed);
}
if (moveDir > 0)
{
// 向前走
MoveForward();
}
else if(moveDir < 0)
{
// 向后走
MoveBack();
}
}
#endregion
#region 具體實現(xiàn)的方法
/// <summary>
/// 向前走
/// </summary>
/// <param name = "speed">移動的速度</param>
/// <param name="fixedTime">固定更新的時間</param>
void MoveForward()
{
// 移動的方向,y軸不變
Vector3 dir = new Vector3(Camera.main.transform.forward.x,
0,
Camera.main.transform.forward.z);
// 移動
rigid.MovePosition(transform.position + dir * walkSpeed);
}
/// <summary>
/// 向后走
/// </summary>
/// <param name="speed">移動的速度</param>
/// <param name="fixedTime">固定更新時間</param>
void MoveBack()
{
// 移動的方向,y軸不變
Vector3 dir = new Vector3(Camera.main.transform.forward.x,
0,
Camera.main.transform.forward.z);
// 移動
rigid.MovePosition(transform.position - dir * walkSpeed);
}
#endregion
}
然后在Capsule物體上添加Rigidbody組件,并調(diào)整參數(shù)。
做到這一步驟,Capsule已經(jīng)可以移動旋轉(zhuǎn)了。接下來做第一人稱的實現(xiàn),將Inspector面板中的Main Camera,然后修改其位置和Capsule位置一致,并將Main Camera拖動為Capsule的子物體。
然后在Inspector面板中床架Cube并隨意修改其位置作為參照物。然后點擊運行,可以實現(xiàn)第一人稱的移動旋轉(zhuǎn)等操作。
同樣的設(shè)置設(shè)置在VRCamera物體上一樣可以實現(xiàn)該操作。