PhotonServer教程 《六》

客户端开发

  1. 新建U3D项目
  2. 在Assets目录下创建 Plugins, 把 Photon3Unity3D.dll 复制进来
  3. 在Assets目录下创建 Protocol文件夹,把协议工程生成的所有文件复制进来
  4. 创建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. 分发消息和事件
    (1)实现接口,如图
    在这里插入图片描述
  2. 新建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




}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值