代码之家  ›  专栏  ›  技术社区  ›  HumanlyRespectable

将画布中的gameobject设置为网络播放器预设

  •  -1
  • HumanlyRespectable  · 技术社区  · 6 年前

    我的项目使用网络管理器加载播放器预设。我有一个游戏对象(一堆文本和一个面板)作为画布的孩子。画布不是预设,也不是玩家预设的子对象。

    我在player preab下有一个脚本,试图获取gameobject的activeself,但是我不能在player preab下设置gameobject(除非gameobject是preab),或者使用代码“finditwithatag”。

        if (Input.GetKey(KeyCode.Return) && PlayerStatMenuTimer>=1 && GameObject.FindGameObjectWithTag("PlayerStatsMenu").activeSelf==false)
            {
             //code here
            }
    

    上面的代码(在玩家预设脚本函数“update”下)找不到我的游戏对象“playerstatsmenu”。它总是给我一个错误,说:

    “nullreferenceexception:对象引用未设置为对象playercontroller.update()的实例(位于assets/evermore/playercontroller.cs:104)”

    我做错什么了?还有别的办法吗?

    2 回复  |  直到 6 年前
        1
  •  0
  •   Thomas Hilbert    6 年前

    GameObject.FindWithTag GameObject.FindGameObjectsWithTag 查找具有特定 标签 . 标记是一个与游戏对象名称分开的属性。如果您将gameobject的tag属性设置为正确的值(例如通过编辑器),那么您应该能够找到它。

    另外:这两种方法都只能找到活动的游戏对象。你不能通过标签找到不活跃的游戏对象,所以条件 GameObject.FindWithTag("PlayerStatsMenu").activeSelf == false 从定义上讲永远不可能是真的。

    也许最好的方法是让被标记的对象一直处于活动状态,让它有一个子对象,然后您可以根据需要激活和停用它。

        2
  •  0
  •   Eliasar    6 年前

    您正在使用 GameObject.FindGameObjectWithTag 而不是 GameObject.Find .

    编辑:也是 GameObject.FindGameObjectsWithTag . 当没有发现反对意见时,返回一个空数组。如果没有索引器,您将无法访问数组,因此我确信您应该在代码中或在您的问题中对函数的拼写进行双重检查。