Unity ToLua框架整理(一) C#和lua函数调用

2023-11-04

记录下 方便自己用,代码已加注释,就不多说了,应该能看懂

1.C#调用Lua代码

Lua代码
lua代码放在tolua自带的lua目录,建议下个LuaBuilder配合VS2017使用
在这里插入图片描述

local GameObject = UnityEngine.GameObject	
local Input = UnityEngine.Input
local Vector3=UnityEngine.Vector3
local Transform=UnityEngine.Transform
local obj
--输出测试
function LDebug(args)
    print("LTest Coming!!!!")
end
--lua函数传参测试
function LInputValue( param)
    print('[lua中调用:]InputValue方法传入参数:'..tostring( param))
end
--unityAPI测试
function LFindCube(args)
    obj=GameObject.Find("Sphere")
	print(obj.name)
end
--添加标签设置
function LAddRig(args)
	obj:AddComponent(typeof(Rigidbody))
end
--物品移动测试
function LCubeMove(args)
    obj.transform:Translate(Vector3(2,2,2))
end
--控制物体测试
function LSphereCtrl()
	local h = Input.GetAxis("Horizontal")
	local v = Input.GetAxis("Vertical")
	obj.transform:Translate(Vector3(h,0,v))
end
--控制物体传参测试
function LObjCtrl(go)
	local hor = Input.GetAxis("Horizontal")
	local ver = Input.GetAxis("Vertical")
	go.transform:Translate(Vector3(hor,0,ver))
end


C#代码
这个随便放

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using LuaInterface;
public class TestToLua : MonoBehaviour
{
    public GameObject cube;
    private LuaState lua = null;
    //创建一个存放Lua类里面函数的载体
    private LuaFunction luaFunc = null;		
    private void Awake()
    {
        lua = new LuaState();
        lua.Start();
        //用来把Wrap.lua里的类和相应的Wrap类
        LuaBinder.Bind(lua);
        //引用读取lua文件
        lua.DoFile("LTest.lua");
    }
    void Start()
    {
        //输出测试
        CallFunc("LDebug");	
        //函数传参测试
        UseParameter();
        //找到物体
        CallFunc("LFindCube");
        //物体移动
        CallFunc("LCubeMove");
    }

    private void Update()
    {
        //虚拟轴控制移动
        SphereMoveCtrl();
        //虚拟轴控制移动 传参
        ObjCtrlParameter("LObjCtrl",cube);
    }
  
    void CallFunc(string func)
    {
        //此处的func因该为lua脚本中的table类的名字,而不是lua本文件名的名字
        luaFunc = lua.GetFunction(func);
        //开始调用Lua脚本里面的函数
        luaFunc.Call();
    }
    /// <summary>
    /// 移动不传参
    /// </summary>
    void SphereMoveCtrl()
    {
        LuaFunction valueFunc = lua.GetFunction("LSphereCtrl");
        valueFunc.Call();
    }
    /// <summary>
    /// 移动传参
    /// </summary>
    /// <param name="str"></param>
    /// <param name="obj"></param>
    void ObjCtrlParameter(string str,GameObject obj)
    {
        LuaFunction valueFunc = lua.GetFunction(str);
        valueFunc.Call(obj);
    }
    /// <summary>
    /// 传参
    /// </summary>
    void UseParameter()
    {
        LuaFunction valueFunc = lua.GetFunction("LInputValue");
        valueFunc.BeginPCall();
        valueFunc.Push("--push方法从C#中传入参数--");
        valueFunc.PCall();
        valueFunc.EndPCall();
        valueFunc.Call("--直接Call方法从C#传入参数--");
    }
}


2.Lua调用C#方法、参数

C#代码
类记得在CustomSetting里注册,否则报错不能用
在这里插入图片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class UseLua : MonoBehaviour
{
    public GameObject cube;
    public GameObject sphere;
    public void CDebugger()
    {
        Debug.Log("C#  coming!!!!");
    }
    public void CFindObj()
    {
        cube = GameObject.Find("Cube");
        sphere = GameObject.Find("Sphere");
    }
    public void CSphereMove()
    {
        sphere.transform.Translate(new Vector3(2, 2, 2));
    }
    public void LSphereCtrl()
    {
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        sphere.transform.Translate(new Vector3(h,0,v));
        Debug.Log("LSphereCtrl comming!!!");
    }
    public void CObjCtrl(GameObject tmpobj)
    {
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        tmpobj.transform.Translate(new Vector3(h,0,v));
    }
}

Lua代码

--构造自己的类
LLuaUseC={}
LLuaUseC.__index=LLuaUseC
local this=LLuaUseC
function  LLuaUseC.New()
     local  self = {}
      setmetatable(self , {__index= LLuaUseC})
      return  self
end 
--更新方法
function LLuaUseC.Update(args)
	print("Lua Update!!!!")
	--Lua Update 更新不传参测试
	this.useLua:LSphereCtrl()
	--Lua Update更新传参测试
	this.useLua:CObjCtrl(this.useLua.cube)
end
function LLuaUseC:UseC(args)
	--首先找到一个物体
	this.tmpObj=GameObject.Find("Cube")
	--添加要调用C#方法的脚本
	this.useLua=this.tmpObj:AddComponent(typeof(UseLua))
	--输出测试
	this.useLua:CDebugger()
	--找到物体测试
	this.useLua:CFindObj()
	--物体动一下
	this.useLua:CSphereMove()
	--Lua自己的Update方法  
	--unscaled false 采用deltaTime计时,true 采用 unscaledDeltaTime计时
	--function Timer.New(func, duration, loop, unscaled)
	--  传的是要更新的方法  -1是无限循环    具体自己看ToLua的脚本
	local timer=FrameTimer.New(this.Update,-1,-1)
	--开始Update
	timer:Start()
end
--启动
LLuaUseC:UseC()

lua调C# C#调lua都能实现下面这个效果,纯lua写,简单得多,就不写了
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity ToLua框架整理(一) C#和lua函数调用 的相关文章

  • Go es中使用脚本操作

    摘要 官方库 使用go向es进行数据操作脚本 紫色飞猪 博客园 摘要 排序查询 golang ElasticSearch学习 简书 摘要 go elasticSearch实战篇 二 知乎 摘要 完美起航 ES7 三 用GO搜索elastic
  • 百度Apollo学习心得:探索自动驾驶技术的前沿之旅

    文章目录 前言 一 理论学习与实践结合 二 多方资源的整合利用 三 团队合作与交流分享 四 持续学习与创新思维 总结 前言 百度Apollo是一项引领自动驾驶技术发展的开放平台 通过深度学习 感知与决策 定位与控制等关键技术 为开发者提供了
  • HCIP第九天

    OSPF的拓展配置 手工认证 在OSPF数据包交互中 邻居之间的数据报中将携带认证口令 两边认证口令相同 则意味着身份合法 OSPF的手工认证总共分为三种 1 接口认证 r5 GigabitEthernet0 0 0 ospf authen
  • Objects are not valid as a React child (found: object with keys {_isAMomentObject, _i, _f, _isUTC,

    前端报错 原因是使用了扩展运算符 扩展的数据有moment格式的数据 如下 展示改日期直接通过 的方式展示 没有使用antd的 DatePicker组件 所以导致报错 解决方式 moment格式的日期需要放入DatePicker组件才能渲染
  • 前端Vue加载中页面动画弹跳动画loading

    前端组件化开发 以Vue加载中页面动画弹跳动画为例 随着前端技术的发展 开发复杂度越来越高 传统开发方式将一个系统做成了整块应用 一个小改动或功能增加都可能引发整体逻辑的修改 导致开发效率和可维护性降低 为了解决这个问题 组件化开发成为了前
  • vue项目,使用vue-cropper进行图片的截图裁剪并上传

    1 安装依赖 npm install vue cropper 2 引入 可以单页面引入 也可以全局引入 单页面 import VueCropper from vue cropper 全局 在main js里 import VueCroppe
  • 【安卓学习之常见问题】google play service

    安卓学习之常见问题 google play service 系列文章目录 提示 这里是收集了安卓学习之常见问题的相关文章 安卓学习之常见问题 界面 Activity Fragment 之间的数据传递 Intent Bundle 任我飞的博客
  • dependencies devDependencies peerDependencies optionalDependencies区别

    在一个Node js项目中 package json几乎是一个必须的文件 它的主要作用就是管理项目中所使用到的外部依赖包 同时它也是npm命令的入口文件 npm 目前支持以下几类依赖包管理 dependencies devDependenc
  • 中国大学MOOC 视频字幕获取及处理方法

    最近上课需要做笔记 但是 一句句的抄字幕工作量有点大 于是查找了一此方法 尝试成功 在此记录下下 1 首先 打开你所要下载字幕的视频 如 https www icourse163 org learn NUDT 1003101005 tid
  • Error mounting /dev/loop0 at /media/root/disk【ubuntu 16.04无故报挂载失败的错】解决办法

    最近ubuntu16 04上经常报个错 开头是Error mounting dev loop0 at media root disk 忘了截图 但报错内容能看到这个 经到处翻查 在国外的某个网站 stackoverflow 上找到了一个比较
  • 中文 python_Linux与Python中文编码详解

    TL DR Linux乱码 如果之前没安装过 yum groupinstall chinese support vim etc sysconfig i18n 将LANG Zn CN UTF 8 复制到末尾 vim乱码 step1 在控制台输
  • 聊聊最近爆火的 chatgpt丨小智ai丨到底是什么?

    最近 随着人工智能技术的不断发展和应用 ChatGPT作为自然语言处理领域的一种新兴技术 引起了广泛的关注和热议 在这篇文章中 我们将聊一聊最近爆火的ChatGPT 介绍其背景 特点 应用以及挑战 从而更好地了解ChatGPT技术的本质和意
  • llseek接口函数实现

    llseek接口函数属于驱动file operation结构体内部函数的一部分 llseek函数实现的目的 为了使用用户空间的llseek 系统调用这个函数功能来移动设备的文件指针 然后读 写接口就可以对移动后的位置进行读取功能 而不是每次
  • 指针仪表角度检测和读数

    指针仪表识别的方法 主要流程是 1 检测仪表所在的位置 提取出来 该方法有两条路径实现 1 霍夫圆形检测 2 机器学习训练 2 检测仪表圆盘的位置后 用霍夫直线检测指针 3 去除无关直线干扰 提取正确的角度 4 判断指针所在的区域 下面两个
  • labview2015->matlab2015b->veristand2015s p1安装顺序

    安装完相应的软件后 安装顺序 labview2015 gt matlab2015b gt veristand2015s p1 如果两者关联成功后 运行matlab后会在matlab命令窗口前两行显示 NI VeriStand 2015 SP
  • Redis缓存击穿,缓存穿透,缓存雪崩,附解决方案

    前言 在日常的项目中 缓存的使用场景是比较多的 缓存是分布式系统中的重要组件 主要解决在高并发 大数据场景下 热点数据访问的性能问题 提高性能的数据快速访问 本文以Redis作为缓存时 针对常见的缓存击穿 缓存穿透 缓存雪崩问题做简单地说明
  • dell 台式机bios虚拟化_怎么开启VT虚拟化功能,BIOS中怎么开启虚拟技术,经验告诉你该这样...

    很多人都不知道BIOS中怎么开启虚拟技术 下面我们就一起来看看吧 操作方法 01 首先在开机的时候按住对应的键进入BIOS 组装机以主板分 华硕按F8 Intel按F12 其他品牌按ESC F11或F12 笔记本以品牌分 联想ThinkPa
  • Proxy error: Could not proxy request //sysTenant/getTenantDropDownList from localhost:9528 to http:/

    一 项目背景 提示 这里简述报错问题背景 当我们开发完前端一个功能之后运行调试时 通常前后端分离情况下 前 后端程序都运行起来之后 会出现 协议 域名 端口不一致的形况 此时前端调用后端接口时就会产生跨域问题 可以在前端设置代理解决 vue
  • 区块链技术框架

    当前主流的区块链架构包含六个层级 网络层 数据层 共识层 激励层 合约层和应用层 图中将数据层和网络层的位置进行了对调 主要用途将在下一节中详述 网络层 区块链网络本质是一个P2P Peer to peer点对点 的网络 网络中的资源和服务
  • 再战WebGoat之代码审计

    声明 好好学习 天天向上 回想首次接触webgoat已是两年前 当时可能连漏洞原理都不是很明白就开始上手靶场了 也是搜了很多文章 还用的word的方式写的草稿 惭愧惭愧 webgoat一直是我心中高质量的靶场 其实当时发布文章时 我就一直在

随机推荐

  • github趋势追踪 2023年5月25日

    1 text2vec text2vec是一个文本向量表征工具 它可以将文本转化为向量矩阵 这个项目实现了多种文本表征和文本相似度计算模型 如Word2Vec RankBM25 Sentence BERT和CoSENT等 使用text2vec
  • 小车PCB板视觉分拣软件

    小车PCB板视觉分拣软件 前言 赛题内容 视觉算法 算法选择 算法实现过程 读入Train并创建模板 读入Test数据 图像预处理与视觉分拣 实际效果 指定读入 顺序读入 其他 UI界面设计 数据库 DEMO分享 前言 智能制造赛是中国机械
  • Qt 中开启线程的五种方式

    作者 billy 版权声明 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 简介 在开发过程中 使用线程是经常会遇到的场景 本篇文章就来整理一下 Qt 中使用线程的五种方式 方便后期回顾 前面两种比较简单 一笔带过了 主
  • 命令行前边出现base

    问题 命令行开头出现base base lihongzhang home 原因 安装了conda引起的 默认启动命令行即自动进去conda环境 解决办法 方法1 退出conda环境 base lihongzhang home conda d
  • nodejs、npm、cnpm、yarn安装及环境配置

    一 nodejs的安装 1 官网下载对应系统安装包 https nodejs org en download 2 安装时注意修改安装目录 建议放在非C盘目录下 一路默认安装即可 3 安装完成后启动命令行工具 输入 node v npm v
  • too much data for RSA block .关于RSA算法密钥长度/密文长度/明文长度

    今天在做RSA加密的时候遇到了一个这样的错误 ArrayIndexOutOfBoundsException too much data for RSA block 查询相关资料后得知该错误是加密数据过长导致的 加密数据长度 lt 模长 11
  • 各linux操作系统查看内核版本命令

    原文出处 https linuxlog cyou post 18297 html 默认情况下 所有已安装的 Linux 内核及其相关文件都存储在 boot 目录 只需使用 find 查看已安装内核列表的命令 find boot vmli b
  • 智能合约 -- 安全考量

    相关概念 就是我们写代码是考虑这种涉及到合约安全的问题 下面这个方面写合约是重点考虑 创建消息发送以太币 1 要创建消息发送以太币 您需要构建一个有效的交易 并将其发送到以太坊网络中 2 交易被发送到以太坊网络后 会经过矿工的验证和打包 并
  • VMware 创建 ubuntu

    一 下载 ubuntu镜像 1 Ubuntu下载地址参考 下载链接 本人选择下载地址 http mirrors melbourne co uk ubuntu releases 2 本人选择下载 18 4 06版本 二 创建虚拟机 点击创建虚
  • python 安装pandas

    1 pandas有啥用 pandas 是基于NumPy 的一种工具 该工具是为了解决数据分析任务而创建的 Pandas 纳入了大量库和一些标准的数据模型 提供了高效地操作大型数据集所需的工具 pandas提供了大量能使我们快速便捷地处理数据
  • HarmonyOS扫码服务,应用服务一扫直达打造系统级流量新入口

    二维码如今是移动应用流量入口以及功能实现的重要工具 也是各App的流量入口 是物 人 服务的连接器 通过扫码我们可以更便捷的生活 更高效的进行信息交互 包括信息的发布 信息的获取 在日常扫码过程中 我们也经常会遇到扫码环境暗 二维码污损 模
  • 中国现代服务业发展趋势及十四五战略模式研究报告2021-2027年

    中国现代服务业发展趋势及十四五战略模式研究报告2021 2027年 全新修订 2021年11月 报告价格 纸质版 6500元 电子版 6800元 纸质 电子 7000元 可以优惠 服务形式 文本 电子版 光盘 联 系 人 顾言 撰写单位 鸿
  • Spring Cloud Alibaba Dubbo

    Spring Cloud Alibaba Dubbo 为什么 是什么 怎么做 为什么 单体应用 单体服务经过长期的迭代更新 逐渐走向代码臃肿 高耦合 这显然与我们软件开发设计理念高内聚 低耦合背道而驰 从而难以维护 市场需求也在逐渐要求服务
  • 惠普360 g5服务器系统如何做阵列,求HP DL360G5 2.5服务器,基于windows server 2008系统安装RAID 1方法...

    一 在BIOS中打开RAID功能 安装好SATA硬盘之后 就要进入BIOS中打开南桥芯片的RAID功能 具体方法是 进入BIOS设置程序的 OnChip IDE Device 窗口 找到一个名为 SATA Mode 的选项 将它设置为 RA
  • glsl中uniform,attribute和varying详解

    openGL系列文章目录 文章目录 openGL系列文章目录 uniform attribute varying 参考 uniform 要想渲染一个场景以使它看起来是3D 的 需要构建适当的变换矩阵 并将它们应用于模型的每个顶点 在顶点着色
  • 龙斗士显示网络和服务器,龙斗士热点问题_百田网帮助中心

    战斗类问题 7 怎样组队或离开队伍 你好 小冒险家如果想要组织队伍一起去冒险 可以在页面右下方打开 组队 图标 选择 创建组队 创建一支队伍 小冒险家成功建立队伍后 打开 组队 图标 选择 邀请队友 就能邀请朋友加入队伍了 如果要离开队伍
  • 基于HTML和CSS完成京东页面的制作

    首先打开京东页面分析页面元素 由图可把整个页面分为4个部分 分别为top顶部部分 tip提示部分 mid中间部分 foot底部部分 然后编写每一部分的代码 边写边测试结果 防止一步错步步错 代码如下 HTML部分 div class top
  • C#新语法

    本文章是我听B站杨中科的所做的笔记 杨中科B站视频链接 NET 6教程 Net Core 2022视频教程 杨中科主讲 哔哩哔哩 bilibili 说明 1 C 8 0 C 9 0和C 10 0中增加了很多的新语法 这里讲解常用 重点的新语
  • 解决Ajax获取文本数据为空的问题

    今天学习了Ajax 想自己封装一个函数 结果第一步就难住了 我无论怎样都获取不到文本文件或者Json里的值 难受的找了半天bug 百度了好久 不是很懂后台代码 用文本文件保存的数据 找不到适合我的解决方案 关键是控制台没有报错 就是aler
  • Unity ToLua框架整理(一) C#和lua函数调用

    记录下 方便自己用 代码已加注释 就不多说了 应该能看懂 1 C 调用Lua代码 Lua代码 lua代码放在tolua自带的lua目录 建议下个LuaBuilder配合VS2017使用 local GameObject UnityEngin