下面是一个简单的例子,演示了如何使用ScriptableObject和Unity的事件系统来实现逻辑和UI的分离:

csharp
Copy code
// 数据模型
[CreateAssetMenu(fileName = "New Item", menuName = "Inventory/Item")]
public class ItemData : ScriptableObject
{
    public int itemId;
    public string itemName;
    // 其他属性...
}

// 逻辑代码
public class InventoryManager : MonoBehaviour
{
    public UnityEvent onItemAdded = new UnityEvent();
    public List<ItemData> inventory = new List<ItemData>();

    public void AddItem(ItemData item)
    {
        inventory.Add(item);
        onItemAdded.Invoke();
    }
}

// UI代码
public class InventoryUI : MonoBehaviour
{
    public Text itemNameText;
    public InventoryManager inventoryManager;

    private void Start()
    {
        inventoryManager.onItemAdded.AddListener(UpdateUI);
    }

    private void UpdateUI()
    {
        // 更新UI元素,例如显示物品名称
        if (inventoryManager.inventory.Count > 0)
        {
            itemNameText.text = inventoryManager.inventory[inventoryManager.inventory.Count - 1].itemName;
        }
    }
}

  

在这个例子中,ItemData表示物品的数据模型,InventoryManager负责处理背包逻辑,而InventoryUI负责处理与UI相关的逻辑。通过使用Unity的事件系统,我们可以在物品添加到背包时通知UI进行更新,实现了逻辑和UI的分离。