在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);
}
}