【问题标题】:activeSelf return true and gameobject is falseactiveSelf 返回 true 并且 gameobject 为 false
【发布时间】:2017-06-22 19:00:19
【问题描述】:

所以我有一个名为menuView 的游戏对象。我创建了toogleGameobject 的脚本,它很简单——检查它是否是selfActive,如果它被设置为假,如果它是假的,那么将它设置为真。问题是由于某种原因它不起作用。然后在该函数中我设置Debug.Log(selfActive) 并在我的控制台中返回它是真的但我的游戏对象是假的。

这是图片:

我通过按钮调用脚本,脚本需要参数gameObject,所以我通过检查器分配它。

public void toogleGameObject(GameObject gameobject)
{
    Debug.Log(gameobject + " " + gameObject.activeSelf);

    //In image above this down was under comment, so only Debug.Log was caled with function
    if(gameObject.activeSelf == true)
    {
        gameObject.SetActive(false);
    }
    else
    {
        gameObject.SetActive(true);
    }
}

这里我分配并调用gameobject:

【问题讨论】:

  • 如果您需要一些帮助,您将不得不提供更多代码。我们将需要用于切换游戏对象和您已附加到按钮的侦听器的代码。也许,Debug.Log 已被放置在 您切换游戏对象状态之前。
  • @Hellium 我编辑了它。我还注意到,在上面的图片中,这个 down 被注释掉了,所以只有 Debug.Log 被函数调用了
  • 重要的是,您从哪里调用toogleGameObject 以及如何将MenuView 引用到它?你也可以分享这个代码吗?

标签: c# unity3d unity5


【解决方案1】:

请注意如何命名变量。有一个从MonoBehaviourComponent 继承的局部变量,名为“gameObject”。

您使用 gameObject 来引用此脚本所附加到的游戏对象。

脚本附加到的那个 GameObject 是你当前打开/ff 不是传递给 toogleGameObject 函数的那个​​。

传递给 toogleGameObject 函数的 GameObject 命名为 gameobject 而不是 gameObjectO 没有大写。

public void toogleGameObject(GameObject gameobject)
{
    Debug.Log(gameobject + " " + gameobject.activeSelf);

    //In image above this down was under comment, so only Debug.Log was caled with function
    if(gameobject.activeSelf == true)
    {
        gameobject.SetActive(false);
    }
    else
    {
        gameobject.SetActive(true);
    }
}

您还可以将其简化为:

public void toogleGameObject(GameObject gameobject)
{
    Debug.Log(gameobject + " " + gameobject.activeSelf);
    gameobject.SetActive(!gameobject.activeSelf);
}

最后,我建议你将参数变量GameObject gameobject重命名为GameObject objToToggle,这样你以后就不会再犯这个错误了。

public void toogleGameObject(GameObject objToToggle)
{
    Debug.Log(objToToggle + " " + objToToggle.activeSelf);
    objToToggle.SetActive(!objToToggle.activeSelf);
}

【讨论】:

  • 这不是真的。即使您对“gameObject”的命名是正确的,因为基类还有一个名为 gameObject 的变量,这段代码也不会调用它。它总是在最近的范围内调用变量。在这段代码中,它不是基类的变量。它是函数的参数。您甚至可以在日志中看到这一点。将打印的游戏对象记录为 MenuView。
  • @Cenkisabi : 检查 Debug.Log : gameobject + " " + gameObject.activeSelf 你看到第一个有一个小写的o (引用参数),而另一个大写的O (引用游戏对象脚本附在)
  • @Cenkisabi 我认为你不明白我的回答。我建议你在匆忙投反对票之前再读一遍。 toogleGameObject 函数旨在对作为参数传递给它的 GameObject(gameobject 变量) 进行操作,但 OP 的原始代码正在修改脚本附加到的 GameObject,因为 OP 使用的是 gameObject 而不是 @987654339 @ 在那个函数中。基本上,该函数参数现在没用了,因为如果您将任何 GameObject 传递给它,它就不会被使用,该函数将无法在该 GameObject 上工作,而是在
  • 脚本附加到的游戏对象。它打印“MenuView”游戏对象的原因很可能是因为脚本附加到该游戏对象,所以gameObject 指的是那个。 我太累了,无法争论,但请花点时间阅读 OP 的代码,然后仔细阅读我留下的答案。
  • 谢谢大家。我将参数重命名为go,它现在正在工作。 @程序员谢谢:)
【解决方案2】:

正如我所料,您调用Debug.Log 切换您的游戏对象,因此,Debug.Log 会告诉您游戏对象的相反状态(因为您在之后立即更改其状态)。 p>

public void toogleGameObject(GameObject gameobject)
{
    //Debug.Log("Before toggle : " + gameobject + " " + gameobject.activeSelf);

    gameobject.SetActive(!gameobject.activeSelf);

    Debug.Log("After toggle : " + gameobject + " " + gameobject.activeSelf);
}

【讨论】:

  • 在我的场景开始时,我禁用了该对象,并将函数设置为仅 debug.log 行(不更改 setactive)并在图像上显示结果。在 Hierarchy 中,您可以看到它被禁用,但调试日志显示它处于活动状态
  • 那我猜@Programmer 的回答不错,你把变量的名字弄乱了(gameobject != gameObject
猜你喜欢
  • 1970-01-01
  • 2015-06-22
  • 2019-08-30
  • 2020-04-19
  • 1970-01-01
  • 2015-10-03
  • 2013-09-18
  • 1970-01-01
  • 2017-07-29
相关资源
最近更新 更多