(055)Raywenderlich: ScriptableObject 教程

下载

Scriptable Object Tutorial-Starter

创建 ScriptableObject

  1. Scripts 目录下,创建 SwordData 脚本。

    using UnityEngine;
    
    [CreateAssetMenu(fileName = "New SwordData", menuName = "Sword Data", order = 51)]
    public class SwordData : ScriptableObject
    {
        [SerializeField] private string swordName;
        [SerializeField] private string description;
        [SerializeField] private Sprite icon;
        [SerializeField] private int goldCost;
        [SerializeField] private int attackDamage;
    
        public string SwordName
        {
            get => swordName;
            set => swordName = value;
        }
    
        public string Description
        {
            get => description;
            set => description = value;
        }
    
        public Sprite Icon
        {
            get => icon;
            set => icon = value;
        }
    
        public int GoldCost
        {
            get => goldCost;
            set => goldCost = value;
        }
    
        public int AttackDamage
        {
            get => attackDamage;
            set => attackDamage = value;
        }
    }
    
    

CreateAssetMenu 的分级菜单的分割线是 50, 上面的 order = 51, 为二级菜单。
在这里插入图片描述

增加数据

  1. 新建目录 Scripts - Scriptable Objects - Sword Data。在新建的目录下面,点击 Assets - Create - Sword Data 分别创建:
    在这里插入图片描述
    分别点击上面7个新建的对象,在 Inspector 面板修改右边的描述属性。

使用 ScriptableObject

  1. 修改 Scritps - Sword.cs 文件:
    using System;
    using UnityEngine;
    
    public class Sword : MonoBehaviour
    {
        [SerializeField] private SwordData swordData;
    
        private void OnMouseDown()
        {
            Debug.Log(swordData.SwordName);
            Debug.Log(swordData.Description);
            Debug.Log(swordData.Icon.name);
            Debug.Log(swordData.GoldCost);
            Debug.Log(swordData.GoldCost);
            Debug.Log(swordData.AttackDamage);
        }
    }
    
  2. 1_Longsword 挂载脚本:
    在这里插入图片描述

基于 ScriptableObjects 的事件

添加事件脚本

  1. Scripts 目录下新建, GameEvent.csGameEventListener.cs 脚本。
    GameEvent.cs
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    [CreateAssetMenu(fileName = "New Game Event", menuName = "Game Event", order = 52)]
    public class GameEvent : ScriptableObject
    {
    	 private List<GameEventListener> _listeners = new List<GameEventListener>();
    	
    	 public void Raise()
    	 {
    	     for (int i = _listeners.Count - 1; i >= 0; i--)
    	     {
    	         _listeners[i].OnEventRaised();
    	     }
    	 }
    	
    	 public void RegisterListener(GameEventListener listener)
    	 {    
    	     _listeners.Add(listener);
    	 }
    	
    	 public void UnRegisterListener(GameEventListener listener)
    	 {
    	     _listeners.Remove(listener);
    	 }
    }
    
    GameEventListener.cs
    using UnityEngine;
    using UnityEngine.Events;
    
    public class GameEventListener : MonoBehaviour
    {
        [SerializeField] private GameEvent _gameEvent;
        [SerializeField] private UnityEvent response;
    
        private void OnEnable()
        {
            _gameEvent.RegisterListener(this);
        }
    
        private void OnDisable()
        {
            _gameEvent.UnRegisterListener(this);
        }
    
        public void OnEventRaised()
        {
            response.Invoke();
        }
    }
    
  2. 点击 Assets - Create - Game Event 分别新建:
    在这里插入图片描述
  3. 修改 Sword.cs 脚本:
    在这里插入图片描述
  4. 修改 1_Longsword 的属性:
    在这里插入图片描述

事件和UI

  1. Scripts 添加脚本 SwordMerchant.cs 脚本。

    using UnityEngine;
    using UnityEngine.UI;
    
    namespace RW.Scripts
    {
        public class SwordMerchant: MonoBehaviour
        {
            [SerializeField] private Text swordName;
            [SerializeField] private Text description;
            [SerializeField] private Image icon;
            [SerializeField] private Text goldCost;
            [SerializeField] private Text attackDamage;
        }
        
    	public void UpdateDisplayUI(SwordData swordData)
    	{
    		swordName.text = swordData.SwordName;
    	    description.text = swordData.Description;
    	    icon.sprite = swordData.Icon;
    	    goldCost.text = swordData.GoldCost.ToString();
    	    attackDamage.text = swordData.AttackDamage.ToString();
    	}
    }
    
  2. 将脚本挂载到 SwordMerchantCanvas , 并且关联上面字段和预制。
    在这里插入图片描述

  3. SwordMerchantCanvas 上添加事件关联
    在这里插入图片描述

    上面以 Longsword 为例,需要重复执行同级的6个的预制操作。

  4. 运行
    在这里插入图片描述

[1] ScriptableObject Tutorial: Getting Started

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值