2016-08-15 65 views
0

我有兩個函數,一個是OnCollisionEnter2D,一個是OnTriggerEnter2D。我需要Collision2D轉換爲Collider2D反之亦然:Unity - 將Collider2D轉換爲Collision2D

// c# script 
void OnCollisionEnter2D(Collision2D collision) { 
    foo(collision); 
} 

void OnTriggerEnter2D(Collider2D collider) { 
    foo(collider); 
} 

void foo(Collision2D coll){ 
    //checking inside here 
} 

當然,這是不會編譯,因爲我給foo的對撞機,對撞機並沒有一個Collision2D。 I have noticed that these two data types are almost the same。我不能投這兩個。有人可以幫助我轉換或建議一種解決方法嗎?

在此先感謝!

編輯:

這是我的檢查代碼...

int coins; 

void Start(){ 
    coins = 0; 
} 

void foo(Collision2D coll){ 
    if(coll.gameObject.tag == "coin"){ 
     coins++; 
    } 
//this works for both Collision2D and Collider2D because both have the gameObject property 

} 

回答

1

你可以使用一個通用的梅索德

void OnCollisionEnter2D(Collision2D collision) 
{ 
    foo<Collision2D>(collision); 
} 

void OnTriggerEnter2D(Collider2D collider) 
{ 
    foo<Collider2D>(collider); 
} 


public void foo<T>(T c) 
{ 
    GameObject g; 

    if (typeof(T) == typeof(Collider2D)) 
    { 
     Collider2D obj = (Collider2D)(object)c; 
     g = obj.gameObject; 
    } 
    else { 
     Collision2D obj = (Collision2D)(object)c; 
     g = obj.gameObject; 
    } 

    Debug.Log(g.tag); 

    if (g.tag == "coin") 
    { 

    } 
} 
1

只需添加一個重載方法爲foo()這樣的:

// c# script 
void OnCollisionEnter2D(Collision2D collision) { 
    foo(collision); 
} 

void OnTriggerEnter2D(Collider2D collider) { 
    foo(collider); 
} 

void foo(Collision2D coll){ 
    //checking inside here 
} 


void foo(Collider2D coll){ 

} 
+0

謝謝!這真是太棒了...有沒有一種方法可以做到這一點,而不必在兩個重載之間複製和粘貼代碼?那麼, – yummypasta

+1

。 TBH碰撞組件只能表現爲觸發器或碰撞器。因此,爲一個碰撞組件註冊'OnCollisionEnter()'和'OnTriggerEnter()'是沒有用的。如果你真的告訴我你正在嘗試做什麼,我可以提供更多的幫助,所以請發佈'foo()'的實現。 –

+0

當您在遊戲開發中處理關鍵性能代碼時,請嘗試通過減少計算來編寫優化且高效的代碼。重複代碼在這裏沒什麼大不了的。 –

相關問題