Unity3D LuaComponent(基于ulua)

LuaComponent可以支持配一个需要执行在这个gameObject上的lua脚本,并且每个gameObject上的lua都是一个实例

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

//Lua组件 public class LuaComponent : MonoBehaviour
{
    //lua环境,需要在使用前给其赋值
    public static LuaState s_luaState; 

    //函数名字定义
    protected static class  FuncName
    {
        public static readonly string Awake = "Awake";
        public static readonly string OnEnable = "OnEnable";
        public static readonly string Start = "Start";
        public static readonly string Update = "Update";
        public static readonly string OnDisable = "OnDisable";
        public static readonly string OnDestroy = "OnDestroy";
    };

    //lua路径,不用填缀名,可以是bundle
    [Tooltip("script path")]
    public string LuaPath;

    //预存函数提高效率
    protected Dictionary<string, LuaFunction> mDictFunc = new Dictionary<string, LuaFunction>();

    //lua表,当gameObject销毁时要释放
    private LuaTable mSelfTable = null;

    //初始化函数,可以被重写,已添加其他
    protected virtual bool Init()
    {
        if (string.IsNullOrEmpty(LuaPath))
        {
            return false;
        }

        object[] luaRet = s_luaState.DoFile(LuaPath);
        if (luaRet == null || luaRet.Length < 1)
        {
            Debug.LogError("Lua must return a table " + LuaPath);
            return false;
        }

        mSelfTable = luaRet[0] as LuaTable;
        if (null == mSelfTable)
        {
            Debug.LogError("null == luaTable  " + LuaPath);
            return false;
        }

        AddFunc(FuncName.Awake);
        AddFunc(FuncName.OnEnable);
        AddFunc(FuncName.Start);
        AddFunc(FuncName.Update);
        AddFunc(FuncName.OnDisable);
        AddFunc(FuncName.OnDestroy);

        return true;
    }

    //保存函数
    protected bool AddFunc(string name)
    {
        var func = mSelfTable.GetLuaFunction(name);
        if (null == func)
        {
            return false;
        }
        mDictFunc.Add(name, func);
        return true;
    }

    //调用函数
    protected void CallLuaFunction(string name, params object[] args)
    {
        LuaFunction func = null;
        if (mDictFunc.TryGetValue(name, out func))
        {
            func.BeginPCall();
            foreach (var o in args)
            {
                func.Push(o);
            }
            func.PCall();
            func.EndPCall();
        }
    }

    void Awake()
    {
        Init();
        CallLuaFunction(FuncName.Awake,mSelfTable,gameObject);
    }

    void OnEnable()
    {
        CallLuaFunction(FuncName.OnEnable, mSelfTable, gameObject);
    }

    void Start()
    {
        CallLuaFunction(FuncName.Start, mSelfTable, gameObject);
    }

    void Update()
    {
        CallLuaFunction(FuncName.Update, mSelfTable, gameObject);
    }

    void OnDisable()
    {
        CallLuaFunction(FuncName.OnDisable, mSelfTable, gameObject);
    }

    void OnDestroy()
    {
        CallLuaFunction(FuncName.OnDestroy, mSelfTable, gameObject);

        //记得释放资源
        foreach (var pair in  mDictFunc)
        {
            pair.Value.Dispose();
        }
        mDictFunc.Clear();
        if (null != mSelfTable)
        {
            mSelfTable.Dispose();
            mSelfTable = null;
        }
    }

}

lua脚本形如,记得最后一定要return 这个表 而且每个变量都得是local的

local Player = {}

local transform = nil;

local characterController = nil;
local moveDirection = Vector3.zero;

function Player:Awake(gameObject)
    print("Awake");

    transform = gameObject.transform;
    characterController = gameObject:GetComponent(‘CharacterController‘);
end

function Player:Start( gameObject )
    print("Start")  

    --gameObject.transform.localPosition = Vector3.New(200,100);
end

function Player:OnDestroy( gameObject )
    print("OnDestroy")
end

function Player:Update(gameObject)
    if (characterController.isGrounded) then
        moveDirection = Vector3.New(Input.GetAxis("Horizontal"), 0, 0);
        moveDirection = transform:TransformDirection(moveDirection);
        moveDirection = moveDirection * 6;
    end
        -- Apply gravity
        moveDirection.y =moveDirection.y- 20 * Time.deltaTime;
        characterController:Move(moveDirection * Time.deltaTime);

end

return Player;
时间: 2024-08-09 02:04:36

Unity3D LuaComponent(基于ulua)的相关文章

在Unity3D中基于订阅者模式实现事件机制

??各位朋友,大家好,欢迎大家关注我的博客,我是秦元培,我的博客地址是http://qinyuanpei.com.今天博主想和大家分享的是在Unity3D中基于订阅者模式实现消息传递机制,我们知道Unity3D中默认提供了一种消息传递机制SendMessage,虽然SendMessage使用起来的确非常简单,可是它的这种简单是建立在付出一定的代价的基础上的.经常有朋友提及不同的模块间如何进行通信的问题,可能答案最终会落到单例模式.委托和事件机制这些关键词上,在这种情况下本文所探讨的内容可能会帮助

Unity3D &amp; Java 基于 Protobuf 通信实现

Unity3D & Java 基于 Protobuf 通信实现 最近研究Unity3D,同时需要给游戏制定一套通信协议.因为本人是后端出生,对C#的 Socket相关通信框架不太熟悉,经过几天的学习,终于搞定了.在这里公布出来,大家可以共同学习,少走弯路. 本文重点:演示怎么解析和发送协议. 技术选型 服务端1 Java7 netty 4 客户端2 C# SuperSocket.ClientEngine https://clientengine.codeplex.com/ 它是从SuperSoc

Thinking in Unity3D:基于物理着色(PBS)的材质系统

关于<Thinking in Unity3D> 笔者在研究和使用Unity3D的过程中,获得了一些Unity3D方面的信息,同时也感叹Unity3D设计之精妙.不得不说,笔者最近几年的引擎研发工作中,早已习惯性的从Unity3D中寻找解决方案. Unity3D虽比不上UE那么老练沉稳,气势磅礴.也比不上CE那样炫丽多姿,盛气凌人.但它的发展势如破竹,早已遍地生花!故而在此记录一些自己的心得体会,供大家参详交流.若有欠妥之处,还望各位及时指正. Thinking in Unity3D由一系列文章

Unity3D LuaBundleLoader(基于cslua)

说明:异步加载lua的bundle,会优先加载cache目录下bundle(一般更新的资源都在cache下) using System; using UnityEngine; using System.Collections; using System.Collections.Generic; using System.IO; using LuaInterface; public class LuaBundleLoader : MonoBehaviour { public delegate vo

unity3d热更新插件uLua学习整理

前言 IOS不能热更新,不是因为不能用反射,是因为System.Reflection.Assembly.Load 无法使用System.Reflection.Emit 无法使用System.CodeDom.Compiler 无法使用这三个不能用,就把传统dotnet动态路径坑死了为啥“这三个不能用,就把传统dotnet动态路径坑死了”呢动态载入dll或者cs的方法就这几个, IOS 下不能动态载入dll或者cs 文件,已经编译进去的没事.=============================

Unity3D 装备系统学习Inventory Pro 2.1.2 总结

前言 写在最前面,本文未必适合纯新手,但有一些C#开发经验的还是可以看懂的,虽然本人也是一位Unity3D新人,但是本文只是自己在学习Inventory Pro的学习总结,而不是教程,本人觉得要读懂理解Inventory Pro 2.1.2 这样的插件源码,你还是需有了一部分Unity3D的基础知识.但为什么说你有一定C#开发经验也是能看懂的呢?(有点绕),我想表达的意思是,Unity3D无非是一种技术或者工具,而装备系统是游戏逻辑的一种业务,其实如果侧重点在于业务,技术和工具不是那么重要,希望

ulua学习资料及问题解决方案

ulua群里的一些资料,转过来方面查看 ulua学习顺序.请根据自身了解的知识入座. 初级:SimpleFramework框架 中级:ulua插件.cstolua 高级:底层库编译. 框架的角色定位分为2种, 第一种,对于有框架的大厂,它就是个使用ulua+cstolua的一个比较完整的demo. 第二种,对于没有框架的同学,可以自己基于它修改.扩展. wrap就是c#类提供给lua用的接口文件 attempt to index global 'System' (a nil) 刚下载后,需要做两

uLua Unity工作机制

基于ulua 1.25版本,开启C#类型动态注册. 一.  步骤 注册需要Wrap的C#类型. 在WrapFile.cs类中,使用_GT(typeof(XXX)), 注册需要Wrap的C#类型 注册的C#类型被包装成BindType对象,在BindType构造函数里获取注册类型的类名,注册给Lua的名称,基类名称,Wrap的文件名称等信息,并保存在相应的BindType对象中.(这些是在WrapFile类创建时就生成的) 2. 执行编辑器脚本,生成Wrap的C#类, LuaBinder类,以及W

基于xlua和mvvm的unity框架

1.框架简介 这两天在Github上发现了xlua的作者车雄生前辈开源的一个框架—XUUI,于是下载下来学习了一下.XUUI基于xlua,又借鉴了mvvm的设计概念.xlua是目前很火的unity热更方案,不仅支持纯lua脚本热更,也可以做 C# 代码的bug hotfix,而mvvm框架呢,在前端开发中应用很广,我周围同事在做wpf开发时也用到了mvvm框架,mvvm模式在unity开发中也同样适用,github上可以找到不少开源案例.XUUI主要有两大核心能力:一是支持MVVM的单向.双向绑