本代码架构一个由四篇代码组成,用于单机小游戏的开发
首先是Message脚本 用于消息的存放,代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Message
{
//类型
public byte Type;
//命令
public int Command;
//参数
public object Content;
public Message()
{
}
public Message(byte type,int command,object content)
{
Type = type;
Command = command;
Content = content;
}
}
//消息类型
public class MessageType
{
public static byte Type_Audio = 1;
public static byte Type_UI = 2;
public static int Audio_playSound = 100;
public static int Audio_PlayMusic = 101;
public static int Audio_StopMusic = 102;
public static int Audio_ChangeVolume = 103;
public static int UI_ShowPanel = 200;
//增加分数
public static int UI_AddScore = 201;
public static int UI_ShowShop = 202;
}
然后是MonoBase脚本 用于用于控制组件发送消息,代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MonoBase : MonoBehaviour
{
//发送消息
public void SendCustomMessage(Message msg)
{
MessageCenter.SendMessage(msg);
}
public void SendCustomMessage(byte type,int command,object content)
{
MessageCenter.SendMessage(type ,command,content);
}
//接收消息
public virtual void ReceiveMessage(Message message)
{
}
}
然后是 消息中心,用于接收monobase传来的消息,并且向下发给管理层脚本,代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MessageCenter
{
//管理类集合
public static List<MonoBase> Managers = new List<MonoBase>();
//发送消息
public static void SendMessage(Message msg)
{
foreach (MonoBase mb in Managers)
{
mb.ReceiveMessage(msg);
}
}
public static void SendMessage(byte type,int command,object content)
{
Message msg = new Message(type ,command,content);
SendMessage(msg);
}
}
然后再是管理层用于接收MassageCenter传下的消息和向monobase 发送消息,代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ManagerBase<T> : MonoBase where T :MonoBase
{
public static T Instance;
//管理的消息接收者
public List<MonoBase> ReceiveList = new List<MonoBase>();
//当前管理类接收的消息类型
protected byte messageType;
protected virtual void Awake()
{
Instance = this as T;
//设置消息类型
messageType = SetMessageType();
//将当前的管理类添加到消息中心列表中
MessageCenter.Managers.Add(this);
}
//必须实现,返回当前管理类的类型
protected virtual byte SetMessageType()
{
return MessageType.Type_UI;
}
//注册消息监听
public void RegisterReceiver(MonoBase mb)
{
if (!ReceiveList.Contains(mb))
{
ReceiveList.Add(mb);
}
}
//接收到了消息,并向下分发消息
public override void ReceiveMessage(Message message)
{
base.ReceiveMessage(message);
//如果接收的消息类型不匹配,则不向下分发消息
if (message.Type != messageType)
{
return;
}
foreach (MonoBase mb in ReceiveList)
{
mb.ReceiveMessage(message);
}
}
}
下面是对于代码的实际使用:
ScoreControl :这个脚本的大概意思就是 接收UIManager中发出的消息,然后判断是不是自己要接收的,如果是就获得message中Content的内容。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class ScoreControl :MonoBase{
public Text text;
private int score = 0;
void Start() {
//将当前类注册到UI管理类中,接收消息
UIManager.Instance.RegisterReceiver(this);
}
public override void ReceiveMessage(Message message)
{
base.ReceiveMessage(message);
if (message.Command== MessageType.UI_AddScore)
{
//添加分数
int add = (int)message.Content;
score += add;
text.text = score + "";
}
}
}
然后就是上面提到的UIManager脚本了,这个脚本的大概作用就是接收MessageCenter发出的消息
给予判断是不是自己管辖的Monobase的,代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class UIManager : ManagerBase<UIManager>
{
//设定接收的消息类型
protected override byte SetMessageType()
{
return MessageType.Type_UI;
}
}
然后就是要触发的脚本,这里大概意思就是,当玩家碰到金币时,就发送个消息让相关UI来执行,代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CoinControl :MonoBase
{
private void OnTriggerEnter(Collider other)
{
if (other.tag =="Player")
{
//加分
SendCustomMessage(MessageType.Type_UI,MessageType.UI_AddScore,1);
Destroy(gameObject );
}
}
}
最后配上一副结构图,来方便理解:
好了,就写到这了!