【问题标题】:Reference script class to GameObject in UnityUnity中GameObject的引用脚本类
【发布时间】:2019-10-19 08:50:13
【问题描述】:

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

我无法通过谷歌搜索找到我想要的东西,我也很难描述我的意思。

建筑类:

[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;
    }
}

这是我创建对象的 Game 类。我希望创建的对象在 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();
}

我想将 Game 对象中创建的对象连接/引用到相应的 GameObjects。如果我在层次结构中创建了城堡游戏对象,我想要游戏对象中城堡对象的属性。如果有其他更好或更简单的方法,请告诉我,我是 Unity 新手。

【问题讨论】:

    标签: c# unity3d gameobject


    【解决方案1】:

    使用Prefabs

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

    【讨论】:

    • 感谢您提供链接以进一步清除它。我现在明白了。
    【解决方案2】:

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

    public class BuildingObject : MonoBehavior
    

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

    如果我理解正确的话,Game 类是场景中某个 GameObject 上的组件。因此,您可以将这些建筑物(场景中的 GameObjects)拖放到 Game 类中的变量(对 BuildingObject 的引用),而不是在代码中创建这些 BuildingObjects。

    如果您需要在 Game 类(或任何其他)中动态创建新建筑物,则需要在该类中创建对 BuildingObject 预制件的引用(并将您的建筑物预制件拖放到 Game 类中的此引用) :

    public BuildingObject buildingPrefab;
    

    然后您就可以像这样在 Game 类中动态创建更多新建筑(带有建筑组件(脚本)的游戏对象):

    BuildingObject newBuilding = Instantiate(buildingPrefab);
    

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

    【讨论】:

    • 谢谢,这正是我需要的。
    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多