unity lua开发体系搭建

这篇具有很好参考价值的文章主要介绍了unity lua开发体系搭建。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在前面的文章里面我们已经介绍了怎么样在unity里面配置lua的开发环境,我们可以通过C#代码装载lua的脚本并执行相应的处理,这次我们一步步搭建下lua的开发体系。
1.基于c#体系所有的类都继承MonoBehaviour在这里lua环境下我们也需要创建一个类似于这个类的东西,我们叫这个类LuaBehaviour在这个类里面我们提供了transform及object的实例

local LuaBehaviour = {}
function LuaBehaviour:new(instant) 
	if not instant then 
		instant = {} --类的实例
	end
	setmetatable(instant, {__index = self}) 
	return instant
end

-- 返回一个基类为base的类;
function LuaExtend(base) 
	return base:new()
end

function LuaBehaviour:init(obj)
	self.transform = obj.transform
	self.gameObject = obj
end

return LuaBehaviour

这里面提供三个方法 new方法创建实例对象,init创建实例化对象后初始化游戏要用到,最后一个方法可以理解为继承后面我们会介绍到。

2.上面的init方法我们可以看到有两个对象transform以及gameobject这两个对象是怎么来的可以看到transform是gameobject点出来的,那我们是不是需要一个gameobject的基类我们叫做LuaGameObject
类代码如下

LuaGameObject = {}

local GameObject = CS.UnityEngine.GameObject
local GameObjectMap = {}
-- key ObjectID:  {lua组件实例1, Lua组件实例2, ...};

local function Instantiate(prefab)
	GameObject.Instantiate(prefab)
end

local function Destroy(obj)
	local obj_id = obj:GetInstanceID()
	if (GameObjectMap[obj_id]) then -- 删除掉所有的组件实例
		table.remove(GameObjectMap, obj_id)
	end

	GameObject.Destroy(obj)
end

local function Find(name)
	return GameObject.Find(name)
end

local function AddLuaComponent(obj, lua_class)
	local componet = lua_class:new()
	componet:init(obj) 

	local obj_id = obj:GetInstanceID()

	if (GameObjectMap[obj_id]) then
		table.insert(GameObjectMap[obj_id], componet)
	else
		GameObjectMap[obj_id] = {}
		table.insert(GameObjectMap[obj_id], componet)
	end

	if componet.Awake ~= nil then 
		componet:Awake()
	end
	
	return componet
end

local function trigger_update(components_array)
	local key, value
	for key, value in pairs(components_array) do
		if value.Update ~= nil then
			value:Update()
		end
	end
end

local function trigger_fixupdate(components_array)
	local key, value
	for key, value in pairs(components_array) do
		if value.FixedUpdate ~= nil then
			value:FixedUpdate()
		end
	end
end

local function trigger_lateupdate(components_array)
	local key, value
	for key, value in pairs(components_array) do
		if value.LateUpdate ~= nil then
			value:LateUpdate()
		end
	end
end

local function Update()
	local key, value
	for key, value in pairs(GameObjectMap) do
		trigger_update(value)
	end
end

local function FixedUpdate()
	local key, value
	for key, value in pairs(GameObjectMap) do
		trigger_fixupdate(value)
	end
end

local function LateUpdate()
	local key, value
	for key, value in pairs(GameObjectMap) do
		trigger_lateupdate(value)
	end
end

LuaGameObject.Update = Update
LuaGameObject.LateUpdate = LateUpdate
LuaGameObject.FixedUpdate = FixedUpdate

LuaGameObject.Find = Find
LuaGameObject.Instantiate = Instantiate
LuaGameObject.Destroy = Destroy
LuaGameObject.AddLuaComponent = AddLuaComponent

return LuaGameObject 

上面我们提供了几个方法有需要的话可以继续添加方法以满足开发的需要。 Find函数负责找到我们需要的GameObject,Instantiate用过预制体的伙伴都熟悉这个函数负责实例化对象用的,Destroy不用说销毁对象用的这里需要注意的是我们表里面跟这个对象挂钩的数据也要一并清理掉。AddLuaComponent这块是重点我们处理逻辑是将脚本实例化,并调用init方法初始化object以及transform跟上面的LuaBehaviour脚本对应上了,将脚本存放到表中去,这样做的目的主要是在update里面调用脚本上面的update函数等等。

3.假如我们需要通过lua控制一个物体不断移动我们试着建立一个脚本叫做cube_ctrl继承LuaBehaviour

local LuaBehaviour = require("Component.LuaBehaviour")
local cube_ctrl = LuaExtend(LuaBehaviour)

function cube_ctrl:Awake()
	print("========Awake=========")
end 

function cube_ctrl:Update()
	self.transform:Translate(0, 0, 5 * CS.UnityEngine.Time.deltaTime)
end

return cube_ctrl

4.我们添加一个场景游戏启动类

local start = {}
local cube_ctrl = require("game.cube_ctrl")

local function enter_login_scene()
	print("enter_login_scene")
	local obj = LuaGameObject.Find("Cube")
	LuaGameObject.AddLuaComponent(obj, cube_ctrl)
end

local function enter_game_scene()
end

local function init()
	enter_login_scene()
end
start.init = init
return start;

这个类的处理也是很简单定义了一个初始化方法初始化的时候调用enter_login_scene方法这里面找到了场景中物体Cube然后给这个物体添加脚本,这样update处理就能处理到这些脚本的update方法
5.最后的处理将我们这些造好的轮子驱动起来,如何驱动这些脚本回到我们的main方法中去

require("managers.LuaGameObject")
local game = require("game.start")

main = {} -- main是一个全局模块;

local function start()
	game.init();
end

local function Update()
	LuaGameObject.Update()
end

local function FixedUpdate()
	LuaGameObject.FixedUpdate()
end


local function LateUpdate()
	LuaGameObject.LateUpdate()
end

main.Update = Update
main.FixedUpdate = FixedUpdate
main.LateUpdate = LateUpdate
main.start = start

return main

最后是C#调用代码代码如下

 using UnityEngine;
using XLua;

public class LuaLoader : MonoBehaviour
{
    private LuaEnv luaEnv = null;
    void Start()
    {
        luaEnv = new LuaEnv();
        luaEnv.AddLoader(MyLuaLoader);
        LoadScript("main");
        SafeDoString("main.start()");//执行脚本
    }

    void Update()
    {
        SafeDoString("main.Update()");
    }

    void FixedUpdate()
    {
        SafeDoString("main.FixedUpdate()");
    }

    void LateUpdate()
    {
        SafeDoString("main.LateUpdate()");
    }

    public static byte[] MyLuaLoader(ref string filePath)
    {
        string scriptPath = string.Empty;
        filePath = filePath.Replace(".", "/") + ".lua";
        scriptPath += Application.dataPath + "/LuaScripts/" + filePath;
        return GameUtility.SafeReadAllBytes(scriptPath);//通过文件IO读取lua内容
    }

    public void LoadScript(string scriptName)
    {
        SafeDoString(string.Format("require('{0}')", scriptName));
    }

    public void SafeDoString(string scriptContent)
    { // 执行脚本, scriptContent脚本代码的文本内容;
        if (this.luaEnv != null)
        {
            try
            {
                luaEnv.DoString(scriptContent); // 执行我们的脚本代码;
            }
            catch (System.Exception ex)
            {
                string msg = string.Format("xLua exception : {0}\n {1}", ex.Message, ex.StackTrace);
                Debug.LogError(msg, null);
            }
        }
    }
}

场景也是极其简单在场景放一个cube即可
unity lua开发体系搭建,unity,lua,junit文章来源地址https://www.toymoban.com/news/detail-726337.html

到了这里,关于unity lua开发体系搭建的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【HBZ分享】高并发下Redis+Nginx+Lua+Canal架构体系设计

    设计简单,可以支持普通并发现的大部分需求,但如果并发太高,该方案依然无法支撑。 瓶颈卡在tomcat的并发量低 通过lua直连redis nginx判断是否从nginx中直接获取缓存,如果需要获取,则通过lua直接去redis读取,并返回,整个过程不需要经历应用程序这层,所以性能很高,单

    2024年02月12日
    浏览(36)
  • Unity AR开发环境搭建

    在上一篇文章中,我定义了各种类型的扩展现实 (XR)。 在其中,我将增强现实 (AR) 定义为:增强现实 (AR) 将数字对象置于物理世界中。 通常,该设备将配备某种类型的相机(例如智能手机),可以实时提供叠加在其上的数字对象。 AR 通常仅使用 UI 元素来允许您与数字对象进

    2024年04月22日
    浏览(42)
  • HTCviveVR基于unity开发搭建初始界面

    @作者: 风不停息丶 1、先导入steamVR插件,基于steamVR插件搭建的环境,在unity商城可以下载 2、为摄像机Camera添加steamVR插件的脚本SteamVR_Camera,然后点击Expand自动搭建初始VR环境,就可以在VR中看到画面了,但是没有手柄显示 自动生成的场景对象

    2024年02月12日
    浏览(28)
  • Unity xLua开发环境搭建与基础进阶

    Unity是一款非常流行的游戏开发引擎,而xLua是一个为Unity开发者提供的Lua框架,可以让开发者使用Lua语言来进行游戏开发。在本文中,我们将介绍如何搭建Unity xLua开发环境,并进行基础进阶的学习。 环境搭建 首先,我们需要下载xLua框架,可以在GitHub上找到最新的版本。下载

    2024年02月22日
    浏览(37)
  • Unity+Pico:配置开发环境 搭建基础框架

     1、下载并解压PICO Unity Integration SDK 解压到本地,其中package.json就是将SDK添加到项目所要用到的文件。 下载并解压PICO Unity Live Preview Plugin (Experiment) 解压到本地,其中package.json就是画面预览功能所要用到的文件。 下载PICO Developer Center 双击下载好的文件   自定义安装位置,进

    2024年02月08日
    浏览(31)
  • 【Unity小帮手】Oculus Quest2+Unity 串流开发环境搭建

    (1)创建Facebook账号,将头盔连接电脑         首先要有一个Facebook账号,电脑端下载好Oculus,使用Link线将Oculus Quest2与电脑连接好,在眼镜中选择Link连接,如下图所示。 (2)电脑端启动Oculus软件与SteamVR                    (3)进入Unity,首先将Unity的开发环境修改为

    2024年02月14日
    浏览(34)
  • Unity PS4/PS5开发环境搭建

    首先,主机游戏PlayStation/Nintendo Switch都是比较闭塞的,开发者账号是必须的。 开发环境有两个部分,一是SDK Kit(各种开发调试环境),二是Unity的支持库(安装后才能在Unity中切换到PS平台); 需要严格按照SDK版本和对应支持的Unity版本安装开发环境。 1. 安装PS4/PS5 SDK: 登录开发

    2024年02月08日
    浏览(33)
  • Unity3D xLua开发环境搭建详解

    xLua是一种基于Lua语言的开发框架,可以帮助开发者在Unity3D中使用Lua脚本来开发游戏。 对惹,这里有一 个游戏开发交流小组 ,希望大家可以点击进来一起交流一下开发经验呀! 在本文中,我们将详细介绍如何搭建Unity3D xLua开发环境,包括安装Unity3D和xLua插件,配置环境变量

    2024年02月22日
    浏览(35)
  • idea调试unity里面的lua代码

    本人一名java后端开发,看到前端同事调试lua代码无脑print,甚为鄙视,百度加实操写一份调试unity的lua脚本文档 1.安装lua lua官网下载页面 最终下载页面 2.idea安装插件 emmylua 3.idea打开unity的lua脚本 idea-file-open 选择相应目录 idea-file-project structure-sdks选择+号 4.配置启动参数 5.复制

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

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

    2024年02月08日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包