Unity 中 GameObject 的参考脚本 class

Reference script class to GameObject in Unity

我有一个 class 建筑,我想将它连接到建筑的游戏对象。在class中,我有属性:名称、级别、信息。我拥有建筑物的资产(例如农场、城堡、港口)。我有一个游戏 class,我在其中创建对象。游戏class是用来存放物品的,所以在整个游戏过程中都可以调用它们,这样游戏就可以这样保存和加载了。

我真的谷歌找不到我想要的东西,我也很难描述我的意思。

建筑物class:

[System.Serializable]
public class BuildingObject
{
    public string name;
    public int level;
    public string information;

    public BuildingObject(string information)
    {
        this.name = "";
        this.level = 0;
        this.information = information;
    }
}

这是我创建对象的游戏 class。我希望在 GameObject 中引用创建的对象,这样我就可以通过在其他文件中使用它们来调用某些游戏对象的属性,并保持某些游戏对象的关卡进度。

public static Game current;

public BuildingObject church;
public BuildingObject castle;
public BuildingObject fort;
public BuildingObject farm;
public BuildingObject pub;
public BuildingObject houses;

public PlayerObject player;

public StoryObject story;

public Game()
{
    church = new BuildingObject("Informatie over de kerk");
    castle = new BuildingObject("Informatie over het kasteel");
    fort = new BuildingObject("Informatie over het fort");
    farm = new BuildingObject("Informatie over de boerderij");
    pub = new BuildingObject("Informatie over de kroeg");
    houses = new BuildingObject("Informatie over de huizen");

    player = new PlayerObject();

    story = new StoryObject();
}

我想connect/reference根据GameObjects在Game对象中创建的对象。如果我在层次结构中创建了一个城堡游戏对象,我需要游戏对象内部的城堡对象的属性。如果有其他更好或更简单的方法,请告诉我,我是 unity 的新手。

使用Prefabs

您可以存储要在层次结构中创建的 gameObjects 的模板。您需要将脚本附加为 Component,可以通过调用 GameObject.GetComponent<BuildingObject>()

来引用它

据我了解,您需要从 MonoBehavior 继承构建对象:

public class BuildingObject : MonoBehavior

然后创建一个空的游戏对象(预制件)并将此 BuildingObject 组件添加到其中。 然后你可以在场景中添加尽可能多的建筑物(那些带有 BuildingObject 组件的预制件)并配置它们的参数。

如果我没理解错的话,class 游戏是场景中某些游戏对象的组件。因此,您可以将这些建筑物(场景中的 GameObjects)拖放到游戏中的变量(对 BuildingObject 的引用)class,而不是在代码中创建这些 BuildingObjects。

如果您需要在游戏 class(或任何其他游戏)中动态创建新建筑,您需要在 class 中创建对 BuildingObject 预制件的引用(并拖放您的在游戏中根据此参考构建预制件 class):

public BuildingObject buildingPrefab;

然后您将能够在游戏中动态创建更多新建筑(带有建筑组件(脚本)的游戏对象)class,如下所示:

BuildingObject newBuilding = Instantiate(buildingPrefab);

这会将新建筑作为新游戏对象添加到场景中。然后对这些建筑做任何你想做的事情:)

您应该使用 ScriptableObjects 而不是预制件。

ScriptableObjects 是由 Unity 序列化的资产,可以在播放模式下编辑并部署到构建中。

它们提供了 MonoBehaviour 的所有优点,但它们没有任何更新流(Update、FixedUpdate、LateUpdate 和任何实时 GamePlay 方法)并且不必在场景中实例化为 GameObject。

对比:https://docs.unity3d.com/Manual/class-ScriptableObject.html