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框架的基本结构,开发了第 ...
随机推荐
- FZU 2150 Fire Game(BFS)
点我看题目 题意 :就是有两个熊孩子要把一个正方形上的草都给烧掉,他俩同时放火烧,烧第一块的时候是不花时间的,每一块着火的都可以在下一秒烧向上下左右四块#代表草地,.代表着不能烧的.问你最少花多少时间 ...
- java区分大小写,使用TAB进行缩进,public类名只能有一个,而且文件名与类名保持一致.
java的类必须大写 java区分大小写,使用TAB进行缩进,public类名只能有一个,而且文件名与类名保持一致. 在dos用上下箭头,调用已用过的命令
- Android WebView 开发详解(一)
转载请注明出处 http://blog.csdn.net/typename/article/details/39030091 powered by meichal zhao 概览: Android ...
- Joda-Time
任何企业应用程序都需要处理时间问题.应用程序需要知道当前的时间点和下一个时间点,有时它们还必须计算这两个时间点之间的路径.使用 JDK 完成这项任务将非常痛苦和繁琐.现在来看看 Joda Time,一 ...
- rails3 Bundle简介
Rails 3开始使用bundle来管理项目的gem依赖.该命令只在一个含有Gemfile的目录下执行. Gemfile: Rails 项目所有的依赖包都在这里配置,不像以前通过require来查找 ...
- 创建WCF的客户端
How to: Create a Windows Communication Foundation Client To create a Windows Communication Foundatio ...
- hdu1838Chessboard(DP)
http://acm.hdu.edu.cn/showproblem.php?pid=1838 其实原先不知道这题是DP 我都想不到DP去 想了想没思路 看了下题解 经典思路 :第n大的都是由第n-1大 ...
- C#创建Excel文件并将数据导出到Excel文件
工具原料: Windows 7,Visual Studio 2010, Microsoft Office 2007 创建解决方案 菜单>新建>项目>Windows窗体应用程序: 添加 ...
- MongoDB中ObjectId的误区,以及引起的一系列问题
近期对两个应用进行改造,在上线过程中出现一系列问题(其中一部分是由于ObjectId误区导致的) 先来了解下ObjectId: TimeStamp 前 4位是一个unix的时间戳,是一个int类别,我 ...
- c语言时间库函数#include<time.h>
日期与时间函数<time.h> 头文件<time.h>中说明了一些用于处理日期和时间的类型和函数.其中的一部分函数用于处理当地时间,因为时区等原因,当地时间与日历时间可能不相同 ...