目录
前言
2022年十月份报名参加了Unity和Bilibili联合举办的NewbiesJam游戏开发挑战。在处理不同物体之间的碰撞逻辑时,由于自身知识浅薄,选择了使用Tag去判断触碰了哪一个物体,这就导致了随着物体类型的增加,不单是Tag,写在OnColliderEnter、OnColliderExit、OnColliderStay等等等等方法里面的语句也会越来越庞大臃肿,并且一旦物体的Tag没有进行标识,编写的碰撞逻辑就会失效。
在学习 《Unity3D 网络游戏实战(第2版)》这一本书时,Server在分发接收到的网络消息时,会根据消息的协议名,通过反射的方式从MsgHandler获取与协议名同名的方法,在自定义需要传入的object[]类型的参数列表parameters后,通过Invoke(null,parameters)的方式传入参数并且执行方法。
服务端
NetManager分发消息
public class NetManager
{
public static void ReadClient()
{
....
//假设收到的协议消息
MsgBase msg = new MsgMove();
//从MsgHandler获取和协议同名的方法
MethodInfo mi = typeof(MsgHandler).GetMethod(msg.protoName);
//定义需要传入的参数列表
object[] o = {state,msg}
//执行同名方法,并传入参数
mi?.Invoke(null,o)
....
}
}
MsgHandler消息处理
public partial class MsgHandler
{
public static void MsgMove(SocketState state,MsgBase msgBase)
{
//向下转型还原为MsgMove类型
MsgMove msg = (MsgMove)msgBase;
//通过msg的内容执行其他逻辑
........
}
}
启发
在检测物体之间的碰撞时,一般都是两个挂载有脚本的物体进行检测,那么是否可以在OnCollisionEnter方法中,一旦某个物体进入了Collider&