Unityclient通信測试问题处理(二)
Unityclient通信測试问题处理(二)
在client的通信測试过程中。场景载入的问题给自己带来了不小的麻烦。由于消息的解析方法在单独的监听线程中调用,这也就意味着无法在消息的解析方法中调用Unity自身的API了。本来是打算在接收到场景切换的消息后,直接在解析方法中调用协同程序StartCoroutine。来实现场景的异步载入,但是如今一旦调用就会提示下面错误:
StartCoroutine_Auto can only be called from the main thread...
不能直接在监听线程中调用,那就仅仅能另想办法了。怎样来触发场景异步载入的协同程序呢?于是。自己想到了Start方法,由于这里是个调用协同程序的好地方。那么又该怎样调用Start方法呢?没错。通过对象的实例化来实现。
当一个对象在实例化的过程中。它的脚本组件中的Awake方法与Start方法会相继运行。
因此。我就通过实例化游戏对象的方式,来触发Start方法,进而在Start方法中调用协同程序。进行场景的异步载入操作。对象实例化的过程。通过一个布尔变量来进行控制,当解析方法中接收到场景切换的消息后,与目标场景相相应的布尔变量置为true,从而在Update方法中进行场景载入对象的实例化。代码例如以下所看到的:
void Update( )
{
if ( _isLoginLevel ) {
_isLoginLevel = false;
InstantiateLoadLevelObject( LOGIN_LEVEL_NAME );
} else if ( _isFirstLevel ) {
_isFirstLevel = false;
InstantiateLoadLevelObject( FIRST_LEVEL_NAME );
} else if ( _isSecondLevel ) {
_isSecondLevel = false;
InstantiateLoadLevelObject( SECOND_LEVEL_NAME );
}
}
要实现这个过程,离不开Prefab的制作。我们须要针对项目中存在的几个不同场景,每一个场景制作一个Prefab,作为异步载入场景的对象使用,Prefab例如以下所看到的:
然后还须要编写绑定在这每个Prefab之上的脚本,脚本实现的功能,就是依据不同的对象,来载入不同的场景,代码例如以下所看到的:
void Start()
{
if ( LOGIN_OBJECT_NAME == gameObject.name ) {
SceneMng.GetInstance()._isInLoad = true;
StartCoroutine( SceneMng.GetInstance().LoadLevelAsync( SceneMng.LOGIN_LEVEL_NAME ) );
} else if ( FIRST_OBJECT_NAME == gameObject.name ) {
SceneMng.GetInstance()._isInLoad = true;
StartCoroutine( SceneMng.GetInstance().LoadLevelAsync( SceneMng.FIRST_LEVEL_NAME ) );
} else if ( SECOND_OBJECT_NAME == gameObject.name ) {
SceneMng.GetInstance()._isInLoad = true;
StartCoroutine( SceneMng.GetInstance().LoadLevelAsync( SceneMng.SECOND_LEVEL_NAME ) );
}
}
在协同程序中直接调用场景管理类写好的异步载入场景的方法。完毕场景的异步载入。异步载入场景的代码例如以下所看到的:
public IEnumerator LoadLevelAsync( string levelName )
{
if ( null == levelName ) {
yield break;
}
_async = Application.LoadLevelAsync( levelName );
yield return _async;
}
通过以上处理。当我们在监听线程中的消息解析方法中接收到场景切换的消息后。就会马上实例化与目标场景相相应的游戏对象,然后通过在Start方法中调用的协同程序,来完毕场景的异步载入。
自己仍然在琢磨,在Update方法中处理场景载入对象的实例化过程,这可能并非最佳的方式。若有不正之处或是好的想法。欢迎大家与我交流。
Unityclient通信測试问题处理(二)的更多相关文章
- Unityclient通信測试问题处理(一)
Unityclient通信測试问题处理(一) 近期在測试程序的通信模块时.遇到了一个问题:Unity的API函数仅仅能在主线程中调用.而作为client程序,我单独启用了一个监听线程来接收服务端发送的 ...
- 谈谈单元測试之(二):測试工具 JUnit 3
前言 上一篇文章<为什么要进行烦人的单元測试?>讨论了一下现阶段软件开发中,程序猿们測试情况的现状.这篇文章中,我打算介绍一下单元測试的工具(插件).而且推荐大家以后在开发中,真正的用上单 ...
- James Whittaker的软件測试戒律(二)
摘录自<探索式软件測试>(注:作者模仿了圣经十诫的语气和内容编写了软件測试戒律) 1.汝应用大量输入重复锤炼汝之应用程序 2.汝应贪图汝之邻居的应用程序 3.汝应亲自寻找睿智的预言家 4. ...
- 用protractor測试canvas绘制(二)
上一篇写了通过webdriver在浏览器环境下异步调用js代码. 今天进入正题. 事实上有了executeAsyncScript,一切就呼之欲出了. 直接上代码: var compareImage=f ...
- ESP8266学习笔记1:怎样在安信可全功能測试板上实现ESP-01的编译下载和调试
近期调试用到了安信可的ESP-01模块,最终打通了编译下载调试的整个通道,有一些细节须要记录,方便兴许的开发工作. 转载请注明:http://blog.csdn.net/sadshen/article ...
- PCI OP WiFi 測试(二):PCI对OP的要求
PCI OP WiFi 測试(二):PCI对OP的要求 每次看PCI的文档.都一头雾水,本来就非常抽象.看英文就感觉更抽象.泛泛而谈的要求,看一次忘一次.仅仅好翻译成中文.没事就看看,知道指导思想. ...
- mongodb3.0 性能測试报告 二
mongodb3.0 性能測试报告 一 mongodb3.0 性能測试报告 二 mongodb3.0 性能測试报告 三 測试环境: 服务器:X86 pcserver 共6台 cpu: 单颗8核 ...
- Web安全測试二步走
Web安全測试时一个比較复杂的过程,软件測试人员能够在当中做一些简单的測试,例如以下: Web安全測试也应该遵循尽早測试的原则,在进行功能測试的时候(就应该运行以下的測试Checklist安全測试场景 ...
- 你的第一个AngularJS应用--教程二:基架、建立和測试的工具
介绍 有非常多可用的工具能够帮助你开发AngularJS 应用,那些非常复杂的框架不在我的讨论范围之中,这也是我開始这系列教程的原因. 在第一部分,我们掌握了AngularJS框架的基本结构,开发了第 ...
随机推荐
- 汇编语言第二版 程序在dos中执行情况.P86-87
假设程序要被dos系统加载到sa:0000的内存中,在这个地址的内存开始会有256个字节的PSP程序,用于加载程序和dos系统的通信.ds中的地址为sa. 真正的程序会在这256个字节之后.所以真正程 ...
- dojo 图表制作教程
http://www.sitepen.com/labs/code/charting/tutorial/tutorial1.html http://www.sitepen.com/labs/code/c ...
- 如何在Oracle11中配置st_shapelib
- hadoop2.2编程:自定义hadoop map/reduce输入文件切割InputFormat
hadoop会对原始输入文件进行文件切割,然后把每个split传入mapper程序中进行处理,FileInputFormat是所有以文件作为数据源的InputFormat实现的基类,FileInput ...
- 白书P61 - 点集配对问题
白书P61 - 点集配对问题 状压DP #include <iostream> #include <cstdio> #include <cstring> using ...
- Java问题汇集(1)
1.javax.el.PropertyNotFoundException: Property 'Price' not found on type pet.petshop.dto.WareDto 简答: ...
- 树莓PI安装web服务器
参考:http://www.eeboard.com/bbs/forum.php?mod=viewthread&tid=27383 http://www.eeboard.com/bbs/thre ...
- oracle rac存储安装
oracle rac 10.2 的在 linux 上的存储选项 博客分类: Oracle OracleLinux项目管理配置管理 Oracle 集群需要存储的软件和数据 项目 内容 最少磁盘空间 C ...
- 16道嵌入式C语言面试题
预处理器(Preprocessor) 1 . 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 ...
- HDOJ-ACM1071(JAVA) 定积分
这道题做起来有点无奈,定积分已经忘得差不多了~还可恶的去搜索了抛物线的解析式的求法~哈哈 不过求出来的结果不对...等有时间再去研究这个数学问题吧 - - 以下是JAVA实现: import java ...