【unity2022入門第一季】整合Unity官方教程設(shè)計(jì)最佳學(xué)習(xí)路線,Unit

P122 筆記
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
??// Start is called before the first frame update
??//TODO:
??//1.獲取玩家輸入,在場(chǎng)景中移動(dòng)玩家角色游戲?qū)ο?/p>
??//2.移動(dòng)時(shí),除了位置外 position ,還需要考慮轉(zhuǎn)動(dòng) rotation
??//3.需要將動(dòng)畫也考慮進(jìn)去
??//創(chuàng)建一個(gè)3D矢量,來表示玩家角色的移動(dòng)
??Vector3 m_Movement;
??//創(chuàng)建變量,獲取用戶輸入方向
??float horizontal;
??float vertical;
??//創(chuàng)建一個(gè)剛體對(duì)象
??Rigidbody m_Rigibody;
??//創(chuàng)建一個(gè)Animator組件對(duì)象
??Animator m_Animator;
??//用四元數(shù)對(duì)象來表示3D游戲中的旋轉(zhuǎn)
??//初始化四元數(shù)對(duì)象
??Quaternion m_Rotation = Quaternion.identity;
??//設(shè)置旋轉(zhuǎn)速度
??public float turnSpeed = 20.0f;
??void Start()
??{
????//在游戲運(yùn)行開始后,獲取到剛體組件對(duì)象和動(dòng)畫管理對(duì)象
????m_Rigibody = GetComponent<Rigidbody>();
????m_Animator = GetComponent<Animator>();
??}
??// Update is called once per frame
??void Update()
??{
????horizontal = Input.GetAxis("Horizontal");
????vertical = Input.GetAxis("Vertical");
??}
??private void FixedUpdate()
??{
????//將用戶輸入組裝成3d運(yùn)動(dòng)需要的三維矢量 - 主要用于表達(dá)移動(dòng)方向
????m_Movement.Set(horizontal, 0.0f, vertical);
????m_Movement.Normalize();
????//先判斷是否有橫向或者縱向移動(dòng)
????bool hasHorzontal = !Mathf.Approximately(horizontal, 0.0f);
????bool hasVertical = !Mathf.Approximately(vertical, 0.0f);
????//只要有一個(gè)方向移動(dòng),就認(rèn)為玩家角色處與移動(dòng)網(wǎng)狀態(tài)
????bool isWalking = hasHorzontal || hasVertical;
????//將變量傳遞給動(dòng)畫管理者
????m_Animator.SetBool("IsWalking", isWalking);
????//用三維矢量來表示轉(zhuǎn)向后的玩家角色的朝向
????Vector3 desiredForward = Vector3.RotateTowards(transform.forward, m_Movement, turnSpeed * Time.deltaTime, 0f);
????//設(shè)置四元數(shù)的值
????m_Rotation = Quaternion.LookRotation(desiredForward);
??}
??private void OnAnimatorMove()
??{
????//使用從用戶輸入獲取到的三維矢量作為移動(dòng)方向,使用動(dòng)畫中每次0.02秒移動(dòng)的距離作為移動(dòng)距離來移動(dòng)
????m_Rigibody.MovePosition(m_Rigibody.position + m_Movement * m_Animator.deltaPosition.magnitude);
????//執(zhí)行旋轉(zhuǎn),實(shí)現(xiàn)平滑旋轉(zhuǎn)
????m_Rigibody.MoveRotation(m_Rotation);
??}
}
個(gè)人遇到的理解難點(diǎn)解析(由GPT友情解答)
//將用戶輸入組裝成3d運(yùn)動(dòng)需要的三維矢量
m_Movement.Set(horizontal, 0.0f, vertical);
m_Movement.Normalize();
------解釋-----
矢量的組裝在這段代碼中涉及到了兩個(gè)步驟:設(shè)置矢量的值和標(biāo)準(zhǔn)化。
1.設(shè)置矢量的值
這里使用了 Set
方法來設(shè)置 m_Movement
這個(gè)三維矢量的值。三維矢量通常表示為
(x,y,z)。
horizontal
:表示水平方向的輸入,也就是在x軸上的移動(dòng)。0.0f
:表示在y軸上沒有移動(dòng),通常用于確保角色保持在地面上,不會(huì)上下浮動(dòng)。vertical
:表示垂直方向的輸入,也就是在z軸上的移動(dòng)。
通過這個(gè)設(shè)置,我們將用戶輸入的水平和垂直方向的移動(dòng)值組裝到一個(gè)三維矢量中。
2. 標(biāo)準(zhǔn)化矢量
csharp m_Movement.Normalize();
標(biāo)準(zhǔn)化是將矢量的長(zhǎng)度縮放為1的過程,同時(shí)保持矢量的方向不變。這樣做的目的是去除矢量的長(zhǎng)度信息,只保留方向信息。
例如,如果用戶同時(shí)按下了前進(jìn)和右轉(zhuǎn)鍵,那么 horizontal
和 vertical
的值可能都不為0。如果不進(jìn)行標(biāo)準(zhǔn)化,角色可能會(huì)沿著對(duì)角線移動(dòng)得比沿著純水平或純垂直方向移動(dòng)得更快。通過標(biāo)準(zhǔn)化,我們確保了角色沿任何方向的移動(dòng)速度都是一致的。
總結(jié)一下,這段代碼通過獲取用戶的水平和垂直輸入,并將其設(shè)置為三維矢量的x和z分量,然后進(jìn)行標(biāo)準(zhǔn)化,來組裝出一個(gè)表示玩家移動(dòng)方向的三維矢量。
-----總結(jié):m_Movement
這個(gè)三維矢量用來定義玩家角色的移動(dòng)方向。-----
難點(diǎn)2:Vector3 desiredForward = Vector3.RotateTowards(transform.forward, m_Movement, turnSpeed * Time.deltaTime, 0f);
------解答------
csharp Copy code Vector3 desiredForward = Vector3.RotateTowards(transform.forward, m_Movement, turnSpeed * Time.deltaTime, 0f);
方法解釋
Vector3.RotateTowards
是一個(gè)靜態(tài)方法,用于計(jì)算從一個(gè)方向旋轉(zhuǎn)到另一個(gè)方向的過程中的下一步方向。transform.forward
是玩家角色當(dāng)前的朝向方向(前方)。m_Movement
是玩家角色希望移動(dòng)的方向。turnSpeed * Time.deltaTime
是每幀允許的最大旋轉(zhuǎn)角度,單位為度。turnSpeed
是旋轉(zhuǎn)速度,而Time.deltaTime
是上一幀完成后到當(dāng)前幀的時(shí)間,這樣可以確保旋轉(zhuǎn)速度與幀率無關(guān)。0f
是旋轉(zhuǎn)的最大角速度。在這里設(shè)置為0,意味著沒有限制角速度。
代碼邏輯
- 確定目標(biāo)方向:
m_Movement
是我們希望玩家角色朝向的方向,由玩家的輸入控制。 - 獲取當(dāng)前方向:
transform.forward
是玩家角色當(dāng)前的朝向方向。 - 計(jì)算旋轉(zhuǎn)角度:
turnSpeed * Time.deltaTime
計(jì)算出每幀允許的最大旋轉(zhuǎn)角度,使旋轉(zhuǎn)過程平滑。 - 計(jì)算新方向:
Vector3.RotateTowards
方法根據(jù)上述信息計(jì)算出新的朝向方向。這個(gè)新方向是在朝向目標(biāo)方向的過程中的下一個(gè)步驟。
結(jié)果
desiredForward
存儲(chǔ)了計(jì)算出的新的朝向方向。- 該方向?qū)⒅饾u旋轉(zhuǎn)到與
m_Movement
相同的方向,但不會(huì)立即改變,從而實(shí)現(xiàn)了平滑的轉(zhuǎn)向效果。
總的來說,這行代碼用于計(jì)算玩家角色的旋轉(zhuǎn)方向,使角色能夠平滑地轉(zhuǎn)向并朝向正確的方向移動(dòng)。