尝试将游戏对象分配给另一个脚本中的变量(Unity C#)

Trying to assign GameObject to variable in another script (Unity C#)

注意:游戏编码新手

我目前有我的游戏设置,当你按下一个按钮时,它会添加一个预制件,其中包括一个单位需要的所有特征(例如移动、健康等)。然而,预制件只是 parent,它需要附加一个 child。那child就是实际不同的单位。我试图在函数中同时调用团队和 child 预制件,但是 UI 按钮只允许一个参数。作为解决方法,我让按钮调用 GameManager 中的一个函数来实例化 parent 预制件。在 GameManager 函数中,它还将新创建的 GameObject 分配给在不同脚本中定义的变量。然后按钮调用第二个脚本并将child预制件添加到parent预制件(我还没有建立这个功能)。但是,当尝试将 parent GameObject 传递给第二个脚本时,出现此错误:

Assets\Scripts\GameManager.cs(27,9): error CS0120: An object reference is required for the non-static field, method, or property 'Spawn.parentObject'

这是 GameManager 函数的片段:

public void Spawner(Team team)
    {
        Vector3 Orientation;
        if(team.FacingLeft)
        {
            Orientation= new Vector3(-1,1,1);
        }
        else
        {
            Orientation= new Vector3(1,1,1);
        }

        var obj =Instantiate(UnitPrefab, new Vector3(team.SpawnPosition.x,team.SpawnPosition.y,0), Quaternion.identity);
        obj.transform.localScale = Orientation;
        gEntity = obj.GetComponent<Entity>();
        team.AddUnit(gEntity);
        Spawn.parentObject=obj;
    }

第二个脚本的片段:

public class Spawn : MonoBehaviour
{
    public GameObject parentObject;
    public void UnitChild(GameObject unit)
    {
        
    }
}

您收到此错误是因为您试图直接从 class 访问 Spawn.parentObject。但是 parentObject 不是静态的。您只能从 Spawn 的实例访问它。有 2 个选项可以解决此问题:

  • 您可以获得对 Spawn 实例的引用。例如你可以把

    public Spawn mySpawn; 到您的 GameManager 中。然后,在 UnityEditor 中,您可以将附加了 Spawn 脚本的对象拖到 GameManager 上名为 mySpawn 的插槽中。 现在您可以像这样访问 Spawn 的实例:
    mySpawn.parentObject = obj;

  • 或者您可以使 Spawn 或至少 Spawn.parentObject 静态。
    这意味着,您不会有 Spawn 的实例。您将能够直接访问 Spawn.parentObject。为此,您可以将 Spawn.parentObject 的声明更改为:

     public static GameObject parentObject;
    

    现在您可以像现在一样访问 Spawn。 在这种情况下,您可能还希望 Spawn.UnitChild() 是静态的,以便您也可以轻松访问它。

要决定要使用这些修补程序中的哪一个,您需要考虑您希望 Spawn 成为什么:

您想在 UnityScene 中有多个 Spawn 并稍后动态访问它们吗?或者您只是想让 Spawn 成为一个小助手 class,您可以在任何地方轻松使用?

很难解释 static 和非 static 之间的区别,但也许这有助于您理解它:https://www.techopedia.com/definition/4913/static-c#

如果你想在你的场景中有一个 Spawn 的实例,你也可以查看单例:https://gamedevbeginner.com/singletons-in-unity-the-right-way/ 它们基本上是一种轻松确保 class 仅存在一个实例并允许您全局访问该单个实例的方法。