最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

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

2023-08-23 07:28 作者:一只輯硝  | 我要投稿

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)鍵,那么 horizontalvertical 的值可能都不為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,意味著沒有限制角速度。

代碼邏輯

  1. 確定目標(biāo)方向:m_Movement 是我們希望玩家角色朝向的方向,由玩家的輸入控制。
  2. 獲取當(dāng)前方向:transform.forward 是玩家角色當(dāng)前的朝向方向。
  3. 計(jì)算旋轉(zhuǎn)角度:turnSpeed * Time.deltaTime 計(jì)算出每幀允許的最大旋轉(zhuǎn)角度,使旋轉(zhuǎn)過程平滑。
  4. 計(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)。

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

分享到微博請(qǐng)遵守國家法律
修文县| 洞头县| 长汀县| 西乌| 东乌珠穆沁旗| 海淀区| 吴忠市| 武川县| 牡丹江市| 鄂伦春自治旗| 仁化县| 平江县| 隆子县| 富蕴县| 高邑县| 峡江县| 资中县| 廉江市| 灵川县| 安陆市| 深泽县| 桂阳县| 政和县| 亳州市| 梅河口市| 榆社县| 平遥县| 马公市| 皮山县| 墨竹工卡县| 元朗区| 余姚市| 普定县| 昌吉市| 罗定市| 秦安县| 岳阳市| 海门市| 迁西县| 嵊泗县| 田阳县|