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. 错误"ORA-04091: table is mutating, trigger/function may not see it"的原因以及解决办法

    错误的原因该错误是在编写trigger时常遇到的问题,其根本原因是由于对本表的操作造成的.对于使用了for each row 的触发器,做了DML操作(delete,update,insert),还没 ...

  2. jqgrid

    官方主页 http://www.jqgrid.com/目前最新版本:jqGrid 3.7 Beta在线文档: http://www.secondpersonplural.ca/jqgriddocs/i ...

  3. nginx.conf中配置laravel框架站点

    nginx.conf配置如下: user nginx nginx;worker_processes 4; error_log logs/error.log error; pid logs/nginx. ...

  4. sublimetext3安装px转rem的神器

    在用sublimetext3写css的时候,我们有时会进行单位换算,为了更快的获得我们想要的单位结果,我们可以安装cssrem这个神器(插件). 首先,我们要先下载好插件,下载地址如下: 地址:htt ...

  5. jsonp接口的xss防范

    防范方式也很简单,只要在header里输出类型设置为javascript即可: 1 header('Content-type: text/javascript;charset=utf-8');

  6. 在servlet中用spring @Autowire注入

    今天在改版以前应用程序的时候,发现很多系统是直接用servlet做的.当初也用到了spring,所以自然想到也用spring的@autowire注入来引入service层.但发现如果直接用,有时候成功 ...

  7. 读取本地外网IP地址

    读取本地外网IP地址. 根据启动并运行的网卡名称,找到本机实际的IP地址(已知当前运行的无线网卡名包含某一个字符) import java.net.InterfaceAddress; import j ...

  8. java-map和object装换

    /** * 使用org.apache.commons.beanutils进行转换 */ class A { public static Object mapToObject(Map<String ...

  9. 【CityHunter】通过Unity3D来制作游戏中AR部分的内容

    嗯,最近再考虑,CityHunter中,玩家攻略藏宝图时,为了增加可玩性,应该增强在AR部分的游戏性.最近特别火的游戏<Pokemon Go>在打开摄像头以后,可以看到小精灵,实际上,如果 ...

  10. TeamViewer12.0.71503(远程控制软件)精简版 单文件企业版介绍

    TeamViewer 是一款能在任何防火墙和 NAT 代理的后台用于远程控制,桌面共享和文件传输的简单且快速的解决方案.为了连接到另一台计算机,只需要在两台计算机上同时运行 TeamViewer 即可 ...