【Unity游戏开发】基于xLua构建一个简单的3D游戏框架

news/2025/1/21 13:52:58/文章来源:https://www.cnblogs.com/gfdgssdg/p/18678512

一、xLua简介

xLua是基于Lua语言的开源插件,能够支持在Unity中嵌入Lua脚本(Lua脚本支持热更,适用于游戏的业务逻辑开发和维护)
xLua源码地址

二、构建方法

  1. 新建一个Unity项目(模板选择Universal 3D(URP))
  2. 下载xLua源码,将Assets目录及其子目录下的全部文件拷贝到Unity项目的Assets目录下
  3. 如出现编译错误“error CS0246: The type or namespace name 'MemberInfo' could not be found (are you missing a using directive or an assembly reference?)”,则打开报错的ExampleGenConfig.cs文件,把“using System.Reflection;”的注释去掉
  4. 创建Lua脚本:在Assets/Resource/Lua目录下(没有则自行创建),创建PlayerController.lua
local PlayerController = 
{speed = 2
}function PlayerController:Update()self.direction = CS.UnityEngine.Vector3(0, 0, 0)if CS.UnityEngine.Input.GetKey(CS.UnityEngine.KeyCode.W) thenself.direction = self.direction + CS.UnityEngine.Vector3(0, 0, 1)endif CS.UnityEngine.Input.GetKey(CS.UnityEngine.KeyCode.S) thenself.direction = self.direction + CS.UnityEngine.Vector3(0, 0, -1)endif CS.UnityEngine.Input.GetKey(CS.UnityEngine.KeyCode.A) thenself.direction = self.direction + CS.UnityEngine.Vector3(-1, 0, 0)endif CS.UnityEngine.Input.GetKey(CS.UnityEngine.KeyCode.D) thenself.direction = self.direction + CS.UnityEngine.Vector3(1, 0, 0)endself.gameObject.transform.position = self.gameObject.transform.position + self.direction * self.speed * CS.UnityEngine.Time.deltaTime
end_G.PlayerController = PlayerController
  1. 创建LuaImporter:在Assets/Scripts/Editor目录下,创建LuaImporter.cs,使得Unity能够将.lua后缀的文件识别为文本文件
using System.IO;
using UnityEditor;
using UnityEditor.AssetImporters;
using UnityEngine;
using XLuaTest;[ScriptedImporter(1, ".lua")]
public class LuaImporter : ScriptedImporter
{public override void OnImportAsset(AssetImportContext ctx){var luaTxt = File.ReadAllText(ctx.assetPath);var assetsText = new TextAsset(luaTxt);ctx.AddObjectToAsset("main obj", assetsText);ctx.SetMainObject(assetsText);}
}
  1. 创建并使用Lua虚拟机:在Assets/Scripts目录下,创建LuaManager.cs脚本,作为lua脚本执行的入口
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;public class LuaManager : MonoBehaviour
{LuaEnv luaEnv;LuaTable luaTable;LuaFunction luaFunction;void Start(){// 创建Lua虚拟机luaEnv = new LuaEnv();// 指定Lua文件的加载方式luaEnv.AddLoader(LoadLuaFile);// 将C#对象存入Lua表中GameObject player = GameObject.Find("Player");luaEnv.DoString("require('Lua.PlayerController')");// 设置PlayerController的gameObject属性,并获取Update函数luaTable = luaEnv.Global.Get<LuaTable>("PlayerController");luaTable.Set("gameObject", player);luaFunction = luaTable.Get<LuaFunction>("Update");}void Update(){// 执行PlayerController:Update()函数luaFunction.Call(luaTable);}public static byte[] LoadLuaFile(ref string filepath){filepath = $"{filepath.Replace(".", "/")}";TextAsset file = Resources.Load(filepath) as TextAsset;return file.bytes;}
}
  1. 创建对象,挂载脚本:
    打开SampleScene场景,创建三个对象:一个空对象,一个Capsule(将名称修改为Player),一个Plane,在空对象上挂载LuaManager脚本
  2. 测试:
    启动游戏,可通过键盘WASD控制Player移动

三、打包

  1. 菜单栏选择XLua > Generate Code
  2. 菜单栏选择File > Build Settings,打开Build Settings面板,上方选择要打包的场景,左侧Platform栏选择目标平台(以Android为例),然后右下角选择Build,选择打包路径,等待打包完成即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/872790.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows RocketMQ 安装-截止当前最新版本(RocketMQ-5.3.1)图文教程

Windows RocketMQ 安装(图文教程) Windows RocketMQ 安装,截止当前最新版本(RocketMQ-5.3.1)图文教程,本文只是最简单的安装方法,旨在能快速使用,若需要更多的配置,则需要你自行查阅官方文档,或互联网搜索答案咯,哈哈哈哈 前言 本文中所有的路径,包括 JAVA 环境,都不…

2025年职场人常用的桌面日程管理软件有哪些?推荐这五款

在繁忙的职场生活中,一款高效的日程管理软件无疑是提升工作效率的秘密武器。 进入2025年,今天给大家介绍5款打工人常用的电脑桌面日程管理软件,它们各有优缺点,看看哪款是你需要的吧! 一、Win系统日历 作为Windows系统自带的日程管理工具,Win系统日历以其简洁易用著称。你…

大趋势下企业如何实现智能制造 | 珠海盈致

在当今全球制造业竞争日益激烈的背景下,智能制造已成为企业提升核心竞争力的关键路径。随着物联网、大数据、云计算、人工智能等技术的快速发展,智能制造正逐步从概念走向现实,为企业带来生产效率、产品质量、成本控制等方面的显著提升。那么,在大趋势下,企业如何实现智能…

【docker】如何运行没有Root权限的Docker?

以下文章来源于运维自习室 ,作者运维自习室 Rootless模式的目的是让Docker守护进程以非root用户身份运行。该方案以实验特性的方式在v19.03版本引入,并在v20.10版本成为正式功能。 实践 官方文档已经做了详细的介绍,这里仅仅做一下实践复现。 具体实践环境为: CentOS 7.2 d…

从0开始的ctf旅行之pwn篇

*最后更新时间:2025-01-21 10:17:43 星期二 * 零、前言 本篇文章是我个人从0开始打pwn的真实 坐牢 做题经验,包含了大量的参考链接和个人思考,绝大多数题目来自MoeCTF2024(https://ctf.xidian.edu.cn/) 本文默认你有以下基础:python3 会装虚拟机+基本的Linux操作 C语言一、…

识别两个表格文件,根据手机号进行匹配相同行并按照需要字段输出

python代码# -*- coding: utf-8 -*- # encoding:utf-8 from flask import Flask, render_template, request, send_file,jsonify import os, requests import pandas as pd from datetime import datetime, timedelta import time, json from log import logging import thread…

语音播报,套件多少异常的问题。(含源代码)

在工作中遇到一家工厂老板的需求:因为产品是有多个配件组成,在生产的时候,经常会多生产,少生产,在组装时,也会出现配件多少的问题,现就此问题设计一款程序。多出,少的,异常的,正常好,会开语音播报。现将全部代码给出以备。 import inspect import os import threadi…

EDMA3学习笔记1

1.1 EDMA3简介 EDMA3(Enhanced Direct Memory Access 3):增强型直接存储器访问的控制器。它是DSP中一个高级数据传输引擎,其结构适合数据的高速传输,可以在没有CPU主要参与的情况下,由控制器完成数据转移,主要服务外部内存(DDR)、片上内存(L2 SRAM)以及串口外设等。…

又一个新项目完结,炸裂!

除了全程直播讲解的、50 个小时的保姆级视频教程之外,我还写了整套文字教程(15 万多字),细致入微!大家好,我是程序员鱼皮。经过了 2 个月的爆肝,我在自己的编程导航的第 11 套有 保姆级教程 的大项目 —— 企业级智能协同云图库平台,完结啦!除了全程直播讲解的、50 个…

kylin V10 SP2 离线单机部署tidb v8.3.0

准备离线组件包 在官方下载页面选择对应版本的 TiDB server 离线镜像包(包含 TiUP 离线组件包)。需要同时下载 TiDB-community-server 软件包和 TiDB-community-toolkit 软件包。 部署离线环境TiUP组件 将离线包传至服务器,执行以下命令安装 TiUP 组件: tar zxvf tidb-comm…