前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Unity游戏开发Photon Server之客户端架构

Unity游戏开发Photon Server之客户端架构

作者头像
bering
发布2019-12-03 15:36:58
1.5K0
发布2019-12-03 15:36:58
举报
文章被收录于专栏:游戏开发之旅游戏开发之旅

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/CJB_King/article/details/53560805

Unity游戏开发Photon Server之客户端架构

客户端的服务器部分通过不同的控制器对外提供调用,完成和服务器的通信.

类间关系如图:

图中的类里,PhotonEngine是继承了MonoBehavior类和IPhotonPeerListener接口的单例类,会在Awake函数中连接服务器,在Update函数中调用PhotonPeer的Service函数来向服务器发送Request,并接受服务器的Response.值得注意的是在场景加载时要确保不会被销毁以防止连接断开.

ControllerBase是抽象类,继承自MonoBehavior.在Start函数执行时将在PhotonEngine中注册.当PhotonEngine得到Response之后,会根据OperationCode调用已注册的相应的Controller.在Destroy函数中,会取消在PhotonEngine的注册记录以防止出现找不到引用的bug.各个不同的Controller就会对不同的操作进行处理.

PhotonEngine类的实例代码如下:

public class PhotonEngine : MonoBehaviour, IPhotonPeerListener
{
    IPHostEntry hostEntry;
    public ConnectionProtocol protocol = ConnectionProtocol.Tcp;
    public string IPaddress = string.Empty;
    //public string IPAddress = IP+":4530";
    public string applicationName = "ARApplication";
    public Dictionary<byte, ControllerBase> controllerDic = new Dictionary<byte, ControllerBase>();
    public delegate void OnConnectedToServerEvent();
    public event OnConnectedToServerEvent OnConnectedToServer;
    public delegate void OnDisConnectedEvent();
    public event OnDisConnectedEvent OnDisConnect;
    public static PhotonEngine photonInstance
    {
        get
        {
            return _instance;
        }
    }
    private static PhotonEngine _instance;
    PhotonPeer peer;
    bool isConnected = false;
    void Awake()
    {
        _instance = this;
        hostEntry = Dns.GetHostEntry(Dns.GetHostName());
        foreach(IPAddress ip in hostEntry.AddressList)
        {
            if(ip.AddressFamily==System.Net.Sockets.AddressFamily.InterNetwork)
            {
                IPaddress += ":4530";
            }
        }
        peer = new PhotonPeer(this, protocol);
        peer.Connect(IPaddress, applicationName);
    }
    void Update()
    {
        peer.Service();
    }
    public void RegisterController(OperationCode opCode, ControllerBase controller)  //在ControllerBase中调用此方法
    {
        controllerDic.Add((byte)opCode, controller);
    }
    public void UnRegisterController(OperationCode opCode)
    {
        controllerDic.Remove((byte)opCode);
    }
    public void SendRequest(OperationCode opCode, Dictionary<byte, object> parameter)
    {
        peer.OpCustom((byte)opCode, parameter, true);
    }
    public void DebugReturn(DebugLevel level, string message)
    {

    }

    public void OnEvent(EventData eventData)
    {

    }

    public void OnOperationResponse(OperationResponse operationResponse)
    {
        Debug.Log("Response Sucessed");
        ControllerBase controllerObject;
        controllerDic.TryGetValue(operationResponse.OperationCode, out controllerObject);  //根据operationResponse.Operationcode得到字典中已经注册好的对应的Controller
        controllerObject.OnOperationResponse(operationResponse);//调用Controller中的方法;
    }

    public void OnStatusChanged(StatusCode statusCode)
    {
        switch (statusCode)
        {
            case StatusCode.Connect:
                {
                    isConnected = true;
                    OnConnectedToServer();
                }
                break;
            case StatusCode.Disconnect:
                {
                    Debug.Log("Disconnected");
                }
                break;
        }
    }
}

接着是抽象类ControllerBase

public abstract class ControllerBase : MonoBehaviour {
    public abstract OperationCode opCode
    {
        get;
    }
    public virtual void Start()
    {
        PhotonEngine.photonInstance.RegisterController(opCode, this);
    }
    public virtual void OnDestroy()
    {
        PhotonEngine.photonInstance.UnRegisterController(opCode);
    }
    public abstract void OnOperationResponse(OperationResponse response);

}

好了,客户端需要注意的就这么多,若是还有需要的后续再更新!!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-12-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Unity游戏开发Photon Server之客户端架构
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档