我正在嘗試做平滑的平面運動,跟隨游標移動。
這是這樣的代碼:
void Update()
{
Vector3 mousePos = Input.mousePosition;
mousePos.z = 0;
Vector3 objectPos = Camera.main.WorldToScreenPoint(transform.position);
mousePos.x = mousePos.x - objectPos.x。
mousePos.y = mousePos.y - objectPos.y。
float angle = Mathf.Atan2(mousePos.y, mousePos.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(new Vector3(0, 0, angle rotationOffset)) 。
Vector3 targetPos = Camera.main.ScreenToWorldPoint(Input.mousePosition)。
targetPos.z = 0;
transform.position = Vector3.MoveTowards(transform.position, targetPos, speed * Time.deltaTime)。
if (transform.position == targetPos)
{
死亡()。
}
}
public void OnCollisionEnter2D(Collision2D col)。
{
Debug.Log("hit")。
這個方法本身運作良好,但我遇到了一個問題,它不能檢測到碰撞。我以前從未在運動中使用過Vector3.MoveTowards,但我猜想這就是問題所在。如果有人有任何建議,我將非常感激。
uj5u.com熱心網友回復:
關于Armin的評論,transform.position==targetPos幾乎不會回傳true。這只是因為浮點的大量精度和浮點比較的內在問題。
一個簡單的解決方案是檢查距離是否在某個delta之內。出于性能的考慮,我建議使用距離的平方量級。例子:
const float squareCollisionDistance =4f; //實際的碰撞距離將是2。
var offsetVector = targetPos-transform.position;
var squareDistance = offsetVector.sqrMagnitude;
if ( squareDistance < squareCollisionDistance)
{
Die()。
其他可以研究的是RigidBodies,我想他們有一個碰撞事件,你可以監聽。碰撞檢測可能是非常棘手的事情,當你能使用Unity的內置功能時是值得的。
uj5u.com熱心網友回復:
我假設你正在使用if (transform.position == targetPos)來檢查物體是否發生碰撞,或者彼此靠近。問題是,這些向量只有在非常非常罕見的情況下才會真正相等,因為內部的值會變成小數。
你可以嘗試用Vector3.Distance來代替它,比如
float collisionDistance = 0.1f; //這里你可以微調它們碰撞的距離。
if (Vector3.Distance(transform.position, targetPos) < collisionDistance)
{
Die(); //喜歡這個函式的名字。
}
下面的碰撞函式沒有錯誤
public void OnCollisionEnter2D(Collision2D col)
{
Debug.Log("hit")。
所以我認為你的問題可能是這些物件沒有一個剛體。至少有一個物件必須有一個剛體,這個函式才能啟動。就像我提到的,或者你可以讓它們都成為觸發器。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/312434.html
標籤:
上一篇:API網關能否指向網路服務(SOAP),或者說能否在微服務中使用SOAP,讓API網關指向它?
下一篇:多詞別名(Ubuntu)
