Unity客户端通信测试问题处理(二)
来源:互联网 发布:吴昕的淘宝店网址链接 编辑:程序博客网 时间:2024/05/17 05:15
Unity客户端通信测试问题处理(二)
在客户端的通信测试过程中,场景加载的问题给自己带来了不小的麻烦。因为消息的解析方法在单独的监听线程中调用,这也就意味着无法在消息的解析方法中调用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方法中处理场景加载对象的实例化过程,这可能并不是最佳的方式。若有不正之处或是好的想法,欢迎大家与我交流。
- Unity客户端通信测试问题处理(二)
- Unity客户端通信测试问题处理(一)
- Unity 客户端框架(二):单例基类
- Golang服务器,Unity客户端 通信
- Unity客户端与后台通信
- Unity网络通信(二)Unity Network 聊天
- Unity网络通信(二)Unity Network 聊天
- Unity网络通信(二)Unity Network 聊天
- XMPP iOS客户端开发(二) 通信
- socket实现客户端与服务端通信(二)客户端
- 性能-客户端测试(二)
- Unity中的Socket通信(多个客户端的异步通信)
- unity csharp socket 异步通信 客户端
- Unity客户端优化之CPU(二):GC
- 使用 Socket 通信实现 FTP 客户端程序(二)
- Linux socket编程(二) 服务器与客户端的通信
- Linux socket编程(二) 服务器与客户端的通信
- socket编程(二)通过服务端实现客户端之间通信
- windows程序设计之绘图基础之点和线的绘制
- Operating system error number 13 in a file operation
- java基础面向对象(下)
- 快速选择(QuickSelect)的平均时间复杂度分析
- 题目1031:xxx定律 题目1033:xxx定律
- Unity客户端通信测试问题处理(二)
- codeforces 484A Bits 贪心->位数
- web1.0和web2.0的HTML常用标签
- Bloom Filter 主流Hash散列算法介绍
- HTTP 权威指南学习计划
- IOS MKNetwork从网站api获取数据出现Server [xxx] is reachable via Wifi
- 异常
- NVL函数误区
- 单链表的基本操作