簡體   English   中英

基於方向的剛體2d等速

[英]rigidbody2d constant velocity based on direction

我目前有這個腳本(不要在代碼中讀太多,不是所有內容都粘貼在這里,只有理解問題所需的內容):

Touch[] touches = Input.touches;
Vector2 dir = (Camera.main.ScreenPointToRay (touches [i].position).GetPoint (0) - obj.getGameObject ().transform.position).normalized * speed;
obj.getGameObject ().GetComponent<Rigidbody2D> ().velocity = dir;

問題在於,剛體的速度基於從對象到觸摸點的距離而不同,因此,如果您觸摸到遠離游戲對象的點,則該速度將是接近游戲對象的點的2倍或更多。

我將如何解決這個問題,以便獲得不依賴於與游戲物體距離的恆定速度?

問題的核心在於以下方面:

Vector2 dir = (Camera.main.ScreenPointToRay (touches [i].position).GetPoint (0) - obj.getGameObject ().transform.position).normalized * speed;

方向向量由於強制轉換而歸一化

當您使用Camera.main.ScreenPointToRay (touches [i].position).GetPoint (0) - obj.getGameObject ().transform.position計算觸摸位置和對象位置之間的這種差異時,您必須記住該結果可能不是2D,而是Vector3 這意味着,如果GetPoint (0)transform.position結果不在z軸上的同一位置,則z值可能不為零。

規范化Vector3 ,其長度變為1,但Vector3是要考慮其z值。 當您將此值存儲在Vector2 dir ,該Vector3Vector2轉換為Vector2並且其z值將被丟棄。 這意味着先前歸一化向量的長度不再保證為1; 它可以在[0,1]范圍內的任何地方變化。

轉換向量的長度取決於z值的相對大小

如果將此新Vector2乘以speed然后用它來設置剛體的速度,則剛體速度的大小將介於0和speed之間,而不是始終為speed 如果您的觸摸距離越遠,對象移動得越快,而如果您的觸摸距離越近,對象移動得越慢的原因是,z值(將保持不變)相對於您的觸摸距離越遠的x和y值會變得越小。 這是說明這將如何影響Vector2

在此處輸入圖片說明

請注意,如果z值相對於其他值較小,則強制轉換歸一化Vector3會導致更長的Vector2 (該圖假定x = 0,以便於閱讀。)

解決方案

解決這個問題並不是太困難-只要z值變為0,無論是通過強制轉換還是通過顯式賦值,您都只需對向量進行歸一化。 然后,您的方向將保證為1的長度,並且速度將保持恆定。 這是一個例子:

Touch[] touches = Input.touches;
Vector3 dirRaw = Camera.main.ScreenPointToRay (touches [i].position).GetPoint (0) - obj.getGameObject ().transform.position;
dirRaw.z = 0;
Vector2 dir = dirRaw.normalized * speed;
obj.getGameObject ().GetComponent<Rigidbody2D> ().velocity = dir;

希望這可以幫助! 如果您有任何疑問,請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM