【问题标题】:Returning a Boolean and accessing that information返回布尔值并访问该信息
【发布时间】:2016-01-07 23:32:55
【问题描述】:

我正在编写一个小程序。我有一些我希望从另一个脚本访问的小表达式。问题是当我在检查器中获得返回时(这是正确的),另一个脚本无法识别它。根据我的研究,似乎 void 不是函数的正确返回类型,我需要别的东西。

另外,由于我在检查器中得到了正确的返回,我认为值得一提的是,我在尝试在无法识别布尔值的脚本上玩游戏时收到了 Null Ref 错误

我将包含我正在使用的代码。我使用的 Unity 版本是 5.2.1f1,64 位。另外,我使用了 Awake 和 Start。两者都没有工作。因为我认为这并不重要,但我想我会试一试。

感谢您的帮助。

public class nonButtonStuff : MonoBehaviour
{

public float timer;
public float tipPercent;
public float checkAmount;

private Seated seated;
private dessert Dessert;
private drinks Drinks;
private food Food;
private appetisers Appetisers;
private checkedUpon checkedOn;



// Use this for initialization
void Awake()
{
    tipPercent = .2f;
    checkAmount = 0;
    seated = GetComponent<Seated>();
    Dessert = GetComponent<dessert>();
    Drinks = GetComponent<drinks>();
    Food = GetComponent<food>();
    Appetisers = GetComponent<appetisers>();
    checkedOn = GetComponent<checkedUpon>();
}

void Update()
{
          if(seated.isSeated == true  && Drinks.drinksOrdered == true || Drinks.drinksOrdered != false && seated.isSeated == false)
            {
                timer += Time.deltaTime * 1;
            }

          if(Dessert.Dessert==true)
            {
                timer = 0;
            }
            if (checkedOn.checkedOn > 0)
            {
               Debug.Log(checkedOn);
            }

    }
}

~~~~~~~~~~~~~

public class Seated : MonoBehaviour
{

    public bool isSeated = false;

    public void clicked()
    {

        isSeated = true;
        Debug.Log("Was clicked.");
        return;
    }
}

为清楚地了解 clicked() 进行了编辑:

我使用内置的 UI 编辑器为就座添加了一个按钮。因此,没有硬编码按钮。但是,当我“播放”并单击按钮时,它给了我正确的布尔值。但是,nonButtonStuff 无法将“isSeated”识别为 == true。

【问题讨论】:

  • 您遇到的问题究竟是什么。如果它是一个方法,那么该方法实现了一个接口(@98​​7654324@ 等),然后返回值不能改变
  • 确切的问题是 nonButtonStuff.cs 没有认识到在 Seated.cs 中编码的 isSeated bool 发生了变化。
  • @Tim 当我用 "seated=GetComponent();" 调用它时,我以为我已经这样做了
  • Awake() 方法何时调用?您确定当时存在Seated 组件吗?您获得NullReferenceException 的声明表明seated 变量仅被初始化为null 值,因此当然在您的Update() 方法中,当您尝试访问它时会抛出NullReferenceException
  • 不幸的是,没有可靠地重现问题的a good, minimal, complete code example,或者至少没有比上述更完整的示例(很难提供完整的 Unity3d 示例),如果不是不可能的话,任何人都将很难确定问题所在。

标签: c# unity3d boolean


【解决方案1】:

我认为您的问题与 isSeated 无关。我认为问题在于这一行的逻辑:

if(seated.isSeated == true  && Drinks.drinksOrdered == true || Drinks.drinksOrdered != false && seated.isSeated == false)

您实质上是在说“如果 isSeated 和 DrinksOrdered 或点了饮料但没有就座。如果点了饮料,则无论 isSeated 的状态如何,这将始终返回 true。

还有关于风格的说明。在 C# 中,您不需要像您正在做的那样使用“==”来比较布尔值。这个:

if(myBoolean){}

代码相同
if(myBoolean == true){}

大多数人喜欢编写更简单的代码,以减少逻辑错误的风险。因此,您的代码可以重写为

if(seated.isSeated  && Drinks.drinksOrdered || Drinks.drinksOrdered && !seated.isSeated)

自从

if(seated.isSeated || !seated.isSeated)

总是返回 true,你可以删除这些值。剩下的就是

if(Drinks.drinksOrdered || Drings.drinksOrdered)

这可以简化为

if(Drinks.drinksOrdered)

这与原始代码的逻辑完全相同:

if(seated.isSeated == true  && Drinks.drinksOrdered == true || Drinks.drinksOrdered != false && seated.isSeated == false)

这更清楚了。

【讨论】:

  • 在对这个实例的逻辑进行了相当多的故障排除后,我确实注意到,因为我对我的代码并不严格,所以我设置了它,以便就座和饮料必须返回一个 true。所以,为了更容易,我只是做了: seated.isSeated == true && Drinks.drinksOrdered == false || Drinks.drinksOrdered == true && seated.isSeated == false 作为计时器启动器。后来,我意识到我想要同时运行多个计时器。所以,我只是为我想要的一切添加了一个计时器。
  • 您可以将“seated.isSeated == true && Drinks.drinksOrdered == false || Drinks.drinksOrdered == true && seated.isSeated == false”减少为“seated.isSeated != 饮料。饮料订购”
【解决方案2】:

如果您收到空引用异常,这很可能意味着您的座位变量(在 Awake 函数中设置)未设置为任何值,因此对 GetComponent 的调用未能找到游戏对象的单一行为.如果您的 Seated Monobehavior 和 nonButtonStuff Monobehavior 不存在于同一个 GameObject 上,则会发生这种情况,因此请确保它们存在。

【讨论】:

  • 这清除了 NullRef 错误。棒极了。我很感激。我使用两个不同的对象来容纳这些代码。非常感谢你,Kith。
  • 没问题!很高兴为您提供帮助
猜你喜欢
  • 1970-01-01
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
  • 2013-08-18
  • 2013-06-03
  • 2015-05-03
  • 1970-01-01
  • 2011-12-14
相关资源
最近更新 更多