[Unity]使用Slua框架开发创建Unity引擎中的对象

Unity中使用SLua的一些注意事项 阅读详情

http://www.jianshu.com/p/fadb5dd59352

[Unity]使用Slua框架开发创建Unity引擎中的对象

字数1052  阅读3556  评论0 

[Unity]技术学习路线图(长期更新)

接上篇《[Unity]使用Slua框架开发Unity项目的重要步骤》

下载与安装

  • 下载地址 GitHub
  • 安装过程
    1.下载最新版,这里, 解压缩,将Assets目录里的所有内容复制到你的工程中,对于最终产品,可以删除slua_src,例子,文档等内容,如果是开发阶段则无所谓。
    2.等待unity编译完毕,如果一切顺利的话,将出现slua菜单, 点击slua菜单中 All->Make 命令 手动生成针对当前版本的U3d接口文件。
    3.每次更新slua版本,务必记得clear all,然后make all,否则可能运行不正确

主要的内容包括

  • LuaSvr环境对象初始化LuaState状态机对象
  • Lua中的import关键字脚本中导入UnityEngine设置游戏对象组件属性
  • Lua中的require关键字导入自定义模块module

创建新的Unity工程并且导入SLua框架

  • 使用已经注入UnityEngie引擎的状态机对象LuaSvr调用Lua脚本
    AppDelegate.cs

      using UnityEngine;
      using System.Collections;
      using SLua;
    
      public class Main : MonoBehaviour
      {
    
          private LuaSvr lua_svr;
          // Use this for initialization
          void Start()
          {
              //创建一个已经注入UnityEngine的状态机对象..
              lua_svr = new LuaSvr();
    
              //通过Resources文件夹下的main.txt(lua)文件内的main函数启动程序
              //当然也可以通过修改LuaState.loaderDelegate来修改默认的路径
              lua_svr.start("main");
          }
      }

    main.txt

      funcion main()
          print("Hello LuaSvr...")
      end
  • 在main.txt文件内导入UnityEngine包并且创建游戏对象

      import "UnityEngine"
    
      function main()
          -- 创建Cube对象
          local cube=UnityEngine.GameObject.CreatePrimitive(UnityEngine.PrimitiveType.Cube)
      end
  • 在main.txt文件内导入UnityEngine包并且创建空游戏对象

      import "UnityEngine"
    
      function main()
          -- 创建空物体对象
          local empty=UnityEngine.GameObject("HHEmptyObject")
      end
  • 操作游戏对象上的组件

    • 获取Transform组件

        import "UnityEngine"
      
        function main()
            -- 创建Cube对象
            local cube=UnityEngine.GameObject.CreatePrimitive(UnityEngine.PrimitiveType.Cube)
      
            -- 获取transform组件上的position属性
            local pos = cube.transform.position
            pos.x = 10
      
            -- 修改transform组件的position属性
            cube.transform.position = pos
        end
    • 添加Rigidbody组件
      • 导入import "UnityEngine"
      • 添加刚体组件cube:AddComponent(Rigidbody)
    • 获取指定类型的组件,例如BoxCollider
      • 导入import "UnityEngine"
      • 自定类型字符串获取local collider = cube:GetComponent("BoxCollider")
由于使用Lua编写Unity项目时,无法与C#相比的是对象函数或者对象属性的智能提示不够健全.

所以在此贴出Slua框架中注入LuaState状态机对象内的一些UnityEngine的函数和属性.

  • UnityEngine.GameObject对象在LuaState中注入的内容

    static public void reg(IntPtr l) {
          getTypeTable(l,"UnityEngine.GameObject");
          addMember(l,GetComponent);
          addMember(l,GetComponentInChildren);
          addMember(l,GetComponentInParent);
          addMember(l,GetComponents);
          addMember(l,GetComponentsInChildren);
          addMember(l,GetComponentsInParent);
          addMember(l,SetActive);
          addMember(l,CompareTag);
          addMember(l,SendMessageUpwards);
          addMember(l,SendMessage);
          addMember(l,BroadcastMessage);
          addMember(l,AddComponent);
          addMember(l,CreatePrimitive_s);
          addMember(l,FindGameObjectWithTag_s);
          addMember(l,FindWithTag_s);
          addMember(l,FindGameObjectsWithTag_s);
          addMember(l,Find_s);
          addMember(l,"transform",get_transform,null,true);
          addMember(l,"layer",get_layer,set_layer,true);
          addMember(l,"activeSelf",get_activeSelf,null,true);
          addMember(l,"activeInHierarchy",get_activeInHierarchy,null,true);
          addMember(l,"isStatic",get_isStatic,set_isStatic,true);
          addMember(l,"tag",get_tag,set_tag,true);
          addMember(l,"gameObject",get_gameObject,null,true);
          createTypeMetatable(l,constructor, typeof(UnityEngine.GameObject),typeof(UnityEngine.Object));
      }
    • 只有函数指针位置的部分,在Lua中定义成了Table变量内的函数,例如:cube:AddCommponent
    • 在函数指针名的末尾部分以_s结尾的,在Lua中定义成了元表变量内的函数,例如:GameObject.CreatePrimitive
    • 在添加成员时,包含了类似于"transform"字符串的,在Lua中定义成了Table变量内的键值对属性,例如:cube.transform
  • UnityEngine.Transform对象在LuaState中注入的内容

          static public void reg(IntPtr l) {
          getTypeTable(l,"UnityEngine.Transform");
          addMember(l,SetParent);
          addMember(l,Translate);
          addMember(l,Rotate);
          addMember(l,RotateAround);
          addMember(l,LookAt);
          addMember(l,TransformDirection);
          addMember(l,InverseTransformDirection);
          addMember(l,TransformVector);
          addMember(l,InverseTransformVector);
          addMember(l,TransformPoint);
          addMember(l,InverseTransformPoint);
          addMember(l,DetachChildren);
          addMember(l,SetAsFirstSibling);
          addMember(l,SetAsLastSibling);
          addMember(l,SetSiblingIndex);
          addMember(l,GetSiblingIndex);
          addMember(l,Find);
          addMember(l,IsChildOf);
          addMember(l,FindChild);
          addMember(l,GetChild);
          addMember(l,"position",get_position,set_position,true);
          addMember(l,"localPosition",get_localPosition,set_localPosition,true);
          addMember(l,"eulerAngles",get_eulerAngles,set_eulerAngles,true);
          addMember(l,"localEulerAngles",get_localEulerAngles,set_localEulerAngles,true);
          addMember(l,"right",get_right,set_right,true);
          addMember(l,"up",get_up,set_up,true);
          addMember(l,"forward",get_forward,set_forward,true);
          addMember(l,"rotation",get_rotation,set_rotation,true);
          addMember(l,"localRotation",get_localRotation,set_localRotation,true);
          addMember(l,"localScale",get_localScale,set_localScale,true);
          addMember(l,"parent",get_parent,set_parent,true);
          addMember(l,"worldToLocalMatrix",get_worldToLocalMatrix,null,true);
          addMember(l,"localToWorldMatrix",get_localToWorldMatrix,null,true);
          addMember(l,"root",get_root,null,true);
          addMember(l,"childCount",get_childCount,null,true);
          addMember(l,"lossyScale",get_lossyScale,null,true);
          addMember(l,"hasChanged",get_hasChanged,set_hasChanged,true);
          createTypeMetatable(l,null, typeof(UnityEngine.Transform),typeof(UnityEngine.Component));
      }

基于Slua的 Lua NGUI UI框架 lua中的内容这里主要有两个模块 : 1.层级管理模块 在层级上将界面分为几种类型,这里暂时先定三种常用的类型 LayerType = { --值越大层级越高 LayerType_normal = 1, --一般界面,全屏且不能操作下层界面 LayerType_fixedWindow = 2,--固定窗口 不能自行关闭和打开的窗口 比如 游戏资源的显示 LayerTy... 阅读详情

相关推荐

[Unity][LUA][SLUA]选择LUA库导入Unity中

LUA库的种类繁多,目前不知道 哪款 更方便,更好用,就随机使用一款LUA 库 目前LUA的库: slua UniLua http://nlua.org/ http://www.ulua.org/ 相关的 安装资料 到 LUA中,也有现成的教程,本文不赘述。

BuladeMian的博客,菜得抠脚,菜得真实 1275

探秘高效Unity开发神器:SLua

**SLua** 是一个针对Unity3D和Mono的快速静态代码生成的 Lua 绑定库,让开发者在C#和Lua之间无缝切换,极大地提高了游戏开发效率。通过它的强大功能,你可以轻松地在Unity中使用Lua脚本,并享受到其静态编译带来的性能优势。 ## 项目介绍 SLua的核心特性在于它的静态代码生成机制,这意味着它不依赖反射,避免了额外的垃圾回收,从而实现快速运行。此外,SLua还提供了远程...

gitblog_00015的博客 694

Unity热更新性能对比:SLua与ulua框架深度评测与选型指南

在Unity游戏开发中,热更新技术是实现快速迭代和动态内容分发的关键。其核心原理是通过脚本语言(如Lua)与引擎底层(C#)的交互,实现逻辑的动态加载与替换,从而在不更新客户端的情况下修复Bug或增加新功能。这项技术的价值在于极大地提升了开发效率和运营灵活性,尤其适用于移动端游戏的长线运营。在具体实现中,Lua绑定框架的性能直接决定了热更新逻辑的执行效率,影响游戏运行的流畅度和用户体验。本文聚焦于SLua和ulua两大主流框架,通过详尽的性能测试数据,对比它们在函数调用、数据传递、GC开销等关键场景下的表现

weixin_31309419的博客 253

Unity结合SLua框架基本使用Demo

Unity结合SLua框架基本使用Demo

LCF_CSharp的博客 849

Unity热更新方案SLua深度解析:从原理到实战优化

在Unity游戏开发中,热更新是应对线上问题与快速迭代的核心技术需求,其本质是通过动态加载代码逻辑,实现应用在不重新发布的情况下进行功能更新与修复。主流的实现原理是通过脚本语言(如Lua)与C#原生代码的桥接,构建一个安全的沙盒环境。这项技术的核心价值在于能显著缩短更新周期,提升项目维护的灵活性,尤其适用于玩法频繁调整、需要紧急修复的移动端游戏。在众多解决方案中,SLua框架以其在性能与轻量化方面的平衡而受到关注。它通过静态绑定生成技术,在开发阶段预先创建C#与Lua间的调用桥接代码,从而避免了运行时反射带

weixin_33851177的博客 292

SLua新版本特性及应用

SLua,全称为Simple Lua,是一种将Lua脚本语言集成到Unity中的技术。它允许开发者使用轻量级的Lua语言来编写游戏逻辑和交互功能,同时保持与C#等更重的脚本语言的互操作性。SLua的出现,是为了解决Unity中传统脚本语言编写的复杂性和重复性问题,为快速原型设计和游戏开发提供了新的途径。SLua在设计时就考虑到了安全因素,以确保用户在使用SLua时能够有一个安全稳定的环境。安全机制的实现包括但不限于:沙箱执行环境。

weixin_36444661的博客 1250

【亲测免费】 探索SLua:一款高效、轻量级的Lua脚本与Unity集成框架

探索SLua:一款高效、轻量级的Lua脚本与Unity集成框架 是一个开源项目,由开发者Ksco创建,旨在简化Lua与Unity引擎之间的交互。这款库以高性能和易用性著称,为Unity开发提供了强大的脚本扩展能力。 项目简介 SLua主要目标是提供一个快速、稳定且兼容性强的Lua到C#的桥接器。它允许开发者在Unity中使用Lua语言编写游戏逻辑,从而利用Lua的简洁性和灵活性,同时避免了C#的复...

gitblog_00062的博客 822

slua:通过为Unity3D和mono生成的静态代码实现最快的lua绑定

lu 通过为Unity3D或Mono生成的静态代码实现最快的lua绑定 网址: : 虚幻引擎的slua 持续集成构建 建造 平台 类型 地位 糊涂 没有任何 没有任何 没有任何 slua单机版 Linux 测试,构建 slua单机版 视窗 测试,构建,部署 发布下载 与第三Lua库集成 标准slua版本不包含任何第3个Lua库(例如protobuf,lpeg等),如果您想使用此库,可以访问此分叉的仓库 ,它将slua重点放在与其他第三图书馆。 在没有Unity3D的情况下使用SLua 您可以使用不带Unity3D依赖项的slua ,它称为slua-standalone 。 对于C#服务器开发有用。 在上找到它,并由维护。 带有Slua的框架 您可以使用此框架来启动您的项目。 此仓库https://github.com/lwkl/xproject通用加载框架在所有平台上均使

使用Slua框架开发Unity项目的重要步骤

下载与安装 下载地址GitHub 安装过程1.下载最新版,这里, 解压缩,将Assets目录里的所有内容复制到你的工程中,对于最终产品,可以删除slua_src,例子,文档等内容,如果是开发阶段则无所谓。2.等待unity编译完毕,如果一切顺利的话,将出现slua菜单, 点击slua菜单中 All->Make 命令 手动生成针对当前版本的U3d接口文件。3.每次更新slu...

995

ANSYS材料库实战:手把手教你用APDL命令流定义混凝土和形状记忆合金

本文详细介绍了在ANSYS中使用APDL命令流定义混凝土和形状记忆合金(SMA)的高级建模技巧。通过SOLID65单元和SMA本构模型,工程师可以精确模拟非线性材料行为,包括混凝土的开裂和SMA的超弹性效应。文章提供了完整的命令流示例和求解策略优化建议,帮助用户提升工程仿真效率。

hh234的博客 485

uniapp实现app版本发现新版本后,自动更新

app实现自动更新

oldolder的博客 1283

Unity热更新实战:5分钟快速上手SLua框架

在游戏开发中,热更新技术允许开发者在无需重新发布应用的情况下修复Bug或更新内容,是提升产品迭代效率和用户体验的关键手段。其核心原理是通过在原生应用中嵌入脚本语言虚拟机,实现逻辑的动态加载与执行。Lua因其轻量、高效和易于嵌入的特性,成为Unity热更新方案的主流选择。SLua框架通过静态代码生成技术,预先为C#代码生成对应的Lua接口,相比动态反射方案,它在保证类型安全和IDE友好支持的同时,显著提升了运行性能。这种技术特别适用于对执行效率要求严苛的手游项目。本文将以一个具体的Unity工程为例,演示如何

weixin_30920597的博客 503

HFSS仿真平行线定向耦合器学习笔记

材料:FR4(玻璃纤维环氧树脂),介电常数:4.4,损耗角正切:0.02,厚度0.8mm。扫频方式:快速扫频,扫频范围:1.0GHz~3.0GHz,步进:0.01GHz。端口2是端口1关于Y轴对称,端口3,端口4是端口1和端口2关于X轴对称得到。求解中心频率:2.0GHz,迭代次数:20,收敛误差为0.02。右键设置边界条件----辐射边界。激励方式:集总端口激励。

qq_36521926的博客 4485

探索《2DPlatformer-SLua》:一款基于SLua的2D游戏开发框架

探索《2DPlatformer-SLua》:一款基于SLua的2D游戏开发框架 项目简介 在上,我们发现了一个名为的开源项目,这是一个专为Unity游戏引擎打造的2D平台游戏开发框架。它充分利用了SLua库,使得开发者可以用Lua脚本进行游戏逻辑编写,大大提升了开发效率和代码可维护性。 技术分析 SLua库 SLua是Unity中常用的Lua绑定库,它能够实现C#与Lua之间的无缝交互。通过SLu...

gitblog_00039的博客 375

黑群晖DSM7.0.1物理机安装教程

使用芯片无忧工具,查看U盘的和。使用,格式化U盘。使用镜像写入工具,把引导写入U盘。修改文件,可以使用工具把文件复制到桌面,通过修改好之后,拖进这个界面中。或者在电脑中,查看U盘,打开U盘中的文件直接修改。具体修改内容如下:PID修改为U盘的PIDVID修改为U盘的VID默认只有mac1=a8412083CB52 mac2=0a11323D47F7 ,增加:mac3=a15823C08000 mac4=a23C04158B52 mac5=82a002524158 mac6=38233052415aS

JingLisen的博客 2万+

Python 上位机开发

首先,什么是上位机?上位机通常是指可以与下位机(如单片机、传感器等硬件设备)进行通信和交互,实现数据采集、控制指令发送以及数据处理和展示的计算机程序。 Python 作为一种高级编程语言,在开发上位机方面具有诸多优势。它拥有丰富的第三方库,使得开发过程变得相对简单和高效。

weixin_46807151的博客 4302

Unity热更新入门:5分钟快速上手SLua框架与Lua脚本集成

热更新是移动游戏开发中的关键技术,它允许应用在不重新发布安装包的情况下更新内容和修复Bug,从而提升用户体验和运营灵活性。其核心原理是通过动态加载和执行脚本代码来实现逻辑的实时替换。在Unity引擎中,Lua因其轻量、高效和易于嵌入的特性,成为实现热更新的主流脚本语言选择。通过Lua绑定框架,开发者可以在保持核心性能模块使用C#的同时,将易变的业务逻辑交由Lua处理,极大提升了开发迭代速度。SLua正是为Unity量身打造的Lua绑定方案,它作为连接C#与Lua的桥梁,简化了集成流程。本文将以SLua为例,

weixin_30326741的博客 384

Windows 游戏 EXCEPTION_ACCESS_VIOLATION 修复:3类硬件问题与5步软件排查法

本文提供Windows游戏EXCEPTION_ACCESS_VIOLATION错误的终极修复指南,涵盖3类硬件问题(内存故障、显卡问题、超频不稳定)和5步软件排查法(文件验证、驱动更新、DEP调整等),帮助玩家彻底解决0xFFFFFFFFFFFFFFFF内存访问冲突问题。

weixin_31856057的博客 2396

unity3d引擎中slua的使用

SLua是开源软件,没有反射,没有额外GC,采用静态代码生成,可以用于游戏核心逻辑,完整支持4.6+ UI系统。 1、下载安装 http://www.slua.net/ https://github.com/pangweiwei/slua 下载最新版,解压缩,将Assets目录里的所有内容复制到你的工程中,对于最终产品,删除slua_src、例子、文档等内容。等待unity编译完...

aisaozhu1456的博客 1289

R3LIVE项目实战(3) —双目相机与激光雷达 lidar_camera_calib联合标定

lidar_camera_calib是一个在无目标环境中,用于高分辨率LiDAR(例如Livox)和摄像机之间准确的外部标定工具。我们的算法可以在室内和室外场景中运行,并且只需要场景中的边缘信息。如果场景适合,我们可以实现类似于或甚至超过基于目标的方法的像素级准确度。我们使用标定的外部参数给点云上色,并与实际图像进行比较。A和C是点云的局部放大视图。B和D是与A和C中的点云对应的摄像机图像的部分。

几度春风里的博客 4057

图像处理 | 基于matlab的多尺度Retinex(MSR)和自适应直方图均衡化(CLAHE)算法联合的低照度图像增强(附代码)

本文介绍了一种基于多尺度Retinex(MSR)和CLAHE的低照度图像增强算法。算法首先对图像进行多尺度Retinex处理,通过不同尺度的高斯核去除光照影响;然后采用CLAHE算法进行对比度增强。Matlab实现展示了算法流程,包含灰度转换、多尺度Retinex增强和CLAHE处理。实验结果显示,该方法能有效提升低照度图像的可见性,增强细节表现。最后提出了改进建议,包括引入深度学习方法和优化参数选择。

尘世冰封的专栏 952

SLua 开源项目教程

SLua 开源项目教程 项目介绍 SLua 是一个高效、轻量级的 Lua 桥接库,旨在为游戏开发提供 Lua 脚本支持。它通过 C 语言实现,能够无缝集成到各种游戏引擎中,如 Unity3D。SLua 的主要优势在于其高性能和低内存占用,使得它成为游戏开发中 Lua 脚本的首选解决方案。 项目快速启动 环境准备 确保你已经安装了 Unity3D 编辑器。 克隆 SLua 项目到本地: git c...

gitblog_00507的博客 420

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

探索SLUA Unreal Demo:Unity与Unreal Engine之间的桥梁

探索SLUA Unreal Demo:Unity与Unreal Engine之间的桥梁 项目简介 在游戏开发的世界中,跨引擎交互是一个极具挑战性的任务。 是一个开源项目,旨在简化Unity和Unreal Engine之间数据和逻辑的通信。它基于SLUA库,提供了一种高效、便捷的方法,让开发者能够利用Unity进行快速迭代,然后在Unreal Engine中实现高质量的渲染和物理模拟。 技术分析 S...

gitblog_00078的博客 595

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

KSFramework Lua脚本集成指南:SLua与xLua深度对比与选择

KSFramework是一个专注于热重载的Unity3D开发框架,它巧妙地将KEngine资源管理框架与SLua或xLua脚本引擎相结合,为游戏开发者提供了高效的Lua脚本集成方案。在前100个字符中,我们重点介绍KSFramework的Lua脚本集成能力,这是实现游戏热更新的关键技术。 ## 🚀 KSFramework Lua脚本集成概述 KSFramework的核心优势在于其强大的**热

gitblog_00114的博客 1035

终极SLua指南:高效Unity3D Lua绑定框架完整解析

SLua是Unity3D平台上通过静态代码生成技术实现的高性能Lua绑定框架,为游戏开发者提供快速、高效的脚本化开发解决方案。作为目前最优秀的Unity Lua绑定方案之一,SLua在性能优化和内存管理方面表现出色,特别适合移动游戏开发。 ## 🎯 项目背景与价值定位 在游戏开发领域,热更新和脚本化开发已成为提升开发效率和维护灵活性的关键技术需求。传统的Unity开发主要依赖C#语言,虽然性

gitblog_00859的博客 279
上一篇: 使用Slua框架开发Unity项目的重要步骤
下一篇: How to print out more than 20 items (documents) in MongoDB's shell?
linuxheik
博客等级 码龄15年 865粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值