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方法中处理场景载入对象的实例化过程,这可能并非最佳的方式。若有不正之处或是好的想法。欢迎大家与我交流。

    本文出自杜晓萌的博客,未经特殊表明皆为本人原创,请勿用于不论什么商业用途。转载请保持完整性并标明出处:http://blog.csdn.net/haohan_meng

Unityclient通信測试问题处理(二)的更多相关文章

  1. Unityclient通信測试问题处理(一)

    Unityclient通信測试问题处理(一) 近期在測试程序的通信模块时.遇到了一个问题:Unity的API函数仅仅能在主线程中调用.而作为client程序,我单独启用了一个监听线程来接收服务端发送的 ...

  2. 谈谈单元測试之(二):測试工具 JUnit 3

    前言 上一篇文章<为什么要进行烦人的单元測试?>讨论了一下现阶段软件开发中,程序猿们測试情况的现状.这篇文章中,我打算介绍一下单元測试的工具(插件).而且推荐大家以后在开发中,真正的用上单 ...

  3. James Whittaker的软件測试戒律(二)

    摘录自<探索式软件測试>(注:作者模仿了圣经十诫的语气和内容编写了软件測试戒律) 1.汝应用大量输入重复锤炼汝之应用程序 2.汝应贪图汝之邻居的应用程序 3.汝应亲自寻找睿智的预言家 4. ...

  4. 用protractor測试canvas绘制(二)

    上一篇写了通过webdriver在浏览器环境下异步调用js代码. 今天进入正题. 事实上有了executeAsyncScript,一切就呼之欲出了. 直接上代码: var compareImage=f ...

  5. ESP8266学习笔记1:怎样在安信可全功能測试板上实现ESP-01的编译下载和调试

    近期调试用到了安信可的ESP-01模块,最终打通了编译下载调试的整个通道,有一些细节须要记录,方便兴许的开发工作. 转载请注明:http://blog.csdn.net/sadshen/article ...

  6. PCI OP WiFi 測试(二):PCI对OP的要求

    PCI OP WiFi 測试(二):PCI对OP的要求 每次看PCI的文档.都一头雾水,本来就非常抽象.看英文就感觉更抽象.泛泛而谈的要求,看一次忘一次.仅仅好翻译成中文.没事就看看,知道指导思想. ...

  7. mongodb3.0 性能測试报告 二

    mongodb3.0 性能測试报告 一 mongodb3.0 性能測试报告 二 mongodb3.0 性能測试报告 三 測试环境: 服务器:X86 pcserver   共6台 cpu:  单颗8核 ...

  8. Web安全測试二步走

    Web安全測试时一个比較复杂的过程,软件測试人员能够在当中做一些简单的測试,例如以下: Web安全測试也应该遵循尽早測试的原则,在进行功能測试的时候(就应该运行以下的測试Checklist安全測试场景 ...

  9. 你的第一个AngularJS应用--教程二:基架、建立和測试的工具

    介绍 有非常多可用的工具能够帮助你开发AngularJS 应用,那些非常复杂的框架不在我的讨论范围之中,这也是我開始这系列教程的原因. 在第一部分,我们掌握了AngularJS框架的基本结构,开发了第 ...

随机推荐

  1. PHP reset() 函数

    定义和用法 reset()函数把数组的内部指针指向第一个元素,并返回这个元素的值.若失败,则返回 FALSE. reset()函数用来将数组指针设置回数组的开始位置.如果需要在一个脚本中多次查看或处理 ...

  2. Java中对List集合的排序

    方法一: 第一种方法,就是list中对象实现Comparable接口,代码如下: 实体类: public class Person implements Comparable<Person> ...

  3. [杂题]CSUOJ1413 Area of a Fractal

    题目链接 题意:题中给了图,所以不看字大概也知道  求的是第n个图形的面积. 就是找规律 递推 一类的... 先给结论: 很鬼畜的公式:    $\displaystyle\frac{3\times ...

  4. 批量生成卡号密码的php程序

    <?php header('Content-Type:text/html; charset=utf-8'); function MakeCard() { set_time_limit(0); / ...

  5. .Net remoting, Webservice,WCF,Socket区别

    传统上,我们把计算机后台程序(Daemon)提供的功能,称为"服务"(service).比如,让一个杀毒软件在后台运行,它会自动监控系统,那么这种自动监控就是一个"服务& ...

  6. Windows系统性能提升方法

    看前提醒:在确认没有病毒和流氓软件的前提下,建议优化电脑:以下操作已经在Win7上试验,Win7以上的园友自己试验,自己感受,对电脑无害,但操作时请务必小心 设置虚拟内存 虚拟内存最小值物理内存1.5 ...

  7. BZOJ_4326_[NOIP2015]_运输计划_(二分+LCA_树链剖分/Tarjan+差分)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=4326 给出一棵带有边权的树,以及一系列任务,任务是从树上的u点走到v点,代价为u到v路径上的权 ...

  8. msvc2010生成的指令序列有问题,可能跟pgo有关

    正常序列 有问题序列 这段代码程序启动是执行,会导致崩溃 工程使用ltcg pgo,也就是说,第一次编译连接完成后,会跑一次profile,再执行连接器代码生成优化. 构建记录显示,ltcg已跑完,说 ...

  9. 如何使用eclipse进行嵌入式Linux的开发

    如何使用eclipse进行嵌入式Linux的开发 作者:曾宏安,华清远见嵌入式学院高级讲师. 如何使用eclipse进行嵌入式Linux的开发 习惯了在windows环境下开发的程序员在转到Linux ...

  10. import project后,出现Unable to get system library for the project

    import project 后,出现Unable to get system library for the project. 这是因为在import 一个项目的时候,没有指定android sdk ...