客户端开发
- 新建U3D项目
- 在Assets目录下创建 Plugins, 把 Photon3Unity3D.dll 复制进来
- 在Assets目录下创建 Protocol文件夹,把协议工程生成的所有文件复制进来
- 创建PhotonEngine.cs ,挂到 启动场景的 空游戏物体上 ;
using ExitGames.Client.Photon;
using UnityEngine;
public class PhotonEngine : MonoBehaviour, IPhotonPeerListener
{
#region 单例
public static PhotonEngine Instance;
private void Awake()
{
if (Instance == null)
{
Instance = this;
DontDestroyOnLoad(this.gameObject);
}
else if (Instance != null)
{
Destroy(this.gameObject);
return;
}
}
#endregion
private static PhotonPeer peer = null; //处理和服务器的连接
public static PhotonPeer Peer
{
get
{
return peer;
}
}
public static string userName;
private void Start()
{
peer = new PhotonPeer(this, ConnectionProtocol.Udp);
peer.Connect("47.110.145.175:5055", "WingServer");
}
private void Update()
{
peer.Service(); //任何时候都要调用
}
private void OnDestroy()
{
if (peer != null && peer.PeerState == PeerStateValue.Connected)
{
peer.Disconnect();
}
}
#region IPhotonPeerListener接口
public void DebugReturn(DebugLevel level, string message)
{
}
//处理服务器向客户端推送消息
public void OnEvent(EventData eventData)
{
throw new System.NotImplementedException();
}
//处理服务器响应客户端的消息
public void OnOperationResponse(OperationResponse operationResponse)
{
}
//连接状态改变
public void OnStatusChanged(StatusCode statusCode)
{
Debug.Log(statusCode);
}
#endregion
}
- 分发消息和事件
(1)实现接口,如图
- 新建BaseEvent.cs BaseRequest.cs MsgManager.cs 代码如下
using UnityEngine;
using Protocal;
using ExitGames.Client.Photon;
public abstract class BaseEvent : MonoBehaviour {
//事件类型
public Protocal.EventType code;
//发送事件
public abstract void OnEvent(EventData eventData);
public virtual void Start()
{
MsgManager.Instance.AddEvent(this);
}
public void OnDestroy()
{
MsgManager.Instance.RemoveEvent(this);
}
}
using UnityEngine;
using Protocal;
using ExitGames.Client.Photon;
public abstract class BaseRequest : MonoBehaviour {
//请求和响应的类型
public OperationType code;
//发送请求
public abstract void DefaultRequest();
//处理服务器响应的请求
public abstract void OnOperationResponse(OperationResponse operationResponse);
public virtual void Start()
{
MsgManager.Instance.AddRequest(this);
}
public void OnDestroy()
{
MsgManager.Instance.RemoveRequest(this);
}
}
using UnityEngine;
using Protocal;
using ExitGames.Client.Photon;
using System.Collections.Generic;
public class MsgManager {
#region 单例
private static MsgManager instance;
public static MsgManager Instance
{
get
{
if (instance == null)
{
instance = new MsgManager();
}
return instance;
}
}
#endregion
#region BaseRequest 和 BaseEvent
public Dictionary<OperationType, BaseRequest> reqDic = new Dictionary<OperationType, BaseRequest>();
public Dictionary<Protocal.EventType, BaseEvent> eventDic = new Dictionary<Protocal.EventType, BaseEvent>();
public void AddRequest(BaseRequest request)
{
if (!reqDic.ContainsKey(request.code))
{
reqDic.Add(request.code, request);
}
}
public void RemoveRequest(BaseRequest request)
{
if (reqDic.ContainsKey(request.code))
{
reqDic.Remove(request.code);
}
}
public BaseRequest GetRequest(OperationType code)
{
BaseRequest req = null;
reqDic.TryGetValue(code, out req);
return req;
}
public void AddEvent(BaseEvent baseEvent)
{
if (!eventDic.ContainsKey(baseEvent.code))
{
eventDic.Add(baseEvent.code, baseEvent);
}
}
public void RemoveEvent(BaseEvent baseEvent)
{
if (eventDic.ContainsKey(baseEvent.code))
{
eventDic.Remove(baseEvent.code);
}
}
public void DispatchMsg(OperationResponse operationResponse)
{
OperationType code = (OperationType)operationResponse.OperationCode;
BaseRequest request = GetRequest(code);
if (request != null)
{
Debug.Log("分发响应" + code);
request.OnOperationResponse(operationResponse);
}
else
{
Debug.Log("request is null ");
}
}
public void DispatchEvent(EventData eventData)
{
Protocal.EventType code = (Protocal.EventType)eventData.Code;
BaseEvent baseEvent = DicManager.GetValue<Protocal.EventType, BaseEvent>(eventDic, code);
if (baseEvent != null)
{
baseEvent.OnEvent(eventData);
}
}
#endregion
}