unity+xlua开发中的问题笔记
转载请标明出处:http://www.cnblogs.com/zblade/
一、概述
整理遇到的一些较难处理的bug,总结相关经验
二、主要问题
2.1 material类型的依赖修改
对于material类型的asset,如果修改了其shader,对应的texture也修改了,并不会立刻刷新,从而导致以前的依赖的texture也会被打入到当前的ab依赖关系中。解决办法,对于material类型,则通过EditorUtility.CollectDependencies 来剔除这种冗余的依赖,具体代码示例:
if(isMat)
{
dependencies = AssetDatabase.GetDependencies(asset, false);
UnityEngine.Object[] colDep = EditorUtility.CollectDependencies(new UnityEngine.Object[] { AssetDatabase.LoadAssetAtPath(asset, typeof(Material)) });
HashSet<string> filterd = new HashSet<string>();
foreach (var item in dependencies)
{
foreach (var item1 in colDep)
{
if (item.Contains(item1.name))
{
filterd.Add(item);
break;
}
}
}
dependencies = filterd.ToArray();
}
2.2 gitlab向jenkins推送的webhook,如何判断其来自哪个分支
对于gitlab推送的webhook,需要判断其来自哪个分支,从而切换打包机到指定的分支进行相关工作。在mac的环境下,可以通过特殊的操作获取其推送的分支信息:
在每次gitlab推送信息到mac打包机的时候,当前mac的环境变量中有一个关键环境变量: gitlabTargetBranch,通过获取该关键环境变量,可以得到对应的分支信息
--python 获取方式
git_branch = os.getenv('gitlabTargetBranch')
2.3 lua虚拟机的重启
在热更新机制中,如果在热更新完成后,需要重启lua虚拟机,在xlua的机制下,需要注意,重启lua虚拟机的操作,不能来自于lua端,只能是来自于c#端,也就是lua不能自己调用自己的重启。
2.4 同步加载bundle和异步加载bundle的处理
在游戏中,启动异步加载某个bundle的时候,如果后续有同步加载该bundle的操作触发,需要打断异步加载操作,可以通过异步加载操作直接获取bundle的方式打断异步,具体的示例代码:
AssetBundleCreateRequest abRequest = AssetBundle.LoadFromFileAsync(path);
//这步操作,会直接获取bundle,从而打断异步加载操作
AssetBundle ab = abRequest.assetBundle;
if (ab == null)
{
ab = AssetBundle.LoadFromFile(path);
var assets = ab.LoadAllAssets();
foreach (var item in assets)
{
Debug.Log(item.name);
}
}
else
{
var assets = ab.LoadAllAssets();
foreach(var item in assets)
{
Debug.Log(item.name);
}
}
2.5 场景bundle丢失lightmap(光照贴图)的问题
在某些场景bundle中,已经将相关的lightmap打入bundle中,但是对应的实际运行时并没有将相关的lightmap加载进来,用AssetStudio发现bundle中实际是有的。可能原因是bundle有,但是并没有关联。这时候需要修改unity的相关设置:
在Edit->Project Setting -> Graphics,找到 Shader Stripping, 将Lightmap modes从Automatic改成Custom, 勾选Baked Non-Directional,然后重新打bundle,编译后的bundle就不会出现lightmap丢失的问题了
2.6 XLua基类拓展方法的坑
在xlua中,对基类拓展的实现:
首先,在c#端加上拓展实现:
namespace UnityEngine
{
[XLua.LuaCallCSharp]
public static class ExtMethodLua
{
public static void SetActive( this Component c, bool value)
{
c.gameObject.SetActive(value);
}
}
}
有哪些坑?
1)对于拓展的基类和其拓展类,均需要添加[XLua.LuaCallCSharp]的标签
问题解决:在生成代码的时候,如果对某个类型进行了拓展,也需要将该类型打上对应的标签,不能只单独给拓展类打标签。
如果只给拓展类打标签,则只会生成拓展类的wrap文件,不会生成基类的wrap文件,那么基类中就不会包含这个拓展方法,所以会出现找不到该方法的报错。
2)不执行生成代码,不带标签,反射不会执行拓展方法
在XLua中,lua和c#的交互,有两种方式,一种是以wrap文件的方式,执行lazy加载,在交互的时候调用。
一种是反射的方式,那么为什么没有wrap的时候,启动反射的方式,会查找不到拓展类的拓展方法?
XLua自身在执行反射的时候,是修改了反射中对方法的获取方式,需要标记为LuaCallCSharp/ ReflectionUse,才能被获取到
2.7 健全的处理同步和异步的机制
由于游戏中既有同步加载操作,又有异步加载操作,异步加载操作又可能是多个同时触发,需要进行粒度的控制,这就需要较为健全的处理同步和异步的机制。首先设定同步优先级更高,每当有同步操作到来的时候,如果有同样的异步操作,需要打断异步操作,直接执行同步操作。
此外多个异步操作排队,造成第一个异步操作和最后一个异步操作的间隔较大,可能轮询到最后一个异步操作的时候,最开始的环境已经变换,相关的依赖判断需要再次判断,否则会带来隐藏bug.
2.8 局内战斗相关问题
如何设计一个高效,易拓展,健全,鲁棒性高的战斗系统,是一个持续开发的过程。最佳的实现思路,是首先确定需要什么样的表现效果,基于效果反推操作模式,基于操作模式,确定技能流程,从而确立整体的流程。
程序在实现的过程中,应该以表现方案为基准,进而设计相关的代码架构,同时兼容拓展性,便于后期的需求变更。
如果要做逻辑和表现分离类型游戏,一定要严格把控逻辑与表现的耦合。逻辑端要做到完全自运行,不依赖任何表现端的数据,逻辑端只负责发送相关指令/调用API给表现层即可。
当然,实际的执行时候,表现端总会来干扰逻辑端的自运行,这时候就需要双方做沟通,保持逻辑端的自封闭的基准下,解除耦合,让表现端尽量自运行。
今天先写到这儿,后续再更新
unity+xlua开发中的问题笔记的更多相关文章
- 【Unity游戏开发】浅谈Unity游戏开发中的单元测试
一.单元测试的定义与作用 单元测试定义:单元测试在传统软件开发中是非常重要的工具,它是指对软件中的最小可测试单元进行检查和验证,一般情况下就是对代码中的一个函数去进行验证,检查它的正确性.一个单元测试 ...
- 【FLEX教程】#008 开发中的问题笔记(慢更…)
在这里记录一下个人在FLEX开发中遇到的一些问题.方便一些遇到同样问题的朋友们,能够快速的解决这些问题. 这篇笔记我会慢慢的更新,(PS:有遇到问题就往上面更….) 2015年1月4日 12:53:5 ...
- Unity游戏开发中的内存管理_资料
内存是手游的硬伤——Unity游戏Mono内存管理及泄漏http://wetest.qq.com/lab/view/135.html 深入浅出再谈Unity内存泄漏http://wetest.qq.c ...
- Qt开发中的实用笔记一--xml,Qpainter,Delegate:
因为开发环境不能联网,开发中用到有用的知识就记在word稳定中,不知不觉就记载了几十页,为避免笔记丢失,现在就一点点忘博客上搬,方便日后回顾! ---------------------------- ...
- Qt开发中的实用笔记三--关于各种类的零碎知识点:
1,QUuid()创建唯一标识码,在创建数据库实体ID和链接数据库QSqlDatabase时非常方便 2,QScrollArea与QScrollBar,如果是要在widget中添加窗口滑动QScrol ...
- Qt开发中的实用笔记二--中文转码问题和string转换问题:
一,中文乱码转码问题 1,转码三句话:window下默认是GBK格式,linux下默认是UTF-8,看情况转换UTF-8/GBK QTextCodec::setCodecForTr(QTextCode ...
- 【Unity游戏开发】浅谈Lua和C#中的闭包
一.前言 目前在Unity游戏开发中,比较流行的两种语言就是Lua和C#.通常的做法是:C#做些核心的功能和接口供Lua调用,Lua主要做些UI模块和一些业务逻辑.这样既能在保持一定的游戏运行效率的同 ...
- 【Unity游戏开发】用C#和Lua实现Unity中的事件分发机制EventDispatcher
一.简介 最近马三换了一家大公司工作,公司制度规范了一些,因此平时的业余时间多了不少.但是人却懒了下来,最近这一个月都没怎么研究新技术,博客写得也是拖拖拉拉,周六周天就躺尸在家看帖子.看小说,要么就是 ...
- [Unity游戏开发]向量在游戏开发中的应用(三)
本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/51088236 在上一篇博客中讲了利用向量点乘在游戏开发中应用的几种情景.本 ...
随机推荐
- ConcurrentLinkedQueue简介
ConcurrentLinkedQueue是一个基于链表的无界线程安全队列,非阻塞实现方式,先进先出,适合高并发的场景. 非阻塞的性能较好,采用CAS,避免加锁的时间,保证数据一致性. 采用" ...
- Oracle系列-锁表与解锁解决方案(大招版)-解决问题才是王道
[Oracle系列-锁表与解锁解决方案(大招版)] --1查看被锁的表 select b.owner,b.object_name,a.session_id,a.locked_mode from v$l ...
- 伪元素before after
什么是伪元素(Pseudo element)? 伪元素不是真正的元素,不存在与文档之中,所以js无法操作他.那为什么叫他"元素"?因为我们可以对其进行跟元素几乎无差别的操作. 伪元 ...
- 你真的知道final关键字吗?
概述 final在英文中是最终的,不可更改的.在Java中final修饰变量,函数和类,就像这个单词的意思,一旦使用赋值之后不可更改. final修饰的变量不可以被改变 finalTest类 publ ...
- socketserver实现并发
socketserver实现并发原理:给每一个前来链接的客户端开启一个线程执行通信.也就是给每一个连接“配备”了一个管家. 下面用一个简单的示例来演示socketserver实现并发(一个服务端,两个 ...
- SpringBoot SpEL表达式注入漏洞-分析与复现
目录 0x00前言 0x01触发原因 0x02调试分析 0x03补丁分析 0x04参考文章 影响版本: 1.1.0-1.1.12 1.2.0-1.2.7 1.3.0 修复方案:升至1.3.1或以上版本 ...
- KnockOut 绑定之foreach绑定
foreach绑定对于数组中的每一个元素复制一节标记语言,也就是html,并且将这节标记语言和数组里面的每一个元素绑定.当我们呈现一组list数据,或者一个表格的时候,十分有用. 如果你绑定的数组是一 ...
- 强化学习(十四) Actor-Critic
在强化学习(十三) 策略梯度(Policy Gradient)中,我们讲到了基于策略(Policy Based)的强化学习方法的基本思路,并讨论了蒙特卡罗策略梯度reinforce算法.但是由于该算法 ...
- 强化学习(十三) 策略梯度(Policy Gradient)
在前面讲到的DQN系列强化学习算法中,我们主要对价值函数进行了近似表示,基于价值来学习.这种Value Based强化学习方法在很多领域都得到比较好的应用,但是Value Based强化学习方法也有很 ...
- 【Java】广州三本秋招经历
前言 只有光头才能变强 离上次发文章已经快两个月时间了,最近一直忙着秋招的事.今天是2018年10月22日,对于互联网行业来说,秋招就基本结束了.我这边的流程也走完了(不再笔试/面试了),所以来写写我 ...