unity3d 難點(diǎn)---控制人物行走攝像機(jī)移動(dòng)等

1 通過(guò)鍵盤(pán)控制人物移動(dòng)

  • 鼠標(biāo)右鍵 :Input.GetMouseButton(1) Input.GetMouseButtonUp(1)

  • 屏幕射線:
    獲取屏幕坐標(biāo)Vector3 mScreenPos = Input.mousePosition;
    定義射線Ray mRay = Camera.main.ScreenPointToRay(mScreenPos);RaycastHit mHit;

  • 判斷射線是否擊中地面
    Physics.Raycast(mRay,out mHit) mHit.collider.gameObject.tag=="Terrain"

//獲取屏幕坐標(biāo)
Vector3 mScreenPos = Input.mousePosition;
// 定義射線
Ray mRay = Camera.main.ScreenPointToRay(mScreenPos);
RaycastHit mHit;


//判斷射線是否擊中地面
if(Physics.Raycast(mRay,out mHit))
{
    if(mHit.collider.gameObject.tag=="Terrain")
}

Raycast
  • 角色控制
//獲取目標(biāo)坐標(biāo)
mTargetPos=mHit.point;
//讓主角面朝目標(biāo)坐標(biāo)并向目標(biāo)移動(dòng)
transform.LookAt(mTargetPos);
//播放奔跑動(dòng)畫(huà)
transform.gameObject.GetComponent().Play("run");
transform.Translate(Vector3.forward * 0.5F);
  • 松開(kāi)鼠標(biāo)右鍵時(shí)
    transform.gameObject.GetComponent().Play("idle");

2 通過(guò)鼠標(biāo)控制人物移動(dòng)

前后左右 horizontal vertical

先轉(zhuǎn)向 后移動(dòng)

官網(wǎng)給的人物轉(zhuǎn)向

void Rotating(float horizontal,float vertical)
{
    Vector3 targetDirection = new Vector3(horizontal,0f,vertical);
    Quaternion targetRotation = Quaternion.LookRotation(targetDirection,Vector3.up);
    Quaternion newRotation = Quaternion.Lerp(rigidbody.rotation,
        targetRotation,turnSmoothing*Time.deltaTime);
    rigidbody.MoveRotation(new)
}

人物移動(dòng)

transform.Translate(Vector3.forward*m_speed);
//同時(shí)播放動(dòng)畫(huà)
this.SetFloat();

Transform組件移動(dòng)物體

transform.translate
將物體從當(dāng)前位置,移動(dòng)到指定位置,并且可以選擇參照的坐標(biāo)系。 當(dāng)需要進(jìn)行坐標(biāo)系轉(zhuǎn)換時(shí),可以考慮使用該方法以省去轉(zhuǎn)換坐標(biāo)系的步驟。

Vector3.Lerp, Vector3.Slerp,Vector3.MoveTowards
可以表示三維空間中的一個(gè)點(diǎn),也可以表示一個(gè)向量。這三個(gè)方法均為插值方法, Lerp為線性插值,Slerp為球形插值, MoveTowards在Lerp的基礎(chǔ)上增加了限制最大速度功能。 當(dāng)需要從指定A點(diǎn)移動(dòng)到B點(diǎn)時(shí),可以考慮時(shí)候這些方法。

Vector3.SmoothDamp

該方法是可以平滑的從A逐漸移動(dòng)到B點(diǎn),并且可以控制速度,最常見(jiàn)的用法是相機(jī)跟隨目標(biāo)。

Transform.position
有時(shí)重新賦值position能更快實(shí)現(xiàn)我們的目標(biāo)。

Rigidbody組件移動(dòng)物體

Rigidbody組件用于模擬物體的物理狀態(tài),比如物體受重力影響,物體被碰撞后的擊飛等等。

注意:關(guān)于Rigidbody的調(diào)用均應(yīng)放在FixedUpdate方法中,該方法會(huì)在每一次執(zhí)行物理模擬前被調(diào)用。

3.1 Rigidbody.velocity
設(shè)置剛體速度可以讓物體運(yùn)動(dòng)并且忽略靜摩擦力,這會(huì)讓物體快速?gòu)撵o止?fàn)顟B(tài)進(jìn)入運(yùn)動(dòng)狀態(tài)。

3.2 Rigidbody.AddForce
給剛體添加一個(gè)方向的力,這種方式適合模擬物體在外力的作用下的運(yùn)動(dòng)狀態(tài)。

3.3 Rigidbody.MovePosition
剛體受到物理約束的情況下,移動(dòng)到指定點(diǎn)。

CharacterController組件移動(dòng)物體

CharacterController用于控制第一人稱(chēng)或第三人稱(chēng)角色的運(yùn)動(dòng),使用這種方式可以模擬人的一些行為,比如限制角色爬坡的最大斜度,步伐的高度等。

CharacterController.SimpleMove
用于模擬簡(jiǎn)單運(yùn)動(dòng),并且自動(dòng)應(yīng)用重力,返回值表示角色當(dāng)前是否著地。
CharacterController.Move
模擬更復(fù)雜的運(yùn)動(dòng),重力需要通過(guò)代碼實(shí)現(xiàn),返回值表示角色與周?chē)呐鲎残畔ⅰ?/p>

細(xì)節(jié)調(diào)整

使用rigid bodyfreeze rotation 使得物體不會(huì)發(fā)生旋轉(zhuǎn)或者就是不會(huì)發(fā)生飄動(dòng)

如果freezeRotation被啟用,旋轉(zhuǎn)不會(huì)被物體模擬修改。這對(duì)于創(chuàng)建第一人稱(chēng)射擊游戲時(shí)是很有用的,因?yàn)橥婕倚枰褂檬髽?biāo)完全控制旋轉(zhuǎn)。

Rigidbody中 Angular Drag (角阻力):同樣指的是空氣阻力,只不過(guò)是用來(lái)阻礙物體旋轉(zhuǎn)的。如果設(shè)置成無(wú)限的話,物體會(huì)立即停止旋轉(zhuǎn)。如果設(shè)置成0,物體在上升過(guò)程中,會(huì)發(fā)生側(cè)翻旋轉(zhuǎn)。

參考資料:
Unity3D教程:如何使用鼠標(biāo)點(diǎn)擊控制角色移動(dòng)
https://www.cnblogs.com/qiaogaojian/p/5962788.html
Rigidbody.freezeRotation 凍結(jié)旋轉(zhuǎn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容