Unity3d OnCollisionCenter不工作:

Unity3d OnCollisionCenter不工作:,unity3d,unityscript,Unity3d,Unityscript,请大家帮忙,我是Unity和programming的新手: 我有一个两个弹跳球,标记为BouncingBall1和BouncingBall2,我想在子弹击中两个球时销毁,如果时间没有超过displaySecond,您已经销毁了您赢得的球,但我的问题是OnCollisionCenter不工作。wining部分不起作用,其余部分不起作用,下面是我的代码片段 function OnCollisionEnter(col.collision) { if ((displaySecond < 3

请大家帮忙,我是Unity和programming的新手: 我有一个两个弹跳球,标记为BouncingBall1和BouncingBall2,我想在子弹击中两个球时销毁,如果时间没有超过displaySecond,您已经销毁了您赢得的球,但我的问题是OnCollisionCenter不工作。wining部分不起作用,其余部分不起作用,下面是我的代码片段

function OnCollisionEnter(col.collision) {
    if ((displaySecond < 30) && (
            col.gameObject.tag ==
            BouncingBall1 == null &&
            col.gameObject.tag ==
            BouncingBall1 == null)) {
        print("You have won");
    }
}
函数OnCollisionEnter(col.collision){
如果((显示秒<30)和(
col.gameObject.tag==
BouncingBall1==null&&
col.gameObject.tag==
BouncingBall1==null){
打印(“你赢了”);
}
}
我认为问题在于你检查物体是否被破坏的方式。这不是做这件事的方法。另外,您正在检查两行相同的代码是否相同。因此,如果显示秒数小于30,则该值将始终返回true

试着把它改成

if ( (displaySecond < 30) && 
(col.gameObject.tag == "BouncingBall1") ) { 
Debug.Log("You have won!") 
}
if((显示秒<30)和
(col.gameObject.tag==“BouncingBall1”){
Log(“你赢了!”)
}

听起来你想记录每个球是否被摧毁,当两个球都被摧毁时显示“你赢了”。此代码有点粗糙,但应实现以下目标:

var ball1Destroyed = false;
var ball2Destroyed = false;

...

function OnCollisionEnter(col : Collision) {
    if (col.gameObject.tag == "BouncingBall1") {
        ball1Destroyed = true;
    }
    if (col.gameObject.tag == "BouncingBall2") {
        ball2Destroyed = true;
    }
    if (displaySecond < 30 && ball1Destroyed && ball2Destroyed) {
        Debug.Log("You have won");
    }
}
var ball1Destroyed=false;
var ball2Destroyed=假;
...
函数onCollisionCenter(列:碰撞){
如果(col.gameObject.tag==“BouncingBall1”){
ball1Destroyed=true;
}
如果(col.gameObject.tag==“BouncingBall2”){
ball2Destroyed=true;
}
如果(显示秒数<30&&ball1Destroyed&&ball2Destroyed){
Log(“你赢了”);
}
}

这段代码假设只有子弹和球之间的碰撞(不是一个球和另一个球之间的碰撞),这可以通过

你说它不工作是什么意思?函数一开始没有被调用,还是函数内部的代码有错误?您可以添加一个
Debug.Log()
语句来测试这个.col.gameObject.tag==BouncingBall1==null嗯,不。这里有问题。这个测试毫无意义。只需执行col.gameObject.tag==BouncingBall1来检查标记是否为BouncingBall1;如果我出现dump,我只是想看看BouncingBall1和BouncingBall2是否已被销毁,这就是为什么我将其设置为null。我已经删除了空值,请参阅下面的代码,但是如果我单击“播放”,即使我没有销毁弹跳球,控制台也会立即显示Debug.log()结果:请查看我在函数onCollisionCenter(col:Collision)下的新代码{if(col.gameObject.tag==“BouncingBall1”&&col.gameObject.tag==“BouncingBall1”){Debug.Log(“Collision”);}}您观察到了冲突。但这不是销毁函数。如果您想删除对象调用Thank Baris,是的,我们确实调用了销毁(gameObject)函数,但响应是说它说你赢了,而我不想说。下面的Adam H非常有帮助,他/她是我的英雄感谢RoseHardt;当我输入你的代码时,只有(显示秒<30)起作用,它显示“你赢了”当displaySecond是,你不能在一个if语句中这样做。你现在如何编写它,子弹必须同时击中ball1和ball2。你可以尝试使用两个布尔ball1hit和ball2hit,以及三个if语句,一个检查球一是否击中,并将第一个布尔值设置为true。另一个检查球二是否击中,并将其设置为true将该布尔值设置为true。然后,如果布尔值1和布尔值2为true,则打印您已赢的结果。感谢Adam H,是的,假设碰撞仅发生在子弹和两个球之间,我已尝试了您的代码,但即使球未被销毁且显示秒数<30仍显示“您赢了”,我不知道我在这里出错了。我稍微更改了代码,以使win条件更清楚。我建议您将
Debug.Log
语句放在
if
块中,以便您可以看到球何时被销毁。或者更好的是,连接调试器并在函数中放置断点,以便您可以看到它何时被销毁打
var ball1Destroyed = false;
var ball2Destroyed = false;

...

function OnCollisionEnter(col : Collision) {
    if (col.gameObject.tag == "BouncingBall1") {
        ball1Destroyed = true;
    }
    if (col.gameObject.tag == "BouncingBall2") {
        ball2Destroyed = true;
    }
    if (displaySecond < 30 && ball1Destroyed && ball2Destroyed) {
        Debug.Log("You have won");
    }
}