在Game场景中,每个UI的UpdateFun
需要通过消息系统来更新。
首先先在Scripts——Module中新建Message文件夹
MessageSystem
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| using System.Collections.Generic;
public interface IMessageSystem { void AddListener(int key, IReceiver receiver); void RemoveListener(int key, IReceiver receiver); void DispatchMsg(int key, params object[] args);
void AddListener(string key, IReceiver receiver); void RemoveListener(string key, IReceiver receiver); void DispatchMsg(string key, params object[] args); }
public class MessageSystem : IMessageSystem { private readonly Dictionary<int, HashSet<IReceiver>> _intReceivers = new(); private readonly Dictionary<string, HashSet<IReceiver>> _stringReceivers = new(); public void AddListener(int key, IReceiver receiver) { if (!_intReceivers.ContainsKey(key)) { _intReceivers[key] = new HashSet<IReceiver>(); } _intReceivers[key].Add(receiver); } public void RemoveListener(int key, IReceiver receiver) { if (_intReceivers.ContainsKey(key)) { _intReceivers[key].Remove(receiver); } } public void DispatchMsg(int key,params object[] args) { foreach (var receiver in _intReceivers[key]) { receiver.ReceiveMessage(args); } }
public void AddListener(string key, IReceiver receiver) { if (!_stringReceivers.ContainsKey(key)) { _stringReceivers[key] = new HashSet<IReceiver>(); } _stringReceivers[key].Add(receiver); }
public void RemoveListener(string key, IReceiver receiver) { if (_stringReceivers.ContainsKey(key)) { _stringReceivers[key].Remove(receiver); } }
public void DispatchMsg(string key, params object[] args) { foreach (var receiver in _stringReceivers[key]) { receiver.ReceiveMessage(args); } } }
|
使用int作为key,性能相对更好。
使用string作为key备用,后面输入模块会用到。
IReceiver
1 2 3 4
| public interface IReceiver { void ReceiveMessage(params object[] args); }
|
MsgEvent
在Const文件夹内新建MsgEvent
,在里面定义各种Event常量,使用int作为key。
1 2 3 4 5
| public class MsgEvent { public const int EVENT_HP = 0; public const int EVENT_SCORE = 1; }
|
MessageMgr
在Manager文件夹中新建MessageMgr
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| public class MessageMgr : NormalSingleton<MessageMgr>, IMessageSystem { private MessageSystem _messageSystem; public MessageMgr() { _messageSystem = new MessageSystem(); } public void AddListener(int key, IReceiver receiver) { _messageSystem.AddListener(key, receiver); }
public void AddListener(string key, IReceiver receiver) { _messageSystem.AddListener(key, receiver); }
public void DispatchMsg(int key, params object[] args) { _messageSystem.DispatchMsg(key, args); }
public void DispatchMsg(string key, params object[] args) { _messageSystem.DispatchMsg(key, args); }
public void RemoveListener(int key, IReceiver receiver) { _messageSystem.RemoveListener(key, receiver); }
public void RemoveListener(string key, IReceiver receiver) { _messageSystem.RemoveListener(key, receiver); } }
|
GameUIView
修改GameUIView
,添加修改分数和星星的逻辑
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| [BindPrefab(Pathes.GAMEUI_VIEW,Consts.BIND_PREFAB_PRIORITY_VIEW)] public class GameUIView : ViewBase, IReceiver { public void ReceiveMessage(params object[] args) { UpdateScore(); UpdateStars(); }
protected override void InitChild() { UIUtil.Get("Life").AddCo<Life>(); UpdateScore(); UpdateStars(); } public override void Show() { base.Show(); MessageMgr.Instance.AddListener(MsgEvent.EVENT_SCORE, this); } public override void Hide() { base.Hide(); MessageMgr.Instance.RemoveListener(MsgEvent.EVENT_SCORE, this); } private void UpdateScore() { UIUtil.Get("Score").SetText(GameModel.Instance.Score); } private void UpdateStars() { UIUtil.Get("Star/Value").SetText(GameModel.Instance.Stars); } }
|