即使被告知要返回,其他声明仍然有效

时间:2016-07-22 17:02:36

标签: c# if-statement unity5

我不太清楚为什么,但我无法让这个脚本表现出来。我有一个if语句后跟一个else语句,嵌套在另一个带有自己的else语句的if语句中,并且因为脚本的方式,else语句是触发的,无论我做什么。我已经尝试退出该功能,但它不起作用。我有下面的两个版本的脚本,一个版本使用switch语句,一个版本只使用if / else语句。它们具有一系列相同的功能。

我想要的是,如果cost + memorybar.Value大于100,它会告诉用户,然后关闭切换开关,然后退出该功能。发生了什么,它关闭了切换,然后运行else语句,即使在switch语句中也是如此。现在,切换以某种方式反向运行。我见过类似的问题,但即使是return语句也无法解决这个问题。

cost = 50;
    switch (power5.isOn) {
    case true:
        if (cost + memorybar.value > 100) {
            error.text = "Exeeds maximum memory";
            power5.isOn = false;
            break;
        } else {
            memorybar.value = memorybar.value + cost;
            break;
        }
    case false:
        memorybar.value = memorybar.value + cost;
        break;
    }



    if (power5.isOn == true) {
        if (cost + memorybar.value > 100) {
            error.text = "Exeeds maximum memory";
            power5.isOn = false;
            return;
        } else
            memorybar.value = memorybar.value + cost;
        return;
    }
    else
        memorybar.value = memorybar.value - cost;

4 个答案:

答案 0 :(得分:1)

您的开关在power5.isOn上触发,并将其设置为false将导致第二个开关案例也评估为true。使用标准的if语句实现它,它将起作用。

cost = 50;
if (power5.isOn)
{
    if (cost + memorybar.value > 100)
    {
        error.text = "Exeeds maximum memory";
        power5.isOn = false;  
    }
    else
    {
        memorybar.value = memorybar.value + cost;

    }
}
else
{
    memorybar.value = memorybar.value + cost;
}

答案 1 :(得分:1)

不需要return语句,请使用此代码。

if (power5.isOn)
{
     if (cost + memorybar.value > 100)
     {
           error.text = "Exeeds maximum memory";
           power5.isOn = false;
     }
     else
     {
           memorybar.value = memorybar.value + cost;
     }
}
else
{
      memorybar.value = memorybar.value - cost;
}

答案 2 :(得分:0)

对于第一个例子

switch (power5.isOn) {
case true:
    if (cost + memorybar.value > 100) {
        error.text = "Exeeds maximum memory";
        power5.isOn = false;
        break;
    } else {
        memorybar.value = memorybar.value + cost;
        break;
    }
case false:
    memorybar.value = memorybar.value + cost;
    break;
}

我已尝试过但未能按如下方式重现您的问题:

bool powered = true;
int cost = 50;
int memorybar = 96;
switch (powered)
{
    case true:
        if (cost + memorybar > 100)
        {
            Console.WriteLine("entered A");
            powered = false;
            break;
        }
        else
        {
            Console.WriteLine("entered B");
            memorybar = memorybar + cost;
            break;
        }
    case false:
        Console.WriteLine("entered C");
        memorybar = memorybar + cost;
        break;
}
Console.ReadLine();

这打印“输入A”而没有别的。

除非您可以创建一个自包含的示例,否则您似乎更有可能将自己与程序中的其余逻辑混淆。您是否有可能实际调用此代码两次,这是您的问题?通过在输入开关之前输入Debug.Log消息并查看它是否打印两次来确保不是这种情况。

如果没有可重复的例子,我的帮助远不止于此。

答案 3 :(得分:0)

根据您的描述,您似乎在Update()或其他连续调用中运行此代码,发生的情况是,一旦关闭电源,代码仍然在每个周期调用ad。

你应该做的是另一个标志,说明是否应该调用此代码。

e.g。

OnTriggerEnter(Collider other) {
    if (other.Tag == "powerTrigger") {
       updatePower = true;
    }
}

Update(){
    if(updatePower){
        if (power5.isOn){
            if (cost + memorybar.value > 100){
                error.text = "Exeeds maximum memory";
                power5.isOn = false;
            } else{
                memorybar.value = memorybar.value + cost;
            }
        } else{
            memorybar.value = memorybar.value - cost;
            if(memorybar.cost <= 0){
                memomrybar.cost = 0;
                updatePower = false;
            }
        }
    }
}