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")
}
- 角色控制
//獲取目標(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 body中freeze 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)