当isTrigger为真而不是通过时,碰撞对象反弹

时间:2016-04-19 22:16:03

标签: unity3d unity5

我已经在某些游戏对象中循环以在发生某次碰撞之前设置isTrigger属性但是虽然该属性是真的,但仍然会发生与对象的碰撞。请参阅以下相关代码:

    void OnCollisionEnter2D(Collision2D col)    {

    if (col.gameObject.tag == "object1") {
         for (int i = 0; i < badGuys.Count; i++)    {
         badGuys[i].getBadGuyGameObject().GetComponent<Collider2D>().isTrigger = true;
      }

      }

    else if (col.gameObject.tag == "object2") {

       // collision with object1 always occurs before object2, though isTrigger is true the colliding object doesn't pass through the badGuys game objects, it bounces off on collision
      }
   else if (col.gameObject.tag == "object3") {
      for (int i = 0; i < badGuys.Count; i++)   {
         badGuys[i].getBadGuyGameObject().GetComponent<Collider2D>().isTrigger = false;
      }
      }
    else if (col.gameObject.tag == "badGuy") {

      }

}

与object1的碰撞总是发生在object2之前,尽管isTrigger为true,碰撞对象不会通过badGuys游戏对象,它会在碰撞时反弹。我该如何解决这个问题?

更新1

我刚刚意识到检查员中的isTrigger值是真或假,具体取决于我停止游戏的时间。例如,如果我在Object1碰撞后停止游戏,isTrigger为真,当我在与object3碰撞后停止游戏时,它就是假的。这种不一致使得调试非常麻烦。这是一个错误还是什么?

更新2

根据Joe Blow和Agustin0987的推荐,我使用enabled的{​​{1}}属性而不是Collider2D。我还删除了isTrigger中的几乎所有代码以获得简单的测试场景。请参阅以下代码:

OnCollisionEnter2D

而不是循环这次,我决定测试一个。尽管void OnCollisionEnter2D(Collision2D col) { if (col.gameObject.tag == "object1") { if (badGuys[4].getBadGuyGameObject().GetComponent<Collider2D>().enabled = false) { badGuys[4].getBadGuyGameObject().GetComponent<Collider2D>().enabled = true; Debug.Log ("CHANGED TO TRUE"); Debug.Log ("bad guy collider enabled is " + badGuys[4].getBadGuyGameObject().GetComponent<Collider2D>().enabled); } else if (badGuys[4].getBadGuyGameObject().GetComponent<Collider2D>().enabled = true) { badGuys[4].getBadGuyGameObject().GetComponent<Collider2D>().enabled = false; Debug.Log ("CHANGED TO FALSE"); Debug.Log ("bad guy collider enabled is " + badGuys[4].getBadGuyGameObject().GetComponent<Collider2D>().enabled); } } else if (col.gameObject.tag == "badGuy") { Debug.Log("collided with bad guy"); // DOESN'T OCCUR } } 打印else ifenabled true位于Log falseif始终满足enabled false 1}}永远不会满足。在检查员中,对于坏人来说,Box Collider2D总是不受限制。与badGuy的碰撞永远不会发生。基于我的简单场景代码,我认为它应该正常工作。

2 个答案:

答案 0 :(得分:2)

永远不会

我的意思是绝对从不

使用&#34;否则,如果&#34;。

简单地说,从来没有 - 永远 - 键入&#34;否则,如果&#34;在你的余生中,直到你死去。

在第一个实例中,删除所有代码并将其替换为:

void OnCollisionEnter2D(Collision2D col)
{
Debug.Log("We will deal with this ......... " +col.gameObject.name);
if (col.gameObject.tag == "object1")
    {
    Debug.Log("\t handling 'object' type issue");
    HandleObjectIssue(col)
    return; //NOTE HERE
    }
if (col.gameObject.tag == "object1")
    {
    Debug.Log("\t handling 'bad guy' type issue");
    HandleBadGuyIssue(col)
    return; //NOTE HERE
    }
}

private void HandleObjectIssue(Collision2D col)
{
Debug.Log("'\t\t object', I'm dealing with this .. " +col.gameObject.name);
}


private void HandleBadGuyIssue(Collision2D col)
{
Debug.Log("\t\t 'badguy', I'm dealing with this .. " +col.gameObject.name);
}

广泛运行&#34;单元测试&#34;它。如果您愿意,可以将(使用该代码)转换回&#34;循环&#34;查看所有项目的方法。无论如何,要进行广泛的测试。

-

其次,添加此例程..

private void ToggleColliderOnGameObject( GameObject gg )
{
Debug.Log("I'm supposed to toggle the collider on: " +gg.name);
Collider2D { or whatever } col = gg.GetComponent<Collider2D>();
bool currentState = GetComponent<Collider2D>().enabled;

Debug.Log("\t it is currently: " +currentState);

bool newState = ! currentState;
col.enabled = newState;

Debug.Log("\t\t but now it is: " +newState);
}

...并开始使用它进行单元测试。所以你将拥有如下代码:

 ToggleColliderOnGameObject( badGuys[4].getBadGuyGameObject() );

例如,尝试这样的事情:

void Start()
    {
    InvokeRepeating("teste", 1f, 1f);
    }
private void Teste()
    {
    ToggleColliderOnGameObject( badGuys[4].getBadGuyGameObject() );
    }

经过一段时间的实验和单元测试后,您将能够继续前进。

请注意,除了其他问题之外,很可能(例如)您的例程&#34; getBadGuyGameObject&#34;正在回复错误的东西 - 或类似的问题。

修改

badGuy = badGuyPrefab;功能中移除 public void createBadGuy(GameObject badGuyPrefab, BadGuyType badGuyType, Vector3 badGuyPosition)。这是您评论中链接的程序员代码中的错误。

答案 1 :(得分:1)

似乎您正在尝试启用/检测badGuysobject2之间的冲突,只有当object1与附加此脚本的任何对象发生碰撞时(似乎是某种BadGuyManager) )。因此,我建议您不要将isTrigger设置为true或false,而应尝试启用或禁用整个`Collider2D。

P.S:我同意Joe Blow的意见,你应该解释一下你想要达到的目标。