尝试将游戏对象分配给另一个脚本中的变量(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 仅存在一个实例并允许您全局访问该单个实例的方法。
注意:游戏编码新手
我目前有我的游戏设置,当你按下一个按钮时,它会添加一个预制件,其中包括一个单位需要的所有特征(例如移动、健康等)。然而,预制件只是 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 仅存在一个实例并允许您全局访问该单个实例的方法。