2016-08-15 154 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

当您在游戏开发中处理关键性能代码时,请尝试通过减少计算来编写优化且高效的代码。重复代码在这里没什么大不了的。 –

相关问题