首页 > 编程语言 >xlua - lua中操作c#对象

xlua - lua中操作c#对象

时间:2024-02-28 22:45:24浏览次数:19  
标签:UnityEngine end v1 c# Vector3 xlua lua print

1, c#对象映射为lua的userdata

a) 默认情况,c#对象都是映射为lua的userdata,数据存放在c#层,调用函数也是走c#层。

function LuaUseVector3(v1, v2)
    v1.x = 10
    print(type(v1), v1.x, v1.y, v1.z)
    print("v1:", v1, "v2:", v2)
    print("v1+v2:", v1 + v2)
    v1:Set(v1.x - v2.x, v1.y - v2.y, v1.z - v2.z)
    print(v1)
    print(CS.UnityEngine.Vector3.Normalize(v1))
end

print("----before change metatable----")
LuaUseVector3(CS.UnityEngine.Vector3(1, 2, 3), CS.UnityEngine.Vector3(7, 8, 9))

 

b) 通过xlua.genaccessor在lua层直接操作c#层的数据

方法:把对c#层的函数替换为走lua层的函数

local get_x, set_x = xlua.genaccessor(0, 8) --0_offset, 8_float类型
local get_y, set_y = xlua.genaccessor(4, 8)
local get_z, set_z = xlua.genaccessor(8, 8)

local fields_getters = {
    x = get_x, y = get_y, z = get_z
}
local fields_setters = {
    x = set_x, y = set_y, z = set_z
}

local ins_methods = {
    Set = function(o, x, y, z)
        print("lua Vec3 Set")
        set_x(o, x)
        set_y(o, y)
        set_z(o, z)
    end
}

local mt = {
    __index = function(o, k)
        if ins_methods[k] then return ins_methods[k] end --调用Vector3的Set函数, 变成调用lua这边的Set
        return fields_getters[k] and fields_getters[k](o)
    end,

    __newindex = function(o, k, v)
        if fields_setters[k] then fields_setters[k](o, v) else error('no such field ' .. k) end
    end,

    __tostring = function(o)
        return string.format('vector3 { %f, %f, %f}', o.x, o.y, o.z)
    end,

    __add = function(a, b)
        print("lua Vec3 add")
        return CS.UnityEngine.Vector3(a.x + b.x, a.y + b.y, a.z + b.z)
    end
}

xlua.setmetatable(CS.UnityEngine.Vector3, mt) --对c#的调用, 映射为对metatable的调用
print("----after change metatable----")
LuaUseVector3(CS.UnityEngine.Vector3(1, 2, 3), CS.UnityEngine.Vector3(7, 8, 9))

 

 

2, c#对象映射为lua的table

local LuaVec3Obj = {}
LuaVec3Obj.__index = LuaVec3Obj

function LuaVec3Obj:__tostring()
    return string.format("struct { %d, %d}", self.x, self.y)
end

function LuaVec3Obj:SwapXY()
    self.x, self.y = self.y, self.x
end

xlua.setmetatable(CS.UnityEngine.Vector3, LuaVec3Obj) --对c#的调用, 映射为对metatable的调用

local LuaVec3Clazz = {}

LuaVec3Clazz.__call = function(_, x, y, z) --对应c#层new的调用
    print("LuaVec3: new Vector3")
    local obj = {x = x, y = y, z = z}
    setmetatable(obj, LuaVec3Obj)
    return obj
end
setmetatable(LuaVec3Clazz, LuaVec3Clazz)

function LuaVec3Clazz.Print(o) --对应c#层静态函数的调用
    print("LuaVec3: Print", type(o), o)
end

xlua.setclass(CS.UnityEngine, "Vector3", LuaVec3Clazz) --c#层new或静态函数的调用, 映射为lua层的调用


local vec3 = CS.UnityEngine.Vector3(1, 2, 3)
print(type(vec3), vec3)
CS.UnityEngine.Vector3.Print(vec3)
vec3:SwapXY()
print(vec3)

 

标签:UnityEngine,end,v1,c#,Vector3,xlua,lua,print
From: https://www.cnblogs.com/sailJs/p/18040375

相关文章

  • 数组关系_ABC342_D - Square Pair
    目录问题概述思路想法参考代码问题反思问题概述原题参考:D-SquarePair对于长度为n的数组,给出满足要求的数对对数:i<ja[i]*a[j]是一个平方数思路想法其实和以前的数组关系那题差不多,也是找关系,就是关系找不出来而已,对于两数相乘为平方数应该怎么考虑,可以知道对于任意数......
  • Java访问权限之public、protected、private详解——【包和访问控制】【访问权限控制】
    @目录包和访问控制包声明和导入访问权限控制源码:Giteehttps://gitee.com/drip123456/java-seGIthubhttps://github.com/Drip123456/JavaSE专栏:JavaSE笔记专栏包和访问控制通过前面的学习,我们知道该如何创建和使用类。包声明和导入包其实就是用来区分类位置的东西,也可......
  • xlua - c#访问lua函数
    lua代码Assets/Lua/Test1.lua.txtfunctionIntParam(p)print("~~~~~IntParam")print(type(p),p)print("~~~~~")returnpendfunctionVec3Param(p)print("~~~~~Vec3Param")print(type(p),p.x,p.y,p.z)......
  • 454. 四数相加 II C
    自己写了一个hash表。原来学过的数据结构关于hash的那章还是有实际用的,不是书架子。typedefstructnode{intsum;intcount;structnode*repeatnext;}hash;voidinit_hashtable(hashh[]){for(inti=0;i<127;i++){h[i].sum=0;h[i].......
  • CSP2023 游寄
    你不会T1你会什么题啊,你一题不会你打个锤子啊——老KDay-2最后一场模拟赛,T3被卡常挂了50,T4没读懂题直接爆0。3场模拟赛一崩到底,喜提倒数,寄。Day-1上午动员大会,连线到了lk,真好。然后pty讲了些小技巧,模拟赛中经常因为奇怪错误挂分的我被反复鞭尸。下午和几个巨......
  • CSP-S总结
    时间分配:T1:30min,T3:1.5h,T4:1.5h,剩下交给T2。T1:签到题,秒了。做法:直接枚举密码状态暴力校验。估分:100(话说某人貌似看到我10min开始测样例心态直接爆炸了)T2:感觉难度绿里绿气的,但一直不会。直接写了个区间dp,然后想到枚举左端点向右扩展,用栈维护,拿到50。然后一直感觉栈的......
  • centos中无法访问外网排除点
    1,查看网卡信息一般在Centos中网卡所在位置是/etc/sysconfig/network-scripts/目录下,找到对应网卡查看即可2,查看防火墙信息查看防火墙状态firewall-cmd--state如果防火墙状态是runing,则建议关闭systemctlstopfirewalld,永久关闭开机不启动systemctldisablefirewalld......
  • RHCE高级权限和文件系统
    一:高级用户组和用户权限1:密码策略1:含义密码策略就是设置密码的一些属性,如什么时候密码过期等修改的就是这个配置文件/etc/shadow这里面的参数user2:!!:19768:0:99999:7:::第一个字段:用户名第二个字段:密码占位符,!!表示没有密码,!表示密码被锁定了,*有密码第三个字段:1970年1......
  • CF836F 做题笔记
    传送门非常好题目,使我原地旋转。首先数据这么小显然直接暴力求出每个\(A_i\)的取值范围。由于每个\(A_i\)只能有一个取值,所以源点先给所有\(A_i\)连一个限流为\(1\),费用为\(0\)的边。同时显然还要给每个值域点(不是\(A_i\))向汇点连限为\(inf\),费用为\(0\)的边......
  • java中的break与continue
    breakbreak:打破结束终止注意事项:1、break不能单独使用,毫无意义2、要在switch语句或者循环语句中使用packagecom.shujia.day03;publicclassBreakDemo{publicstaticvoidmain(String[]args){//需求:循环输出1-5当i为3的时候,使用break......