using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; using System; using System.Collections.Generic; namespace ET { namespace EventType { public struct NumbericChange { public Entity Parent; public NumericType NumericType; public float Old; public float New; } } public class NumericComponentAwakeSystem : AwakeSystem { public override void Awake(NumericComponent self) { self.Awake(); } } public class NumericComponentDestroySystem : DestroySystem { public override void Destroy(NumericComponent self) { self.NumericDic.Clear(); } } public class NumericComponent : Entity, ISerializeToEntity { [BsonRepresentation(BsonType.Double, AllowTruncation = true)] [MongoDB.Bson.Serialization.Attributes.BsonDictionaryOptions(MongoDB.Bson.Serialization.Options.DictionaryRepresentation.ArrayOfDocuments)] public Dictionary NumericDic = new Dictionary(); public void Awake() { // 这里初始化base值 } public float Get(NumericType numericType) { return GetByKey((int)numericType); } public float Get(int numericType) { return GetByKey(numericType); } #if UNITY public int GetAsInt(NumericType numericType) { return UnityEngine.Mathf.RoundToInt(GetByKey((int)numericType)); } #endif #if SERVER || ROBOT public int GetAsInt(NumericType numericType) { return MathHelper.RoundToInt(GetByKey((int)numericType)); } public int GetAsInt(int numericType) { return MathHelper.RoundToInt(GetByKey(numericType)); } public long GetAsLong(int numericType) { return MathHelper.RoundToLong(GetByKey(numericType)); } public long GetAsLong(NumericType numericType) { return MathHelper.RoundToLong(GetByKey((int)numericType)); } #endif public void Set(NumericType nt, float value, bool canMulti = true) { this[nt, canMulti] = value; } public void AddSet(NumericType nt, float value, bool canMulti = true) { if (value == 0) return; this[nt, canMulti] += value; } public void ReduceSet(NumericType nt, float value, bool canMulti = true) { if (value == 0) return; this[nt, canMulti] -= value; } private float this[NumericType numericType, bool isCanMultiSet] { get { return this.GetByKey((int)numericType); } set { float v = this.GetByKey((int)numericType); if (Math.Abs(v - value) < 0.00001f) { return; } NumericDic[(int)numericType] = value; Update(numericType, v, isCanMultiSet); } } private float GetByKey(int key) { this.NumericDic.TryGetValue(key, out float value); return value; } private void Update(NumericType numericType, float old, bool isCanMultiSet) { int final = (int)numericType; float result = this.GetByKey(final); //如果不是直接操作最终值,需要发送两次事件,一次是修改的值,一次是最终值 if (numericType > NumericType.Max) { final = (int)numericType / 10; int bas = final * 10 + 1; int add = final * 10 + 2; //取得最终值,由基础xxx+额外xxx值组成 result = this.GetByKey(bas) + GetByKey(add); //更新最终值 Set((NumericType)final, result, false); old = GetByKey(final); } //将改变的值以事件的形式发送出去 if (isCanMultiSet) Game.EventSystem.Publish(new EventType.NumbericChange() { Parent = this.Parent, NumericType = (NumericType)final, Old = old, New = result }).Coroutine(); } public void ReSetAddNum() { List removeList = new List(); foreach (var kv in NumericDic) { if (kv.Key > (int)NumericType.Max) { int final = kv.Key / 10; int add = final * 10 + 2; if (GetByKey(add) != 0) removeList.Add(add); } } foreach (int key in removeList) { Set((NumericType)key, 0, true); } } } }