2017-04-18 75 views
1

我在Unity中製作了2D牆,但我的角色可以穿過它。怎麼了?我的角色有Rigibody2D和BoxCollider2D,牆上有箱子對撞機。 代碼字符的運動:碰撞在2D中不起作用

Vector2 moveVec = new Vector2(CrossPlatformInputManager.GetAxis("Horizontal"),CrossPlatformInputManager.GetAxis("Vertical")); 
    moveVec = moveVec * moveForce; 
    transform.Translate (moveVec); 
+0

你的角色是否有BoxCollider2D(注意最後的2D)。你的牆也一樣。 –

+0

是的,它有BoxCollider2D – Sleeper

+0

嘗試使用rigidbody.MovePosition而不是transform.Translate。還要檢查碰撞蒙版和物體圖層 –

回答

2

我的性格有Rigibody2D和BoxCollider

如果使用Rigibody2D,還必須使用BoxCollider2DBoxCollider。確保牆壁也有BoxCollider2D

transform.Translatetransform.position用於移動對象時沒有發生碰撞。如果您的GameObject附帶有Rigidbody2D ,則必須將其移動到Rigidbody2D.velocity,Rigidbody2D.AddForceRigidbody2D.AddXXX)或Rigidbody2D.MovePosition

最好在FixedUpdate()函數中做這個特殊的事情。此外,我認爲應該使用GetAxisRaw而不是GetAxis,這樣玩家將立即停止鍵/手指被釋放。

public float speed = 2f; 
Rigidbody2D rg2d; 

void Start() 
{ 
    rg2d = GetComponent<Rigidbody2D>(); 
} 


void FixedUpdate() 
{ 
    float h = CrossPlatformInputManager.GetAxisRaw("Horizontal"); 
    float v = CrossPlatformInputManager.GetAxisRaw("Vertical"); 

    Vector2 tempVect = new Vector2(h, v); 
    tempVect = tempVect.normalized * speed * Time.fixedDeltaTime; 
    rg2d.MovePosition((Vector2)transform.position + tempVect); 
} 

如果速度太快/太慢,您可以隨時減小/增加速度。

+1

您應該使用Time.fixedDeltaTime; –

+0

@JuanBayonaBeriso沒錯。感謝您的高舉。 – Programmer

+0

謝謝。 update和fixedupdate有什麼區別? – Sleeper