添加else语句时,OnCollisionEnter会中断

时间:2017-09-05 04:02:37

标签: c# windows unity3d unity5

为了创造游戏的基础知识,我在团结中创造了一个奇怪的问题,

此代码工作正常(在start()中将materialstate设置为0)并且对象本身确实更改了材质

void OnCollisionEnter(Collision col){
    if (col.gameObject.name == "Player" && Materialstate == 0) {
        renderComp.material = goal;
        Materialstate = 1;
    } 
}

然而,只要我添加一个else语句就会中断,就会发生冲突(我知道因为我已经在更新()中使用Materialstate的print语句检查了它但是这次甚至没有初始碰撞(在添加else之前工作正常)有效:

    void OnCollisionEnter(Collision col){
    if (col.gameObject.name == "Player" && Materialstate == 0) {
        renderComp.material = goal;
        Materialstate = 1;
    } else {
        if (col.gameObject.name == "Player") {
            renderComp.material = starting;
            Materialstate = 0;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

你能试试这个代码吗?

void OnCollisionEnter(Collision col) {
    if (col.gameObject.name == "Player") {
        if (Materialstate == 0) {
            renderComp.material = goal;
            Materialstate = 1;
            return;
        }
        renderComp.material = starting;
        Materialstate = 0;
    }
}

这删除了基本上检查col.GameObject.name == "Player"是否两次的其他内容。这实际上可能会加快您的游戏代码速度以及删除额外的检查。它还在原始条件下正确执行所需的操作(col.GameObject.name == "Player"true)。

编写时假设Materialstate只是01,但是,如果您计划拥有更多状态,那么切换声明可能是您制作时最好的选择这项工作按预期进行。

void OnCollisionEnter(Collision col) {
    if (col.gameObject.name == "Player") {
        switch (Materialstate)
        {
            case 0:
                renderComp.material = goal;
                Materialstate = 1;
                break;
            case 1:
                renderComp.material = starting;
                Materialstate = 0;
                break;
            default: 
                // Invalid Materialstate throw exception/error
        }
    }
}

我希望这有帮助!