使用MoonSharp Lua访问结构体
2020-12-31 21:23:16
收藏:0
阅读:59
评论:1
我在通过Lua解释器MoonSharp来更改结构体成员的过程中遇到了问题。
我的测试环境如下所示:
class VectorClass
{
public float X;
public float Y;
public Vector2(float X, float Y)
{
this.X = X;
this.Y = Y;
}
}
struct VectorStruct
{
public float X;
public float Y;
public Vector2(float X, float Y)
{
this.X = X;
this.Y = Y;
}
}
测试时,我将向量对象作为类和结构传递。
[MoonSharpUserData]
class MyClass
{
public VectorClass VClass;
public VectorStruct VStruct;
public MyClass()
{
VClass = new VectorClass(0,0);
VStruct = new VectorStruct(0, 0);
}
}
这是包含结构体/类的类。
class Program
{
static void Main(string[] args)
{
Script script = new Script();
MyClass classic = new MyClass();
string scriptString = @"
function changeVelocity()
MyClass.VStruct.X = 10
MyClass.VClass.X = 10
end";
UserData.RegisterAssembly();
UserData.RegisterType<VectorClass>();
UserData.RegisterType<VectorStruct>();
script.Globals["MyClass"] = classic;
script.DoString(scriptString);
script.Call(script.Globals.Get("changeVelocity"));
Console.WriteLine("Class: " + classic.VClass.X);
Console.WriteLine("Struct: " + classic.VStruct.X);
Console.ReadKey();
}
}
在我的主程序中,我尝试更改结构体和类的值(仅限x),但仅适用于类。
我认为问题在于类是值类型而不是引用类型。 我正在使用一个强制使用结构体的API,这迫使我让结构体访问起作用,但我甚至不能使用MoonSharp ProxyType。
有没有人知道没有完全重写代码的解决方法?
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
是的,与类不同,结构体存储的是值,而不是引用,Moonsharp 对此不是真正好。一个简单的解决方法是让 Lua 函数 create 一个新值,甚至可以将其绑定到一个简单的 lambda 函数,就像这样:
string scriptString = @" function changeVelocity(MyClass) MyClass.VStruct = VStruct(10, MyClass.VStruct.Y) MyClass.VClass.X = 10 end"; UserData.RegisterAssembly(); UserData.RegisterType<VectorClass>(); UserData.RegisterType<VectorStruct>(); script.Globals["VStruct"] = (Func<float, float, VectorStruct>)((x, y) => { return new VectorStruct(x, y); }); script.DoString(scriptString); script.Call(script.Globals.Get("changeVelocity"), classic);在这里查看关于值类型的更多信息的词汇表中的最后一项: http://www.moonsharp.org/hardwire.html。