【Lua in Unity】详解与和C#互相调用示例

这篇具有很好参考价值的文章主要介绍了【Lua in Unity】详解与和C#互相调用示例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

Lua在Unity中的主要作用

如何创建

Lua与C#互相调用

C#和Lua的使用场景区分

完整示例


Lua在Unity中的主要作用

游戏逻辑编写:Lua可以作为一种脚本语言,用于游戏中的逻辑编写,例如定义游戏角色的行为、AI逻辑,处理游戏的战斗逻辑和流程控制,等等。可以将Lua代码通过Unity的API来实现与引擎的交互。这样做的好处是,可以将游戏逻辑与引擎代码分离,加快开发速度,同时更容易修改和调试。

配置数据管理:Lua也可以作为一种配置语言,用于管理游戏数据,例如定义游戏中的各种参数、表格、配置表等等。通过编写Lua脚本,在游戏运行时读取这些Lua脚本并解析配置数据,可以让游戏开发者更方便地进行游戏数据管理,也提高了游戏的扩展性和可维护性。

如何创建

创建C#脚本,调用特定库就是Lua了

Lua与C#互相调用

Lua调用C#:

using LuaInterface;
public class TestClass {
  public int TestMethod(int a, int b) {
    return a + b;
  }
}

public class LuaTest {
  LuaState lua; // Lua状态机
  LuaFunction func; // Lua函数

  void Start() {
    lua = new LuaState();
    lua.DoString("require('test')"); // 加载Lua脚本
    func = lua.GetFunction("testFunc"); // 获取Lua函数
    int result = func.Call(1, 2)[0].Int; // 调用Lua函数
    print(result);
  }
}

C#脚本中的TestClass是让Lua脚本中调用的类,它包含一个TestMethod方法。在Lua脚本中,通过require函数加载test.lua文件,并获取其中的testFunc函数。然后,通过func.Call(1, 2)方法来调用testFunc函数,传入的参数是1和2,并获取返回值中的第一个值并转成整数类型。

C#调用Lua:

using LuaInterface;
public class LuaTest {
  LuaState lua; // Lua状态机

  void Start() {
    lua = new LuaState();
    lua.DoFile("test.lua"); // 加载Lua脚本
    lua.DoString("testFunc(1, 2)"); // 调用Lua函数
  }

  void Update() {
    lua.CheckFunction("update"); // 检查是否存在update函数
    lua.Push(this); // 将class实例压入栈中
    lua.Push(Time.deltaTime); // 将时间增量压入栈中
    lua.Call(2, 0); // 调用update函数,传入2个参数,取回0个返回值
  }
}

Unity提供了LuaState.DoString或LuaState.DoFile方法来实现C#代码调用Lua代码

通过lua.DoFile("test.lua")加载Lua脚本,并通过lua.DoString("testFunc(1, 2)")调用testFunc函数,传入的参数是1和2。在Update中,检查是否存在update函数,然后将C#中的类实例压入栈中,再将Unity中的Time.deltaTime压入栈中,并通过lua.Call(2, 0)方法调用update函数,传入2个参数(类实例和时间增量),取回0个返回值。

C#和Lua的使用场景区分

C#主要用于游戏核心逻辑和性能敏感的模块。

游戏的主循环和逻辑处理;

状态机、AI等游戏核心逻辑实现;

射线检测等性能敏感操作;

物理引擎、碰撞检测等底层操作。

Lua主要用于游戏可配置化、可扩展性和部分业务逻辑实现。

UI的布局和逻辑实现;

游戏属性、敌人行为等可配置化;

游戏任务系统、任务对话等剧情逻辑实现;

游戏的扩展功能实现,例如MOD、插件等。

完整示例

内容:Lua创建对象池,然后C#调用

创建一个空的GameObject,添加LuaBehaviour组件,添加lua脚本。

local objectPool = {}

-- 对象池中的对象
local objects = {}

-- 最大对象数量
local maxObjects = 10

-- 初始化对象池
function objectPool.init(max)
    maxObjects = max or maxObjects
end

-- 从对象池中获取一个对象
function objectPool.getObject()
    if #objects <= 0 then
        return nil
    else
        local obj = table.remove(objects)
        obj:SetActive(true)
        return obj
    end
end

-- 将一个对象放回对象池中
function objectPool.putObject(obj)
    obj:SetActive(false)
    if #objects >= maxObjects then
        GameObject.Destroy(obj)
    else
        table.insert(objects, obj)
    end
end

return objectPool

C#脚本:

在C#中调用Lua中的对象池,需要使用LuaState对象。

using UnityEngine;
using LuaInterface;
using System.Collections;

public class ObjectPoolTest : MonoBehaviour {

    private LuaState lua;
    private LuaFunction getObjectFunc;
    private LuaFunction putObjectFunc;

    void Start () {
        lua = new LuaState();
        lua.Start();
        lua.DoFile("ObjectPool.lua");

        // 获取对象池中的函数
        LuaTable objectPool = lua.GetTable("ObjectPool");
        getObjectFunc = objectPool["getObject"] as LuaFunction;
        putObjectFunc = objectPool["putObject"] as LuaFunction;

        // 初始化对象池
        objectPool.GetLuaFunction("init").Call(5);
    }

    void Update () {
        // 从对象池中获取对象
        GameObject obj = getObjectFunc.Call()[0] as GameObject;

        // 如果对象不为空,则重置位置并将对象放回对象池中
        if (obj != null) {
            obj.transform.position = Vector3.zero;
            putObjectFunc.Call(obj);
        }
    }

    void OnDestroy() {
        lua.Dispose();
        getObjectFunc.Dispose();
        putObjectFunc.Dispose();
    }
}

Unity中添加一个Cube,将其放置在场景中,添加一个BoxCollider组件,并在ObjectPoolTest脚本中将其作为对象池中的对象来使用。 文章来源地址https://www.toymoban.com/news/detail-512463.html

到了这里,关于【Lua in Unity】详解与和C#互相调用示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LabVIEW于C#各自生成的DLL互相调用的方法

    1.LV调用C#生成的DLL (1)C#类库代码原型 Debug生成的DLL: LV代码: 结果显示 2.C#调用LabVIEW生成的DLL: LV源码 VS2017添加LV生成的DLL 加入命名控件,加源码 运行结果:

    2024年02月16日
    浏览(57)
  • ILRuntime是如何与Unity互相调用的

    一、ILRuntime的基本介绍 ILRuntime是一个跨平台CLR实现,它可以在多个平台上运行C#代码,包括Android、iOS、Windows、Linux等等。ILRuntime的实现方式是将C#代码编译成IL代码,然后在运行时通过JIT或AOT的方式将IL代码转换为机器代码,从而实现跨平台的效果。ILRuntime的主要功能包括热更

    2024年02月16日
    浏览(44)
  • Unity中使用Xlua调用lua相关

    这样只能读取Resources文件夹下的脚本,但是我们做热更新需要从AB包中读取,所以需要自定义加载路径 require寻找文件的逻辑是,先找AddLoader中自定义的路径(可以有多个路径)中有没有相应文件,再去Resources下查找

    2024年02月08日
    浏览(48)
  • 【Unity框架】XLua中Lua代码注入C#代码操作

    1.游戏框架下载地址:https://github.com/kof123w/gitWorkSpace/tree/main/XLua 2.XLua官方与教程地址:https://github.com/Tencent/xLua I.宏定义:添加 HOTFIX_ENABLE 到 Edit Project Settings Player Other Settings Scripting Define Symbols II.生成代码:执行 ‘XLua Generate Code’ 菜单,等待Unity编译完成 III.注入:执行 ‘XLua

    2024年02月08日
    浏览(55)
  • Unity中如何使用Rider调试C#和lua代码

    工作中经常需要调试lua代码,之前使用VS调试C#代码,使用Intellij Idea来调试lua代码,这样其实比较麻烦,所以查了一下,可以直接使用Rider来统一的调试C#和lua代码 Rider下载:Rider官网下载,根据需要选择对应的版本,建议使用Rider2020.1.0,参考链接 打开Unity,在preference中设置为

    2023年04月13日
    浏览(42)
  • C#调用barTender打印标签示例

    使用的电脑需要先安装BarTender       我封装成一个类   示例2:与上面一样的。

    2024年02月11日
    浏览(37)
  • C++调用C# dll成功示例

    一.准备C# dll类库 。生成CSLib.dll  二、写C++应用调用  1)需要把dll复制到运行目录下。(不然会提示找不到dll System.IO.FileNotFoundException:“未能加载文件或程序集“CSLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。系统找不到指定的文件) 2)设置\\\"公共语言运

    2024年02月14日
    浏览(55)
  • C# 任务并行类库Parallel调用示例

    Task Parallel Library 是微软.NET框架基础类库(BCL)中的一个,主要目的是为了简化并行编程,可以实现在不同的处理器上并行处理不同任务,以提升运行效率。Parallel常用的方法有For/ForEach/Invoke三个静态方法。

    2024年02月04日
    浏览(30)
  • .NET Core(C#) IEqualityComparer<in T>接口的使用方法及示例代码

    .NET Core(C#)中IEqualityComparerT接口的对象的主要作用是实现接口来判断两个对象是否相等,以下介绍一下 IEqualityComparerin T接口的简单介绍和实现使用的方法,以及相关示例代码。   1、IEqualityComparerin T的的GetHashCode和Equals方法 IEqualityComparerin T 是用来比较对象是否相等,需要实现

    2024年02月09日
    浏览(67)
  • 关于Unity在Xlua调用Lua脚本函数时报错This type must add to CSharpCallLua 解决办法

    使用委托来获取xlua中的function是不行的 报错脚本示范 即使全部接口打好标签并且在编辑器中把兼容等级改为4.X 打包出去还是会出问题 建议在lua脚本中建立一个空的table 再把方法塞进去 比如 然后在c#端 就可以正常运作这个方法了

    2024年02月12日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包