我已经在某些游戏对象中循环以在发生某次碰撞之前设置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 if
而enabled
true
位于Log
false
,if
始终满足enabled
false
1}}永远不会满足。在检查员中,对于坏人来说,Box Collider2D总是不受限制。与badGuy的碰撞永远不会发生。基于我的简单场景代码,我认为它应该正常工作。
答案 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)
似乎您正在尝试启用/检测badGuys
和object2
之间的冲突,只有当object1
与附加此脚本的任何对象发生碰撞时(似乎是某种BadGuyManager) )。因此,我建议您不要将isTrigger
设置为true或false,而应尝试启用或禁用整个`Collider2D。