如何在没有复制粘贴代码的情况下从可脚本编写的对象中获取数据

时间:2019-01-19 06:18:54

标签: c# unity3d design-patterns

我正在尝试在Unity3d中创建项目系统。系统依靠将项目另存为预制件和可编写脚本的对象。

每当我想从Item可写脚本的对象中加载数据时,都必须创建Use C#脚本并将其附加到GameObject。这样做会迫使我复制和粘贴与“项目可编写脚本的对象”中的字段相同的字段。

这是一个问题,因为每当我使用新字段更新Item Scriptable对象时,都必须确保使用相同的字段更新Item C#脚本。

我尝试研究一种设计模式,该模式可以解决必须将字段复制和粘贴到两个脚本文件中但还没有发现任何问题的问题。我已经研究过使用JSON文件替换可脚本编写的对象,但是由于可编写脚本的对象内置于Unity中,所以我宁愿使用它代替JSON。

public class ItemBase : MonoBehaviour
{
        [SerializeField] private string itemID;
        [SerializeField] private string itemName;
        [SerializeField] private string itemFlavorText;
        [SerializeField] private float itemLevel;
        [SerializeField] private Sprite itemSprite;

        #region Getters and Setters
        public string ItemID { get => itemID; set => itemID = value; }
        public string ItemName { get => itemName; set => itemName = value; }
        public string ItemFlavorText { get => itemFlavorText; set => itemFlavorText = value; }
        public float ItemLevel { get => itemLevel; set => itemLevel = value; }
        public Sprite ItemSprite { get => itemSprite; set => itemSprite = value; }
        #endregion

        /// <summary>
        /// Obtains references from the ItemSO on the ItemPrefab class.
        /// </summary>
        [ContextMenu("Add References")]
        public void AddReferences()
        {
            ItemSO item = gameObject.GetComponent<ItemPrefab>().Item;

            ItemID = item.ItemBase.ItemID;
            ItemName = item.ItemBase.ItemName;
            ItemFlavorText = item.ItemBase.ItemFlavorText;
            ItemLevel = item.ItemBase.ItemLevel;
            ItemSprite = item.ItemBase.ItemSprite;
        }
}


    [System.Serializable]
    public class ItemBaseSO
    {
        [SerializeField] private string itemID;
        [SerializeField] private string itemName;
        [SerializeField] private string itemFlavorText;
        [SerializeField] private float itemLevel;
        [SerializeField] private Sprite itemSprite;

        #region Getters and Setters
        public string ItemID { get => itemID; set => itemID = value; }
        public string ItemName { get => itemName; set => itemName = value; }
        public string ItemFlavorText { get => itemFlavorText; set => itemFlavorText = value; }
        public float ItemLevel { get => itemLevel; set => itemLevel = value; }
        public Sprite ItemSprite { get => itemSprite; set => itemSprite = value; }
        #endregion
    }

我将ItemBase脚本放置在Item Prefab上,并将ItemBaseSO保留在Resources文件夹中,以便于加载。

我希望能够继续使用可编写脚本的对象,而不必复制和粘贴字段。

0 个答案:

没有答案