作用:Unity客户端
C:\Photon-OnPremise-Server-SDK_v4-0-29-11263\lib\Photon3Unity3D.dll
在Scenes同级创建文件夹Plugins(插件,不可以修改Plugins这个名字)放入Photon3Unity3D.dll
命名PhotonEngine,加上脚本
修改MyGame1
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using ExitGames.Client.Photon;
public class PhotonEngine : MonoBehaviour,IPhotonPeerListener
{
public static PhotonPeer Peer
{
get
{
return peer;
}
}
private static PhotonEngine Instance;//创建一个物体
private static PhotonPeer peer;//做成一个字段
//Instance判断有没有这个,有的话删除,没有就赋值,PhotonEngine只需要一个就可以了
void Awake()
{
if (Instance == null)
{
Instance = this;
}
else if(Instance != this)
{
Destroy(this.gameObject);return;
}
}
// Start is called before the first frame update
void Start()
{
//通过Listener接收服务器端的响应
peer = new PhotonPeer(this,ConnectionProtocol.Udp);//有监听器、有协议
//ip地址、应用名字
//ip:小托盘PhotonServer查到的第一个是本机地址,第二个是路由器局域网地址,第三个是外网
//C:\Photon-OnPremise-Server-SDK_v4-0-29-11263\deploy\bin_Win64\PhotonServer.config
//ip后的端口号:是选择PhotonServer.config的Udp的端口号
//应用名字:选择PhotonServer.config的Application无s的Name
peer.Connect("10.211.55.5:5055", "MyGame1");
}
// Update is called once per frame
void Update()
{
//判断是否连接
//if (peer.PeerState == PeerStateValue.Connected)
//{
peer.Service();//需要一直调用
//}
}
//如果Unity关闭时可以断开连接
void OnDestory()
{
if(peer != null && peer.PeerState == PeerStateValue.Connected)
{
peer.Disconnect();
}
}
//以下4个是IPhotonPeerListener
public void DebugReturn(DebugLevel level, string message)
{
throw new System.NotImplementedException();
}
//服务器端直接想客户端发送event事件信息
public void OnEvent(EventData eventData)
{
throw new System.NotImplementedException();
}
//客户端发送到服务器端,传回来的数据类似Ajax
public void OnOperationResponse(OperationResponse operationResponse)
{
switch (operationResponse.OperationCode)//通过OperationCode区分请求
{
case 1:
Debug.Log("客户端收到了服务器端的响应OpCode1");
Dictionary<byte, object> data = operationResponse.Parameters;
object intValue;
data.TryGetValue(1, out intValue);
object stringValue;
data.TryGetValue(2, out stringValue);
Debug.Log("服务器收到回复:"+ intValue.ToString() + stringValue.ToString());
break;
case 2:
break;
default:
break;
}
}
//连接state发生不一样时做的5种
public void OnStatusChanged(StatusCode statusCode)
{
Debug.Log(statusCode);
}
}
脚本text.cs,点击鼠标OpCustom发送测试
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class text : MonoBehaviour
{
// Update is called once per frame
void Update()
{
if (Input.GetMouseButtonDown(0))
{
SendRequest();
}
}
void SendRequest()
{
Dictionary<byte, object> data = new Dictionary<byte, object>();
data.Add(1, 100);//加数据
data.Add(2, "aaBB中文");//加数据
PhotonEngine.Peer.OpCustom(1,data, true);//调用OpCustom发送:1是case码,数据,一定要发送到
Debug.Log("客户端发送了一个请求");
}
}
PhotonEngine.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using ExitGames.Client.Photon;
using Common;
using Common.Tools;
public class PhotonEngine : MonoBehaviour, IPhotonPeerListener
{
public static PhotonPeer Peer
{
get
{
return peer;
}
}
public static PhotonEngine Instance;//创建一个物体
private static PhotonPeer peer;//做成一个字段
public static string username;//名字信息
//
//Photon连接
//
//Instance判断有没有这个,有的话删除,没有就赋值,PhotonEngine只需要一个就可以了
void Awake()
{
if (Instance == null)
{
Instance = this;
DontDestroyOnLoad(this.gameObject);
}
else if (Instance != this)
{
Destroy(this.gameObject); return;
}
}
// 连接Photon
void Start()
{
//通过Listener接收服务器端的响应
peer = new PhotonPeer(this, ConnectionProtocol.Udp);//有监听器、有协议
//ip地址、应用名字
//ip:小托盘PhotonServer查到的第一个是本机地址,第二个是路由器局域网地址,第三个是外网
//C:\Photon-OnPremise-Server-SDK_v4-0-29-11263\deploy\bin_Win64\PhotonServer.config
//ip后的端口号:是选择PhotonServer.config的Udp的端口号
//应用名字:选择PhotonServer.config的Application无s的Name
peer.Connect("10.211.55.5:5055", "Tetris");
}
// Update is called once per frame
void Update()
{
//判断是否连接
peer.Service();//需要一直调-
}
//如果Unity关闭时可以断开连接
void OnDestroy()
{
if (peer != null && peer.PeerState == PeerStateValue.Connected)
{
peer.Disconnect();
}
}
//以下4个是IPhotonPeerListener
public void DebugReturn(DebugLevel level, string message)
{
throw new System.NotImplementedException();
}
//连接state发生不一样时做的5种
public void OnStatusChanged(StatusCode statusCode)
{
Debug.Log(statusCode);
}
//
//请求request
//
private Dictionary<OperationCode, BaseRequest> RequestDict = new Dictionary<OperationCode, BaseRequest>();//普通请求字典
//请求-收-客户端发送到服务器端,传回来的数据类似Ajax
public void OnOperationResponse(OperationResponse operationResponse)
{
//处理分发
OperationCode opCode = (OperationCode)operationResponse.OperationCode;//获得code是谁
BaseRequest request = null;
bool temp = RequestDict.TryGetValue(opCode, out request);
if (temp)
{
request.OnOperationResponse(operationResponse);
}
else
{
Debug.Log("没找到对应的响应处理对象");
}
}
//请求-request-添加移除
public void AddRequest(BaseRequest request)
{
RequestDict.Add(request.OpCode, request);
}
public void RemoveRequest(BaseRequest request)
{
RequestDict.Remove(request.OpCode);
}
//
//事件Event
//
private Dictionary<EventCode, BaseEvent> EventDict = new Dictionary<EventCode, BaseEvent>();//事件字典
//服务器端直接向客户端发送event事件信息
public void OnEvent(EventData eventData)
{
EventCode code = (EventCode)eventData.Code;
BaseEvent e = DictTool.GetValue<EventCode, BaseEvent>(EventDict, code);
e.OnEvent(eventData);
}
//事件-接收-增加事件码
public void AddEvent(BaseEvent e)
{
EventDict.Add(e.EventCode, e);//字典加
}
//事件-接收-取消事件码
public void RemoveEvent(BaseEvent e)
{
EventDict.Remove(e.EventCode);//字典减
}
}