unity+xlua开发中的问题笔记

转载请标明出处:http://www.cnblogs.com/zblade/

1、概述

整理遇到的一些较难处理的bug,总结相关经验python

2、主要问题

2.1 material类型的依赖修改

对于material类型的asset,若是修改了其shader,对应的texture也修改了,并不会马上刷新,从而致使之前的依赖的texture也会被打入到当前的ab依赖关系中。解决办法,对于material类型,则经过EditorUtility.CollectDependencies 来剔除这种冗余的依赖,具体代码示例:git

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,经过获取该关键环境变量,能够获得对应的分支信息web

--python 获取方式 git_branch = os.getenv('gitlabTargetBranch') 

2.3 lua虚拟机的重启

在热更新机制中,若是在热更新完成后,须要重启lua虚拟机,在xlua的机制下,须要注意,重启lua虚拟机的操做,不能来自于lua端,只能是来自于c#端,也就是lua不能本身调用本身的重启。c#

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#端加上拓展实现:gitlab

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文件,那么基类中就不会包含这个拓展方法,因此会出现找不到该方法的报错。ui

2)不执行生成代码,不带标签,反射不会执行拓展方法
在XLua中,lua和c#的交互,有两种方式,一种是以wrap文件的方式,执行lazy加载,在交互的时候调用。
一种是反射的方式,那么为何没有wrap的时候,启动反射的方式,会查找不到拓展类的拓展方法?
XLua自身在执行反射的时候,是修改了反射中对方法的获取方式,须要标记为LuaCallCSharp/ ReflectionUse,才能被获取到this

2.7 健全的处理同步和异步的机制

因为游戏中既有同步加载操做,又有异步加载操做,异步加载操做又多是多个同时触发,须要进行粒度的控制,这就须要较为健全的处理同步和异步的机制。首先设定同步优先级更高,每当有同步操做到来的时候,若是有一样的异步操做,须要打断异步操做,直接执行同步操做。
此外多个异步操做排队,形成第一个异步操做和最后一个异步操做的间隔较大,可能轮询到最后一个异步操做的时候,最开始的环境已经变换,相关的依赖判断须要再次判断,不然会带来隐藏bug.lua

2.8 局内战斗相关问题

如何设计一个高效,易拓展,健全,鲁棒性高的战斗系统,是一个持续开发的过程。最佳的实现思路,是首先肯定须要什么样的表现效果,基于效果反推操做模式,基于操做模式,肯定技能流程,从而确立总体的流程。
程序在实现的过程当中,应该以表现方案为基准,进而设计相关的代码架构,同时兼容拓展性,便于后期的需求变动。
若是要作逻辑和表现分离类型游戏,必定要严格把控逻辑与表现的耦合。逻辑端要作到彻底自运行,不依赖任何表现端的数据,逻辑端只负责发送相关指令/调用API给表现层便可。
固然,实际的执行时候,表现端总会来干扰逻辑端的自运行,这时候就须要双方作沟通,保持逻辑端的自封闭的基准下,解除耦合,让表现端尽可能自运行。   

今天先写到这儿,后续再更新

相关文章
相关标签/搜索