攻城ol怎么攻城掠地武将快速升级级

  &攻城&客户端采用Unity引擎并结合Photon框架进行开发。
  关于将Photon配置进游戏引擎中的操作本篇直接省略。
  在展开之前,先来看看Unity的文件夹组织层次。
  Audios放音频文件,Libs放一些外部的动态链接库文件,Models放模型资源,预留的Resources文件夹主要服务于Resource类,Scenes放场景文件,重点是Scripts文件夹。
  首先ClientLogic层存放与逻辑相关的脚本。Photon客户端采用事件监听体制,Event中存放事件数据类的定义,从下面的项目图能看出来。Scene又分为多个以&Scene&为后缀的文件夹,每个文件夹则代表一个场景的逻辑,每一个场景的逻辑脚本都存放在其对应的场景文件夹内,并且绑定在对应场景的一个游戏对象上。Data文件中有存放缓存数据的类的脚本,例如人物数据、怪物数据等将存放在这些类的实例中,以便访问和更新数据。PhotonClient文件夹则存放Photon客户端应用程序的脚本。下图是客户端原型的项目组织。
  可以看到,Event文件夹都是些自定义事件数据类,在上一层中有个EventCollection文件,其中对这些委托、事件进行声明。再讲下Scene,比方说CharacterScene对应Character这个场景,其中目前有两个脚本,他们继承于MonoBehavior绑定在场景中的一个名为Character的物体上,当加载场景后便会启动这两个脚本,跳转到其他场景便销毁,频繁地相互引用脚本是个坏习惯,这样做便是要求编写代码时要始终遵循单一职责原则。此外,这里还有两个接口,IEventReceive和IResonseReceive,一个要求OnEvent方法,另一个要求OnResponse方法,场景脚本依照需求实现这两个接口。
1 //-----------------------------------------------------------------------------------------------------------
2 // Copyright (C)
SiegeOnline
3 // 版权所有
5 // 文件名:IEventReceive.cs
7 // 文件功能描述:
9 // 处理广播事件接口,由各场景逻辑实现
11 // 创建标识:taixihuase
13 // 修改标识:
14 // 修改描述:
17 // 修改标识:
18 // 修改描述:
20 //----------------------------------------------------------------------------------------------------------
22 using ExitGames.Client.P
23 using SiegeOnlineClient.PhotonC
24 // ReSharper disable CheckNamespace
26 namespace SiegeOnlineClient.ClientLogic
/// &summary&
/// 类型:接口
/// 名称:IEventReceive
/// 作者:taixihuase
/// 作用:广播处理接口
/// 编写日期:
/// &/summary&
interface IEventReceive
/// &summary&
/// 类型:方法
/// 名称:OnEvent
/// 作者:taixihuase
/// 作用:当接收到广播时,对广播进行处理
/// 编写日期:
/// &/summary&
/// &param name="eventData"&&/param&
/// &param name="service"&&/param&
void OnEvent(EventData eventData, PhotonService service);
//-----------------------------------------------------------------------------------------------------------
// Copyright (C)
SiegeOnline
// 版权所有
// 文件名:IResponseReceive.cs
// 文件功能描述:
// 处理消息回应接口,由各场景逻辑实现
// 创建标识:taixihuase
// 修改标识:
// 修改描述:
// 修改标识:
// 修改描述:
//----------------------------------------------------------------------------------------------------------
using ExitGames.Client.P
using SiegeOnlineClient.PhotonC
// ReSharper disable CheckNamespace
namespace SiegeOnlineClient.ClientLogic
/// &summary&
/// 类型:接口
/// 名称:IResponseReceive
/// 作者:taixihuase
/// 作用:回应处理接口
/// 编写日期:
/// &/summary&
interface IResponseReceive
/// &summary&
/// 类型:方法
/// 名称:OnResponse
/// 作者:taixihuase
/// 作用:当接收到回应消息时,对消息进行处理
/// 编写日期:
/// &/summary&
/// &param name="operationResponse"&&/param&
/// &param name="service"&&/param&
void OnResponse(OperationResponse operationResponse, PhotonService service);
  最底下的PhotonClient文件夹有一个PhotonService和PhotonSingleton,前者是真正的主逻辑脚本,在其中调用其他脚本的方法,后者是一个单例类,其中声明了一个静态的PhotonService对象,客户端代码便通过单例获取到Service,下面先贴上这两份代码。
1 //-----------------------------------------------------------------------------------------------------------
2 // Copyright (C)
SiegeOnline
3 // 版权所有
5 // 文件名:PhotonSingleton.cs
7 // 文件功能描述:
9 // Photon 客户端单例,存放客户端进程实例及服务端信息
11 // 创建标识:taixihuase
13 // 修改标识:
14 // 修改描述:
17 // 修改标识:
18 // 修改描述:
20 //----------------------------------------------------------------------------------------------------------
22 using UnityE
23 // ReSharper disable UnusedMember.Local
24 // ReSharper disable CheckNamespace
26 namespace SiegeOnlineClient.PhotonClient
/// &summary&
/// 类型:类
/// 名称:PhotonSingleton
/// 作者:taixihuase
/// 作用:Photon 单例类,Unity 通过实例化该单例启动 PhotonService 客户端主处理进程
/// 编写日期:
/// &/summary&
public class PhotonSingleton : MonoBehaviour
// 全局静态单例
private static PhotonSingleton _
// 单例属性
public static PhotonSingleton Instance
// 若获取不到单例,则寻找该单例,并拒绝销毁单例所挂载的对象上
if (_instance == null)
_instance = FindObjectOfType&PhotonSingleton&();
DontDestroyOnLoad(_instance.gameObject);
// 客户端主服务进程
public static PhotonService S
// 服务端 IP 地址
public string ServerIp = "localhost";
// 服务端端口号
public int ServerPort = 5055;
// 服务端进程名
public string ServerName = "SiegeOnlineServer";
/// &summary&
/// 类型:方法
/// 名称:Awake
/// 作者:taixihuase
/// 作用:创建单例
/// 编写日期:
/// &/summary&
void Awake()
// 若当前不存在单例,则创建单例并实例化客户端服务进程
if (_instance == null)
_instance = this;
Service = new PhotonService();
DontDestroyOnLoad(this);
// 若已存在一个单例,则销毁该单例所挂载的对象
if (this != _instance)
Destroy(gameObject);
// Use this for initialization
void Start()
Service.Connect(ServerIp, ServerPort, ServerName);
// Update is called once per frame
void Update()
Service.Service();
Debug.Log(Service.ServerConnected);
/// &summary&
/// 类型:方法
/// 名称:OnApplicationQuit
/// 作者:taixihuase
/// 作用:退出进程
/// 编写日期:
/// &/summary&
void OnApplicationQuit()
Service.Disconnect();
  关于单例模式,这里不做介绍,只要注意加上DontDestroyOnLoad(this);这一句,单例类继承自MonoBehavior,Start方法启动Service的连接方法Connect,Update中让Service持续进行服务。因为使用的是Visual Studio进行开发,所以using引用下方有Resharper插件的识别语句,不必管它。本篇的重点是下面的这个PhotonService类。
1 //-----------------------------------------------------------------------------------------------------------
2 // Copyright (C)
SiegeOnline
3 // 版权所有
5 // 文件名:PhotonService.cs
7 // 文件功能描述:
9 // Photon 客户端主进程,进行连线、消息收发及监听等操作
11 // 创建标识:taixihuase
13 // 修改标识:
14 // 修改描述:
17 // 修改标识:
18 // 修改描述:
20 //----------------------------------------------------------------------------------------------------------
22 using ExitGames.Client.P
23 using SiegeOnline.ClientLogic.Scene.LoginS
24 using SiegeOnline.ClientLogic.Scene.WorldS
25 using SiegeOnlineServer.P
26 using SiegeOnlineClient.ClientL
27 using SiegeOnlineClient.Data.P
28 using UnityE
29 // ReSharper disable UseNullPropagation
30 // ReSharper disable CheckNamespace
32 namespace SiegeOnlineClient.PhotonClient
/// &summary&
/// 类型:类
/// 名称:PhotonService
/// 作者:taixihuase
/// 作用:Photon 客户端主进程
/// 编写日期:
/// &/summary&
public class PhotonService : IPhotonPeerListener
// 连线用的 peer
public PhotonPeer Peer { protected set; get; }
// 连线状态
public bool ServerConnected { protected set; get; }
// 存放 Debug 信息
public string DebugMessage { protected set; get; }
// 事件集合
public static EventCollection Events = new EventCollection();
// 玩家数据缓存
public static PlayerData Player = new PlayerData();
/// &summary&
/// 类型:方法
/// 名称:PhotonService
/// 作者:taixihuase
/// 作用:程序运行后,构造客户端主进程实例
/// 编写日期:
/// &/summary&
public PhotonService()
Peer = null;
ServerConnected = false;
DebugMessage = "";
/// &summary&
/// 类型:方法
/// 名称:Connect
/// 作者:taixihuase
/// 作用:尝试通过 ip 地址、端口及服务端进程名,与服务端连线
/// 编写日期:
/// &/summary&
/// &param name="ip"&&/param&
/// &param name="port"&&/param&
/// &param name="serverName"&&/param&
public void Connect(string ip, int port, string serverName)
string serverAddress = ip + ":" + port.ToString();
Peer = new PhotonPeer(this, ConnectionProtocol.Udp);
Peer.Connect(serverAddress, serverName);
/// &summary&
/// 类型:方法
/// 名称:DebugReturn
/// 作者:taixihuase
/// 作用:获取返回的 Debug 消息
/// 编写日期:
/// &/summary&
/// &param name="level"&&/param&
/// &param name="message"&&/param&
public void DebugReturn(DebugLevel level, string message)
DebugMessage =
/// &summary&
/// 类型:方法
/// 名称:OnOperationResponse
/// 作者:taixihuase
/// 作用:客户端发送请求后,接收并处理相应的服务端响应内容
/// 编写日期:
/// &/summary&
/// &param name="operationResponse"&&/param&
public void OnOperationResponse(OperationResponse operationResponse)
switch (operationResponse.OperationCode)
// 账号登陆
case (byte) OperationCode.Login:
Object.FindObjectOfType&Login&().OnResponse(operationResponse, this);
// 玩家进入场景
case (byte) OperationCode.WorldEnter:
Object.FindObjectOfType&World&().OnResponse(operationResponse, this);
/// &summary&
/// 类型:方法
/// 名称:OnStatusChanged
/// 作者:taixihuase
/// 作用:当连接状态发生改变时,回调触发
/// 编写日期:
/// &/summary&
/// &param name="statusCode"&&/param&
public void OnStatusChanged(StatusCode statusCode)
switch (statusCode)
case StatusCode.Connect:
ServerConnected = true;
case StatusCode.Disconnect:
ServerConnected = false;
Peer = null;
/// &summary&
/// 类型:方法
/// 名称:OnEvent
/// 作者:taixihuase
/// 作用:监听服务端发来的广播并回调触发事件
/// 编写日期:
/// &/summary&
/// &param name="eventData"&&/param&
public void OnEvent(EventData eventData)
switch (eventData.Code)
// 有玩家进入场景
case (byte) EventCode.WorldEnter:
Object.FindObjectOfType&World&().OnEvent(eventData, this);
/// &summary&
/// 类型:方法
/// 名称:Service
/// 作者:taixihuase
/// 作用:呼叫服务
/// 编写日期:
/// &/summary&
public void Service()
if (Peer != null)
Peer.Service();
/// &summary&
/// 类型:方法
/// 名称:Disconnect
/// 作者:taixihuase
/// 作用:断开与服务端之间的连接
/// 编写日期:
/// &/summary&
public void Disconnect()
if (Peer != null)
Peer.Disconnect();
  要使用Photon,必须让其继承接口IPhotonPeerListener,然后实现其方法。
  先看字段声明。PhotonPeer类的对象代表该客户端连线,用于与服务端连接。另一个重点是一些静态声明的集合类,如上面的EventCollection类,其定义是这样的:
1 //-----------------------------------------------------------------------------------------------------------
2 // Copyright (C)
SiegeOnline
3 // 版权所有
5 // 文件名:EventCollection.cs
7 // 文件功能描述:
9 // 事件集合,存放委托、事件的声明及调用
11 // 创建标识:taixihuase
13 // 修改标识:
14 // 修改描述:
17 // 修改标识:
18 // 修改描述:
20 //----------------------------------------------------------------------------------------------------------
22 using SiegeOnlineClient.ClientLogic.E
23 // ReSharper disable UseNullPropagation
24 // ReSharper disable CheckNamespace
26 namespace SiegeOnlineClient.ClientLogic
/// &summary&
/// 类型:类
/// 名称:EventCollection
/// 作者:taixihuase
/// 作用:事件集合,用于声明委托、事件及其相应判空函数
/// 编写日期:
/// &/summary&
public class EventCollection
#region 与登录相关的委托及事件
// 登录委托
public delegate void LoginEventHandler(object sender, LoginEventArgs e);
// 登录事件
public event LoginEventHandler MyL
public void OnLogin(object sender, LoginEventArgs e)
if (MyLogin != null)
MyLogin(sender, e);
#endregion
#region 与创建角色相关的委托及事件
// 创建角色委托
public delegate void CreateCharacterEventHandler(object sender, CreateCharacterEventArgs e);
// 创建角色事件
public event CreateCharacterEventHandler MyCreateC
public void OnCreateCharacter(object sender, CreateCharacterEventArgs e)
if (MyCreateCharacter != null)
MyCreateCharacter(sender, e);
#endregion
#region 与加载角色相关的委托及事件
// 加载角色委托
public delegate void LoadCharacterEventHandler(object sender, LoadCharacterEventArgs e);
// 加载角色事件
public event LoadCharacterEventHandler MyLoadC
public void OnLoadCharacter(object sender, LoadCharacterEventArgs e)
if (MyLoadCharacter != null)
MyLoadCharacter(sender, e);
#endregion
#region 与玩家角色进入场景相关的委托及事件
// 进入场景委托
public delegate void WorldEnterEventHandler(object sender, WorldEnterEventArgs e);
// 自身进入场景
public event WorldEnterEventHandler MyWorldE
// 任意进入场景
public event WorldEnterEventHandler AnyWorldE
public void OnWorldEnter(object sender, WorldEnterEventArgs e)
if (e.MyCharacter != null)
if (MyWorldEnter != null)
MyWorldEnter(sender, e);
else if (e.AnyCharacter != null)
if (AnyWorldEnter != null)
AnyWorldEnter(sender, e);
#endregion
#region 其他
#endregion
  该集合存放了委托、事件声明及调用,事件的使用这类不介绍。这些类对象设为静态,只实例化一次便一直存在到程序结束运行为止,因此可以一直访问。后面的PlayerData玩家数据缓存也是一样的道理。
  接下来讲PhotonService的两个主要方法:OnOperationResponse和OnEvent。它们对应于服务端的SendOperationResponse和SendEvent或者SentTo等方法。
/// &summary&
/// 类型:方法
/// 名称:OnOperationResponse
/// 作者:taixihuase
/// 作用:客户端发送请求后,接收并处理相应的服务端响应内容
/// 编写日期:
/// &/summary&
/// &param name="operationResponse"&&/param&
public void OnOperationResponse(OperationResponse operationResponse)
switch (operationResponse.OperationCode)
// 账号登陆
case (byte) OperationCode.Login:
Object.FindObjectOfType&Login&().OnResponse(operationResponse, this);
// 玩家进入场景
case (byte) OperationCode.WorldEnter:
Object.FindObjectOfType&World&().OnResponse(operationResponse, this);
&  OnOperationResponse,接受OperationResponse类型的一个参数,该参数包含的内容与服务端发送过来的OperationResponse对象内容完全一致,包含操作识别码和字典存储的数据。用一个多分支语句判别其中的OperationCode,然后查找相应的场景脚本,并将OperationResponse对象原封不动传给该脚本的OnResponse方法,同时把Service也传给它。能够发送某个操作请求给服务端,然后再接收回相同操作码的服务端答应,则一般都存在相应的脚本或场景,因此一般不必当心FindObjectOfType操作失败。当然加上判空处理也是没问题的,因为还是可能有一些设计上的先后顺序问题,比如跳转场景,如果场景过大加载缓慢,则可能相应脚本未能赶在服务端消息到来前实例化,那么便会出现对象为空的错误情况。
  这里以登录作为讲解。
1 //-----------------------------------------------------------------------------------------------------------
2 // Copyright (C)
SiegeOnline
3 // 版权所有
5 // 文件名:Login.cs
7 // 文件功能描述:
9 // 登录场景脚本,处理登录的逻辑及相关 UI
11 // 创建标识:taixihuase
13 // 修改标识:
14 // 修改描述:
17 // 修改标识:
18 // 修改描述:
20 //----------------------------------------------------------------------------------------------------------
22 using System.C
23 using System.Collections.G
24 using ExitGames.Client.P
25 using SiegeOnline.ClientLogic.Scene.CharacterS
26 using SiegeOnlineClient.ClientL
27 using SiegeOnlineClient.PhotonC
28 using SiegeOnlineServer.P
29 using UnityE
30 using UnityEngine.UI;
31 using SiegeOnlineClient.ClientLogic.E
32 using SiegeOnlineServer.Protocol.Common.C
33 using SiegeOnlineServer.Protocol.Common.U
34 // ReSharper disable CheckNamespace
35 // ReSharper disable UnusedMember.Local
37 namespace SiegeOnline.ClientLogic.Scene.LoginScene
/// &summary&
/// 类型:类
/// 名称:Login
/// 作者:taixihuase
/// 作用:客户端登录类
/// 编写日期:
/// &/summary&
public class Login : MonoBehaviour, IResponseReceive
// 登录参数
private LoginInfo _loginI
// 账号输入框
public InputField A
// 密码输入框
public InputField P
// 登录按钮
public Button LoginB
// 退出按钮
public Button ExitB
// Use this for initialization
private void Start()
// 注册方法
PhotonService.Events.MyLogin += CharacterNotE
PhotonService.Events.MyLogin += ErrorI
PhotonService.Events.MyLogin += RepeatedL
PhotonService.Events.MyLogin += CharacterE
public void OnResponse(OperationResponse operationResponse, PhotonService service)
LoginEventArgs e = new LoginEventArgs(operationResponse);
PhotonService.Events.OnLogin(service, e);
#region UI 方法
/// &summary&
/// 类型:方法
/// 名称:OnLoginButtonDown
/// 作者:taixihuase
/// 作用:当按下登录按钮时触发登录事件,将登录信息发送给服务端
/// 编写日期:
/// &/summary&
public void OnLoginButtonDown()
if (PhotonSingleton.Service.ServerConnected)
if (Account.text.Length & 0 && Password.text.Length & 0)
_loginInfo = new LoginInfo(Account.text, Password.text);
byte[] data = Serialization.Serialize(_loginInfo);
var parameter = new Dictionary&byte, object&
{(byte) ParameterCode.Login, data}
PhotonSingleton.Service.Peer.OpCustom((byte)OperationCode.Login, parameter, true);
/// &summary&
/// 类型:方法
/// 名称:OnExitButtonDown
/// 作者:taixihuase
/// 作用:当按下退出按钮时触发退出事件,退出进程,Debug模式无效
/// 编写日期:
/// &/summary&
public void OnExitButtonDown()
Application.Quit();
#endregion
#region 用于注册事件的方法
/// &summary&
/// 类型:方法
/// 名称:ErrorInput
/// 作者:taixihuase
/// 作用:当账号或密码有误时触发
/// 编写日期:
/// &/summary&
/// &param name="sender"&&/param&
/// &param name="e"&&/param&
private void ErrorInput(object sender, LoginEventArgs e)
if (e.OperationResponse.ReturnCode == (short) ErrorCode.InvalidOperation)
Debug.Log(e.OperationResponse.DebugMessage);
/// &summary&
/// 类型:方法
/// 名称:RepeatedLogin
/// 作者:taixihuase
/// 作用:当尝试登录一个已在线账号时触发
/// 编写日期:
/// &/summary&
/// &param name="sender"&&/param&
/// &param name="e"&&/param&
private void RepeatedLogin(object sender, LoginEventArgs e)
if (e.OperationResponse.ReturnCode == (short) ErrorCode.RepeatedOperation)
Debug.Log(e.OperationResponse.DebugMessage);
/// &summary&
/// 类型:方法
/// 名称:CharacterExist
/// 作者:taixihuase
/// 作用:当登录账号成功并且成功获取到当前账号的角色数据时触发
/// 编写日期:
/// &/summary&
/// &param name="sender"&&/param&
/// &param name="e"&&/param&
private void CharacterExist(object sender, LoginEventArgs e)
if (e.OperationResponse.ReturnCode == (short) ErrorCode.Ok)
DontDestroyOnLoad(transform.parent);
Application.LoadLevel("Character");
Character character = (Character)
Serialization.Deserialize(e.OperationResponse.Parameters[(byte) ParameterCode.Login]);
StartCoroutine(LoadCharacter(sender, character));
/// &summary&
类型:方法
/// 名称:CharacterNotExist
/// 作者:taixihuase
/// 作用:当登录账号成功并且该账号未创建角色时触发
/// 编写日期:
/// &/summary&
/// &param name="sender"&&/param&
/// &param name="e"&&/param&
private void CharacterNotExist(object sender, LoginEventArgs e)
if (e.OperationResponse.ReturnCode == (short)ErrorCode.CharacterNotFound)
DontDestroyOnLoad(transform.parent);
Application.LoadLevel("Character");
UserBase user = (UserBase)
Serialization.Deserialize(e.OperationResponse.Parameters[(byte)ParameterCode.Login]);
Debug.Log(user.Nickname + " have no character...");
StartCoroutine(CreateCharacter(sender, user));
#endregion
#region 协程方法
/// &summary&
/// 类型:方法
/// 名称:LoadCharacter
/// 作者:taixihuase
/// 作用:当成功获取到角色数据时触发加载角色事件
/// 编写日期:
/// &/summary&
/// &param name="sender"&&/param&
/// &param name="character"&&/param&
/// &returns&&/returns&
private IEnumerator LoadCharacter(object sender, Character character)
while ((load = FindObjectOfType&LoadCharacter&()) == null)
yield return null;
LoadCharacterEventArgs lc = new LoadCharacterEventArgs(character);
load.OnLoad(sender, lc);
Destroy(transform.parent.gameObject);
/// &summary&
/// 类型:方法
/// 名称:CreateCharacter
/// 作者:taixihuase
/// 作用:当成功获取到角色数据时触发创建角色事件
/// 编写日期:
/// &/summary&
/// &param name="sender"&&/param&
/// &param name="user"&&/param&
/// &returns&&/returns&
private IEnumerator CreateCharacter(object sender, UserBase user)
while ((create = FindObjectOfType&CreateCharacter&()) == null)
yield return null;
CreateCharacterEventArgs cc = new CreateCharacterEventArgs(user);
create.OnCreate(sender, cc);
Destroy(transform.parent.gameObject);
#endregion
private void OnDestroy()
PhotonService.Events.MyLogin -= CharacterNotE
PhotonService.Events.MyLogin -= ErrorI
PhotonService.Events.MyLogin -= RepeatedL
PhotonService.Events.MyLogin -= CharacterE
&  该脚本需要继承IResponseReceive接口,Start方法先为EventCollection事件集合实例中的MyLogin事件绑定几个方法,当进行登录并接收到回应后,从Service调用OnResponse方法,该方法实例化一个LoginEventArgs类的事件数据e,LoginEventArgs类需要接收一个OperationResponse类型的对象。然后调用事件集合中的OnLogin方法,OnLogin将会把数据e发送给所有已绑定的方法,然后这四个被绑定的方法对其ReturnCode进行判别,从而执行相应处理。整个流程其实非常清晰。PhotonService接收答应,识别并调用相应脚本的OnResponse方法,OnResponse方法实例化一个事件数据对象,然后调用其方法。注意脚本销毁时需要解除绑定,如OnDestroy方法那样做。
  好了,最后还差一个OnEvent,道理其实跟OnResponse一模一样,只是调用的方法改为对应场景脚本的OnEvent方法而已,其后依旧是事件处理操作,当服务端对客户端发送广播时,便会触发OnEvent回调方法。
/// &summary&
/// 类型:方法
/// 名称:OnEvent
/// 作者:taixihuase
/// 作用:监听服务端发来的广播并回调触发事件
/// 编写日期:
/// &/summary&
/// &param name="eventData"&&/param&
public void OnEvent(EventData eventData)
switch (eventData.Code)
// 有玩家进入场景
case (byte) EventCode.WorldEnter:
Object.FindObjectOfType&World&().OnEvent(eventData, this);
  如果上面理解的话,看World场景的代码也自然能够通了。
1 //-----------------------------------------------------------------------------------------------------------
2 // Copyright (C)
SiegeOnline
3 // 版权所有
5 // 文件名:World.cs
7 // 文件功能描述:
9 // 世界场景脚本,处理游戏主场景的逻辑及相关 UI
11 // 创建标识:taixihuase
13 // 修改标识:
14 // 修改描述:
17 // 修改标识:
18 // 修改描述:
20 //----------------------------------------------------------------------------------------------------------
22 using ExitGames.Client.P
23 using SiegeOnlineClient.ClientL
24 using SiegeOnlineClient.ClientLogic.E
25 using SiegeOnlineClient.PhotonC
26 using SiegeOnlineServer.P
27 using UnityE
28 using UnityEngine.UI;
29 // ReSharper disable UnusedMember.Local
30 // ReSharper disable CheckNamespace
32 namespace SiegeOnline.ClientLogic.Scene.WorldScene
public class World : MonoBehaviour, IEventReceive, IResponseReceive
// 玩家上线提示文本
public Text LoginT
// Use this for initialization
void Start()
PhotonService.Events.MyWorldEnter += MyWorldPlayerE
PhotonService.Events.AnyWorldEnter += AnyPlayerE
// Update is called once per frame
private void Update()
public void OnResponse(OperationResponse operationResponse, PhotonService service)
// 判断事件类型并调用对应的方法
switch (operationResponse.OperationCode)
// 玩家角色进入场景
case (byte) OperationCode.WorldEnter:
OnEnter(operationResponse, service);
public void OnEvent(EventData eventData, PhotonService service)
// 判断事件类型并调用对应的方法
switch (eventData.Code)
// 玩家角色进入场景
case (byte) EventCode.WorldEnter:
OnEnter(eventData, service);
#region 用于触发事件时选择的事件类型
#region 玩家角色进入场景
/// &summary&
/// 类型:方法
/// 名称:OnEnter
/// 作者:taixihuase
/// 作用:当自身角色进入场景时,触发事件
/// 编写日期:
/// &/summary&
/// &param name="operationResponse"&&/param&
/// &param name="service"&&/param&
private void OnEnter(OperationResponse operationResponse, PhotonService service)
WorldEnterEventArgs e = new WorldEnterEventArgs(operationResponse);
PhotonService.Events.OnWorldEnter(service, e);
/// &summary&
/// 类型:方法
/// 名称:OnEnter
/// 作者:taixihuase
/// 作用:当有玩家进入场景时,触发事件
/// 编写日期:
/// &/summary&
/// &param name="eventData"&&/param&
/// &param name="service"&&/param&
private void OnEnter(EventData eventData, PhotonService service)
WorldEnterEventArgs e = new WorldEnterEventArgs(eventData);
PhotonService.Events.OnWorldEnter(service, e);
#endregion
#endregion
#region 用于注册事件的方法
#region 玩家角色进入场景
/// &summary&
/// 类型:方法
/// 名称:MyWorldPlayerEnter
/// 作者:taixihuase
/// 作用:当自己角色进入游戏场景时
/// 编写日期:
/// &/summary&
/// &param name="sender"&&/param&
/// &param name="e"&&/param&
private void MyWorldPlayerEnter(object sender, WorldEnterEventArgs e)
Debug.Log(e.MyCharacter.Attribute.WorldEnterTime);
/// &summary&
/// 类型:方法
/// 名称:AnyWorldPlayerEnter
/// 作者:taixihuase
/// 作用:当任意角色进入游戏场景时
/// 编写日期:
/// &/summary&
/// &param name="sender"&&/param&
/// &param name="e"&&/param&
private void AnyPlayerEnter(object sender, WorldEnterEventArgs e)
LoginTip.text = "玩家 " + e.AnyCharacter.Nickname + " 上线了!";
#endregion
#endregion
#region UI方法
#endregion
void OnDestroy()
PhotonService.Events.MyWorldEnter -= MyWorldPlayerE
PhotonService.Events.AnyWorldEnter -= AnyPlayerE
  最后附上几张与客户端相关的UML图。
  好了,这就是客户端的框架,下篇则介绍协议&Protocol&。
阅读(...) 评论()}

我要回帖

更多关于 gtaol快速升级 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信