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 < )
{
Debug.LogError("Lua must return a table " + LuaPath);
return false;
} mSelfTable = luaRet[] 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"), , );
moveDirection = transform:TransformDirection(moveDirection);
moveDirection = moveDirection * ;
end
-- Apply gravity
moveDirection.y =moveDirection.y- * Time.deltaTime;
characterController:Move(moveDirection * Time.deltaTime); end return Player;

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

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

    关于<Thinking in Unity3D> 笔者在研究和使用Unity3D的过程中,获得了一些Unity3D方面的信息,同时也感叹Unity3D设计之精妙.不得不说,笔者最近几年的引擎 ...

  2. Unity3d 开发之 ulua 坑的总结

    相同的 lua 代码在安卓上能正常运行,但在 IOS 上可能不会正常运行而导致报红,崩溃等,我在使用 lua 编程时遇到的一些坑总结如下: 1. File.ReadAllText, 诸如以下代码在 i ...

  3. Unity3D LuaBundleLoader(基于cslua)

    说明:异步加载lua的bundle,会优先加载cache目录下bundle(一般更新的资源都在cache下) using System; using UnityEngine; using System ...

  4. unity3d热更新插件uLua学习整理

    前言 IOS不能热更新,不是因为不能用反射,是因为System.Reflection.Assembly.Load 无法使用System.Reflection.Emit 无法使用System.CodeD ...

  5. Thinking in Unity3D

    关于<Thinking in Unity3D> 笔者在研究和使用Unity3D的过程中,获得了一些Unity3D方面的信息,同时也感叹Unity3D设计之精妙.不得不说,笔者最近几年的引擎 ...

  6. Unity3D游戏开发初探—1.跨平台的游戏引擎让.NET程序员新生

    一.Unity3D平台简介 Unity是由Unity Technologies开发的一个让轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的 ...

  7. 【Unity3D】AR应用中,关于东南西北方位的判断。

    这篇文章的应用场景是这样子的: 首先我们要做的是一个带有LBS定位服务(比如高德地图.百度地图等)AR功能,在这个场景中,会有一些地图上的”点“(如派出所.学校)是我们需要显示在我们的AR镜头上的,如 ...

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

    前言 写在最前面,本文未必适合纯新手,但有一些C#开发经验的还是可以看懂的,虽然本人也是一位Unity3D新人,但是本文只是自己在学习Inventory Pro的学习总结,而不是教程,本人觉得要读懂理 ...

  9. 在Unity3D的网络游戏中实现资源动态加载

    用Unity3D制作基于web的网络游戏,不可避免的会用到一个技术-资源动态加载.比如想加载一个大场景的资源,不应该在游戏的开始让用户长时间等待全部资源的加载完毕.应该优先加载用户附近的场景资源,在游 ...

随机推荐

  1. #1015 : KMP算法

    kmp算法的定义可以从网上查找.我个人的理解是要从模式串中寻找出和模式串开头字母相同的字母个数,构建一个next数组用于匹配原串失败时判断模式串回溯的位置. 注意点:匹配成功后模式串的迭代因子j应该如 ...

  2. Unity、Exception Handling引入MVP

    什么是MVP?在“MVP初探”里就有讲过了,就是一种UI的架构模式. 简单的描述一下Unity和Exception Handling Application Block: Unity是一个轻量级的可扩 ...

  3. myeclipse 2014 除了 默认加载的derby

    myeclipse 2014 去掉 默认加载的derby作为有轻微强迫症的我来说,server下面有一个我始终用不到的东西我是很不舒服的.最终我网查到解决办法,现在分享给大家.============ ...

  4. Java中普通代码块,构造代码块,静态代码块区别及代码示例

    //执行顺序:(优先级从高到低.)静态代码块>mian方法>构造代码块>构造方法. 其中静态代码块只执行一次.构造代码块在每次创建对象是都会执行. 1 普通代码块 1 //普通代码块 ...

  5. 使用最快速的方式激活windows10专业版

    1.安装win10专业版 2.在桌面新建“文本文档.txt” 3.复制如下代码到新新建的“文本文档.txt”中 slmgr /ipk VK7JG-NPHTM-C97JM-9MPGT-3V66T slm ...

  6. bzoj4726【POI2017】Sabota?

    首先可以推出来如果i没有带头叛变,那么i的父亲也一定不会带头叛变,证明显然 所以最劣情况初始的叛徒肯定是叶子,并且带头叛变的人一定是从某个叶子往上走一条链 f[i]表示i不带头叛变的话最小的x 那么我 ...

  7. bae上传图片失败

    出错原因:bae不支持文件写入.

  8. 加载dll过程中assembly失败

    错误现象: 进行插件读取时出现错误:“尝试从一个网络位置加载程序集,在早期版本的 .NET Framework 中,这会导致对该程序集进行沙盒处理.此发行版的 .NET Framework 默认情况下 ...

  9. grunt自动化构建工具

    一.什么是grunt? 是基于nodejs的项目构建工具,grunt和grunt插件是通过npm安装并管理的,npm是node.js的包管理器 二.为什么要用grunt? 自动化.对于反复重复的任务, ...

  10. Acer-宏碁电脑BOIS

    进入电脑BOIS界面; 1.开机(一闪而过)注意第一屏左下角,会有进入BIOS按键提示. 2.如一开机没有进入BIOS的键值提示,取而代之的是品牌机的Logo,可参阅以下列表:不是品牌机可参阅主板设置 ...