170攻城掠地帐号送号OL怎么出售帐号 170攻城掠地帐号送号OL出售平台推荐

是时候,换个姿势关注TA
关注 功能升级,收割 TA 的最新动态
扫我下载最新九游APP
查看: 1394|回复: 6
最后登录积分21874精华10帖子
Lv17炉火纯青, 经验 21874, 距离下一级还需 2126 经验
& && && &在《攻城OL》里有几点是非常重要的,包括资源,战力,等级,而资源排在第一位,当然是重中之重,资源获取的渠道很多,但最有效的就是下矿,不过下矿的门路也非常多,怎样去找矿,派兵都是学问,小编今天为大家带来的就是关于下矿的攻略。
& && &攻打矿点是玩家每天都在重复的事情,那么怎样才能不费主力的攻打成功呢,下面由我为大家交流下经验:
& && &1.找矿
& && &在保证有银币的情况下,我们每次下矿都必须侦查。
第一是为了更好的针对目标进行排兵部阵,
第二是为了不发生撞到其他玩家采矿发生误会。一般情况下白天采矿我都是四五个小时一波次,晚上八九个小时。
& && &2.根据矿点战力进行合理的排兵。
& && &如果你想不损失主力的话最好的选择就是纯步兵矿点或有一组骑兵的步兵矿点,对于这类矿在装备上是这样排的1和3号位空,2号位朴刀兵(炮灰),4、5、6号位放弓兵和其他载重高的兵种。值得注意的是炮灰的装备生命和闪避要高,主力兵种的装备要高命中和攻击。
& && &下矿采矿是每个玩家每天基本都会做的事情,有效的去找矿能为将时间最大化起来,但是根据矿点来安排战力也是很重要的,损失大小全看个人的决断,《攻城OL》在这方面也挺考验玩家的。
最后登录积分21874精华10帖子
Lv17炉火纯青, 经验 21874, 距离下一级还需 2126 经验
来自九游APP
我就我不说话。。。自己给自己顶顶
最后登录积分14006精华0帖子
您对该GM的评价:(登录并绑定手机即可获得投票机会。立刻/)
最后登录积分7030精华0帖子
Lv11渐入佳境, 经验 7030, 距离下一级还需 370 经验
来自九游APP
感觉论坛人好少了现在。
&你才发现&
&早就知道了。&
最后登录积分63610精华42帖子
来自九游APP
谢谢分享攻略经验
最后登录积分11304精华0帖子
Lv14渐入佳境, 经验 11304, 距离下一级还需 2296 经验
来自九游APP
你给我说个加命中的装备出来,麻烦写东西认真点
在九游论坛分享原创作品投稿授予,或者发帖互动率高被采纳,持续输出原创作品则有效期永久
输出优质原创作品150篇以上,精品80篇,并加入论坛写手组
安卓平台下载
苹果平台下载您的位置:
&›&&›&
攻城OL带兵宝典
当乐玩家交流总群5:
《攻城OL》带兵量和战力是互相挂钩的,可以说主公的带兵量也代表了你的战力指数,战力和越高,对于攻打别人或者攻打资源地都是很重要一点,对于怎么提高主公等级和兵量,下面就让小编今天带来了一些提高兵量的介绍,大家搬凳子来学习一下吧~【主公等级】进入游戏界面左上角显示的为主公名字和等级,主公等级是限定带兵量的一个重要因素。提高主公等级的途径是打战役、打世界资源地、完成各种任务来获得经验。战役可获得的经验值非常丰富,而里面有很多不同难度的关卡,每个守卫关卡的兵量和兵种都不一样,当然经验也不一样,越往后经验相应越多,所以我们应该尽量打后面的关卡以获得更多的经验来升级主公等级。另外打世界资源地也给经验,资源地的级别越高,给经验也越多,相应防守的兵量和兵种也越高。这里大家还应该注意一点,打战役不是无限制的,这个要靠军令的支撑,军令是每半小时系统赠送一枚,每枚军令可以攻打战役1次,好友每天最多可以赠送10祝福,获取祝福即可获取1点军令,另外还可以花元宝购买。大家要充分用好这些军令,才能更快的升级主公,以增加带兵量。【统率等级】点击主公打开玩家信息界面,利用统率书升级统率也是提高带兵量的重要因素,每升级一次都相应增加带兵量,前期每级增加带兵量3,随着主公级别越高,每升一级统率增加带兵量越多,不过这个有成功率,统率等级越高,成功率越低,具体成功不成功就看RP了。统率书的获得途径可以从军团商店换取或购买。【繁荣度等级】繁荣度等级也是提高带兵量的一个重要因素,繁荣度要靠升级建筑来达到,每种建筑升一级所增加繁荣度也是不一样的。所有建筑的等级不能超过官邸的等级,所以官邸等级越高,建筑所能升级的等级也越高。另外伴随着官邸的升级,所能建造的资源点也越来越多,升级繁荣度也越来越快。提高到一定阶级的繁荣会提升一级繁荣度等级,第一等级繁荣度可增加带兵量,繁荣度等级越高,增加带兵量也越多。所以要尽量的升级建筑来增加繁荣度。利用好时间来做最有用的事情,绝对可以加快主公的成长哦,提高等级和带兵量,那么以后想去哪就去哪!各位主公是不是迫不及待想去尝试啦~&&&&&&&&更多相关游戏信息请关注:《》当乐官网&&&&&&&&看手游新闻,就在当乐网!
全文终 当乐小编:Gordon
类型:策略&魔幻&
平台:安卓,苹果
状态:预告
大小:暂无
扫描二维码下载
享受更多游戏乐趣!
《攻城OL》高科技之研发系统
《攻城OL》军械系统全攻略
《攻城OL》深度解析主公六大属性
运筹帷幄 《攻城OL》军师系统全面曝光
得民心者得天下 《攻城OL》民心系统介绍
夺天下之大一统
《攻城OL》游戏介绍
参与评论0条
您还能留下2000个脚印
类型:策略&魔幻&
平台:安卓,苹果
状态:预告
版本号:暂无
率万军,灭诸侯,成帝业,夺天下之大一统。实时多人战略手游《攻城OL》展现高度自由的策略玩法。以三国大世界为大背景,玩家率...
网游排行榜
类型:策略&横版&历史&
5个礼包查看请先选择系统版本
请先选择商品类型
请选择游戏系统版本
您的位置:>>攻城online
攻城online交易平台
请选择游戏系统版本
角色等级67
商品描述V7战力,资源多
商品类型:
支持区服:
卖家等级:
立即购买更快捷
不想玩了,攻城OL账号便宜处理
角色等级39
商品描述虽然只是V1,但是我投入了很多的时间和精力在里面,10.8M这战力在同等级里面算高的了,卖之前我还会继续给升战,现在兵有四级刀骑抢各1500个,想了解详细的加我微信:wxxy0223
商品类型:
支持区服:
卖家等级:
立即购买更快捷
攻城online
便宜甩了,
角色等级65
商品描述兵多,将多,霸服团,想打谁打谁,看图
商品类型:
支持区服:
卖家等级:
立即购买更快捷
已领&26.25%
已领&27.40%
已领&43.00%
主播: 小游
主播: 吾主播
主播: 吾主播
信息100%正确
杜绝虚假信息
保障交易服务
交易无风险
7×24小时咨询服务
1对1专属客服
魔游游微信公众号
手游交易更方便!
魔游游手游交易客户端
手游党必备神器!安卓版
官方唯一交易状态通知电话率万军,灭诸侯,成帝业,夺天下之大一统。实时多人战略手游《攻城OL》展现高度自由的策略玩法。以三国大世界为大背景,玩家率领万军征战四方,不断发展国家,直至最后的一统天下封为君王。游戏高度还原军政战略手段,多重兵种,以不同攻击方式、光环属性和相互克制,形成不同兵种流派和战斗;将领差异,天赋属性等多重策略,打造无敌之师;国家建设,与全服玩家进行资源争夺。实时真人对抗,斗智,猎国,谋天下!&&&&
攻城OL电脑版截图
攻城OL电脑版相关资讯
【扫一扫下载游戏到手机】
标签:攻城OL,攻城OL电脑版,攻城OL安卓版,电脑玩攻城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 mon.C
33 using mon.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&。
阅读(...) 评论()

我要回帖

更多关于 7477游戏平台攻城掠地 的文章

 

随机推荐