【问题标题】:Bool not returning true in IF statement C# UnityBool 在 IF 语句 C# Unity 中不返回 true
【发布时间】:2017-01-28 21:15:01
【问题描述】:
GameObject ZombieCard1, ZombieCard2, ZombieCard3, ZombieCard4, ZombieCard5;
int randomnumberpicker;
public static bool leftChoice, rightChoice;
void Start()
{

    statusBars = FindObjectOfType<StatusBars>();
}


void Update()
{
    ZombieCards();

}

void ZombieCards()
{
    if (GameObject.FindWithTag("Card") == null)
    { 
     randomnumberpicker = Random.Range(1, 5);
     Debug.Log(randomnumberpicker);
     if(randomnumberpicker == 1)
        {
           ZombieCard1 = Instantiate(Resources.Load("Frontcard1")) as GameObject;
           ZombieCard1.transform.Translate(0, -1, 0);
            if (leftChoice == true)
            {
                Debug.Log("Jesus Marty! you fixed it! Great Scott!");
            }
        }
     else if(randomnumberpicker == 2)
        {
            ZombieCard2 = Instantiate(Resources.Load("Frontcard2")) as GameObject;
            ZombieCard2.transform.Translate(0, -1, 0);
        }
     else if (randomnumberpicker == 3)
        {
            ZombieCard3 = Instantiate(Resources.Load("Frontcard3")) as GameObject;
            ZombieCard3.transform.Translate(0, -1, 0);
        }
     else if (randomnumberpicker == 4)
        {
            ZombieCard4 = Instantiate(Resources.Load("Frontcard4")) as GameObject;
            ZombieCard4.transform.Translate(0, -1, 0);
        }
     else if (randomnumberpicker == 5)
        {
            ZombieCard5 = Instantiate(Resources.Load("Frontcard5")) as GameObject;
            ZombieCard5.transform.Translate(0, -1, 0);
        }
    }
}
 void OnMouseDown()
    {
        if (gameObject.CompareTag("LeftArrow"))
        {
            leftChoice = true;
            Debug.Log("Left arrow is working");
            return;
        }
        if (gameObject.CompareTag("RightArrow"))
        {
            rightChoice = true;
            Debug.Log("Right arrow is working");
            return;
        }
    }
}

我早些时候发布了这个,但由于缺乏清晰性(就我而言),我无法弄清楚为什么这个 if 语句

if (leftChoice == true)
        {
            Debug.Log("Jesus Marty! you fixed it! Great Scott!");
        }

没有执行,bool 在 mousedown 时被设置为 true 对吗?

任何帮助将不胜感激

【问题讨论】:

  • 你可以很确定,如果leftChoicetrue,你会输入整个if块...
  • 在你有机会触发OnMouseDown()之前不会调用ZombieCards(),导致它实例化一张卡片(我认为这会创建一个带有标签“卡片”的对象)并导致它再也不会在ZombieCards() 中输入最初的 if 语句了吗?请描述您希望发生的事件顺序,因为我认为您的代码中可能存在逻辑错误。
  • 只是好奇。您在何时何地将这些全局静态变量设置回 false?
  • @Serlite 我希望 bool 触发创建的对象内的事件,如您所说,用 Card 标记。我该怎么办?我理解我的逻辑中的缺陷,但最好的工作是什么。
  • @MatíasFidemraizer 你为什么这么说?

标签: c# if-statement unity3d boolean instantiation


【解决方案1】:

编辑:正如某些人在 cmets 中指出的那样,可能是(并且可能是)在 OnMouseDown() 之前调用 Update() 的情况。我将假设没有其他函数调用这些函数,因此可能值得从您的 OnMouseDown() 事件中调用 ZombieCards()。这样你就可以确定事件的顺序是正确的。 (结束编辑)

您在课堂上将 LeftChoice 和 RightChoice 设置为 public 而不是 private 有什么原因吗?这通常意味着类之外的东西可能正在访问它。鉴于您使用的是 Update(),我假设您从 MonoBehaviour 继承,这意味着您将此脚本作为组件附加到另一个 GameObject。这意味着在这里拥有私有 _leftChoice 和私有 _rightChoice 可能是更好的选择。

另一件事可能会有所帮助 - Random.Range(lowInt, hightInt) 将返回(包括)lowInt 和(highInt - 1)之间的随机 int,因此在您的代码中它永远不会选择 5。我相信意图是从索引 0 开始并执行以下操作:

    private const bool NumChoices = 5;
    ...
    int randomNumberPicker = Random.Range(0, NumChoices);
    switch (randomNumberPicker)
    {
        case 0:
            ZombieCard1 = Instantiate(Resources.Load("Frontcard1")) as GameObject;
            ZombieCard1.transform.Translate(0, -1, 0);
            if (leftChoice == true)
            {
                Debug.Log("Jesus Marty! you fixed it! Great Scott!");
            }
            break;
        ...
    }

当然,你也可以只做 Random.Range(1, 6)

希望这会有所帮助!

【讨论】:

  • 感谢您的帮助!我很感激,我会尝试一个开关。
猜你喜欢
  • 2016-02-12
  • 2013-07-22
  • 2016-01-04
  • 2015-12-16
  • 2016-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-17
相关资源
最近更新 更多