面试题:Lua语言和Xlua热更
1、Lua如何调用C# 三种方式 第一种:官方不推荐 第二种:如果Resource文件下的Lua文件,使用Lua的Require函数即可 第三种:如果Lua文件是下载的,使用自定义Loader可满足
链接: C#调用Xlua文件.
<hr/>2、C#如何调用Lua
–
<hr/>3、资源如何打包?依赖项列表如何生成? 1.查找指定文件夹ABResource里的资源文件 ——Directory.GetFile(资源路径) ——新建AssetBundleBuild对象 ——获取资源名称,并赋值对应AB名称 ——获取各个资源的依赖项:通过UnityEditor.AssetDataBase类获取各个资源的依赖项 2.使用Unity自带的BuildPipeline进行构建AB包 ——BuildPipeLine.BuildAssetBundles(输出AB包路径) ——File.WriteAllLines(将依赖项写入文件里)
<hr/>4.如何解析版本文件?如何加载AB包资源?具体流程是怎么样的? 1.解析版本文件列表 ——File.ReadAllLines(读取文件列表资源路径URL) ——获取资源名称,获取AB包名称,获取依赖项,字典容器存储 ——获取Lua文件 2.加载资源 ——异步加载资源AB包,AssetBundleRequest请求,AssetBundle.LoadFromFileAsync ——先检查依赖项,再异步加载AB包依赖项 ——加载成功后都有对应的回调方法,将资源作为参数传入
<hr/>5、热更新方案有哪些?以及具体热更流程 1、整包:存放在上SteamingAssets里 ——策略:完整更新资源放在包里 ——优点:首次更新少 ——缺点:安装包下载时间长,首次安装久 2、分包 ——策略:少部分资源放在包里,大部分更新资源存放在更新资源器中 ——优点:安装包小,安装时间短,下载快 ——缺点:首次更新下载解压缩包时间旧 3、适用性 ——海外游戏大部分是使用分包策略,平台规定 ——国内游戏大部分是使用整包策略 4、文件可读写路径 ——Application.streamingAssestsPath 只读目录 ——Application.persistentDatapath 可读写目录 ——资源服务器地址URL 5、【从资源服务器】下载单个文件或多个文件 ——NetWoking.UnityWebRequest获取URL , HTTP GET , 连接资源服务器 ——获取到downloadHander的文件数据Data,完成后会回调方法,将文件Data作为参数传出 6、检查是否初次安装
<hr/>6、网络客户端C# 和 Lua
<hr/>7、Lua的GC原理是什么?如何避免GC内存泄露?
<hr/>8、简述Lua实现面向对象的原理??? 总结:对象标识、状态、类体系、继承、私有性 1.表table就是一个对象,对象具有了标识self,状态等相关操作 2. 使用参数self表示方法的该接受者是对象本身,是面向对象的核心点,冒号操作符可以隐藏该self参数 3. 类(Class):每个对象都有一个原型,原型(lua类体系)可以组织多个对象间共享行为 4. setmetatable(A,{__index=B}) 把B设为A的原型 5. 继承(Inheritance):Lua中类也是对象,可以从其他类(对象)中获取方法和没有的字段 6. 继承特性:可以重新定义(修改实现)在基类继承的任意方法 7. 多重继承:一个函数function用作__Index元方法,实现多重继承,还需要对父类列表进行查找方法,但多继承复杂性,性能不如单继承,优化,将继承的方法赋值到子类当中 8. 私有性(很少用)基本思想:两个表表示一个对象,第一个表保存对象的状态在方法的闭包中,第二个表用来保存对象的操作(或接口),用来访问对象本身。使第一个表完成内容私有性。
代码举例~~
--类 A={} B={} setmetatable(A,{__index=B}) --单继承 function Account:new(o) -- 传入self为Account o=o or {} self.__index = self --直接把表Account当做元表 setmetatable(o,self) return o end --多重继承 local function serach(k,plist) --在父类列表中查找k方法 for i = 1, #plsit do -- body local v = plist --第i个方法K if v then return v end--V存在 end end setmetatable(c,{__index=function(t,k) local v = search(k,parents)--serach方法(k是第K个,parents是父类列表) t=v --将方法保存进t数组里 return v end}) --私有性 function newAccount(initBalance) local self = {balance = initBalance} --self表示局部表,第一个表用来保存內部状态,私有性 local withdraw = function(v) self.balance = self.balance - v end local deposit = function(v) self.balance = self.balance + v end local getbalance = function() return self.balance end return{ withdraw = withdraw,deposit = deposit,getbalance = getbalance } --返回外部對象,方法名進行映射 end acc1=newAccount(100) acc1.deposit(10) print(acc1.getbalance()) --答案是110
<hr/>9、简述Lua有哪8个类型?简述用途? nil 空——可以表示无效值,全局变量(默认赋值为nil),赋值nil ,使其被删除 number 整数 table 表 —— string 字符 userdata 自定义 function 函数 bool 布尔 thread线程
页:
[1]