找回密码
 立即注册
查看: 235|回复: 0

自学xLua时的几个小问题

[复制链接]
发表于 2022-5-17 13:39 | 显示全部楼层 |阅读模式
对于大部分问题大家可参考官方文档,这里仅记录笔者学习过程中的问题
1. xLua安装问题



将Assets目录下的文件全部复制粘贴到Unity工程的Assets目录下即可,可以简单看到有两个Unity特有的meta文件,不用引擎自动生成。
2. try to dispose a luaenv with c# callback的错误问题

错误原因主要是以下两个:

  • 在同一个方法中创建了delegate的引用,但又立即释放引用并调用了LuaEnv.Dispose()
[CsharpCallLua]
public delegate double LuaMax(double a, double b)
void Start()
        {
            LuaEnv luaenv = new LuaEnv();
            var max = luaenv.Global.GetPath<LuaMax>("math.max");
            Debug.Log(max(1,2));
            max = null;
            luaenv.Dispose();
        }
解决办法:在类内方法外定义Lua虚拟机,释放delegate对Lua方法的引用和LuaEnv.Dispose()这两步写在不用的方法中。

  • 没有在C#侧释放标记有[CSharpCallLua]的delegate(赋值为null)
3. [System.Serializable]特性的作用

Serializable是.Net自带的序列化,有时候我们会自定义一些单独的class/struct,,由于这些类并没有从 MonoBehavior 派生,所以默认并不被Unity3D识别为可以Serialize的结构,自然也就不会在Inspector中显示。我们可以通过添加 [System.Serializable]这个Attribute使Unity3D检测并注册这些类为可Serialize的类型。具体做法如下:
[System.Serializable]
public class FooBar
{     
    public int foo = 5;     
    public int bar = 10;

PS:Serializable只可以对class,struct,enum,delegate进行序列化,不可以对属性序列化;
还有[SerializeField] Attribute,强制unity去序列化一个私有域。
PS:这里在单机游戏上有一个游戏存档的应用,相比于PlayerPrefs的方式,可以结构化地存储游戏存档,具体方式为C#序列化的方式,将游戏数据类定义可序列化特性(只会序列化属性,不会序列化函数),由BinaryFormatter.Serialize将序列化数据转换为二进制字节流存储在本地,加载游戏时同样由BinaryFormatter.Deserialize将游戏存档反序列化之后读取出来。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-27 06:34 , Processed in 0.090012 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表