通过枚举值实现赋值、取值、触发时间

public class PropertySet<N, T> where N : struct ,IConvertible  //基类
                               where T : IComparable
{
    protected T[] mValues;
    protected Action<T>[] mActions;

    public PropertySet(N maxCount)
    {
        int count = ToIndex(maxCount);
        mValues = new T[count];
        mActions = new Action<T>[count];
    }

    public void AddChanageEvent(N key, Action<T> handler) 
    {
        mActions[ToIndex(key)] += handler;
    }

    public void RemoveChangeEvent(N key, Action<T> handler)
    {
        mActions[ToIndex(key)] -= handler;
    }

    public virtual int ToIndex(N key)
    {
        return key.ToInt32(null); //12bytes GC Alloc
    }

    public virtual T this[N key]
    {
        get
        {
            return mValues[ToIndex(key)];
        }
        set
        {
            int index = ToIndex(key);
            if (value.CompareTo(mValues[index]) != 0)
            {
                mValues[index] = value;
                if (mActions[index] != null)
                {
                    mActions[index](value);
                }
            }

        }
    }
}

public class PlayerPropertySet : PropertySet<EPlayerProperty, float>
{
    public PlayerPropertySet() : base(EPlayerProperty.Max)
	{
		mCryptoValues = new FloatCryptoWrapper[(int)EPlayerProperty.Max];
		for (int i = 0; i < mCryptoValues.Length; i++)
		{
			mCryptoValues[i] = new FloatCryptoWrapper(0.0f);
		}
	}

    public override int ToIndex(EPlayerProperty key)
    {
        return (int)key;
    }

    public override float this[EPlayerProperty key]
    {
        get
        {
            return mCryptoValues[ToIndex(key)].Value;
        }
        set
        {
            int index = ToIndex(key);
			if ((mCryptoValues[ToIndex(key)].Value) != value)
            {
				mCryptoValues[ToIndex(key)].Value = value;
                if (mActions[index] != null)
                {
                    mActions[index](value);//触发时间,括号为传递参数值
                }
            }

        }
    }

    protected FloatCryptoWrapper[] mCryptoValues;
}


用法

//注册事件,并使用
PlayerPropertySet PropertySet;
Player.PropertySet.AddChanageEvent(EPlayerProperty.Health, OnHealthChange);

void OnHealthChange(float newValue)
{
	 //写处理逻辑
}

赋值、取值
float test = PropertySet[EPlayerProperty.Health];
PropertySet[EPlayerProperty.Health] = 1f;




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值