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 < )
{
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)的更多相关文章
- Thinking in Unity3D:基于物理着色(PBS)的材质系统
关于<Thinking in Unity3D> 笔者在研究和使用Unity3D的过程中,获得了一些Unity3D方面的信息,同时也感叹Unity3D设计之精妙.不得不说,笔者最近几年的引擎 ...
- Unity3d 开发之 ulua 坑的总结
相同的 lua 代码在安卓上能正常运行,但在 IOS 上可能不会正常运行而导致报红,崩溃等,我在使用 lua 编程时遇到的一些坑总结如下: 1. File.ReadAllText, 诸如以下代码在 i ...
- Unity3D LuaBundleLoader(基于cslua)
说明:异步加载lua的bundle,会优先加载cache目录下bundle(一般更新的资源都在cache下) using System; using UnityEngine; using System ...
- unity3d热更新插件uLua学习整理
前言 IOS不能热更新,不是因为不能用反射,是因为System.Reflection.Assembly.Load 无法使用System.Reflection.Emit 无法使用System.CodeD ...
- Thinking in Unity3D
关于<Thinking in Unity3D> 笔者在研究和使用Unity3D的过程中,获得了一些Unity3D方面的信息,同时也感叹Unity3D设计之精妙.不得不说,笔者最近几年的引擎 ...
- Unity3D游戏开发初探—1.跨平台的游戏引擎让.NET程序员新生
一.Unity3D平台简介 Unity是由Unity Technologies开发的一个让轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的 ...
- 【Unity3D】AR应用中,关于东南西北方位的判断。
这篇文章的应用场景是这样子的: 首先我们要做的是一个带有LBS定位服务(比如高德地图.百度地图等)AR功能,在这个场景中,会有一些地图上的”点“(如派出所.学校)是我们需要显示在我们的AR镜头上的,如 ...
- Unity3D 装备系统学习Inventory Pro 2.1.2 总结
前言 写在最前面,本文未必适合纯新手,但有一些C#开发经验的还是可以看懂的,虽然本人也是一位Unity3D新人,但是本文只是自己在学习Inventory Pro的学习总结,而不是教程,本人觉得要读懂理 ...
- 在Unity3D的网络游戏中实现资源动态加载
用Unity3D制作基于web的网络游戏,不可避免的会用到一个技术-资源动态加载.比如想加载一个大场景的资源,不应该在游戏的开始让用户长时间等待全部资源的加载完毕.应该优先加载用户附近的场景资源,在游 ...
随机推荐
- ajax 请求另一个html页面的指定的一部分 加载到本页面div
$.ajax( { url: url, //这里是静态页的地址 type: "GET", //静态页用get方法,否则服务器会抛出405错误 success: function(d ...
- 【跟着子迟品 underscore】Array Functions 相关源码拾遗 & 小结
Why underscore 最近开始看 underscore.js 源码,并将 underscore.js 源码解读 放在了我的 2016 计划中. 阅读一些著名框架类库的源码,就好像和一个个大师对 ...
- C# double 四舍五入
public static double Round(object data) { if (data == null || data == System.DBNull.Value) { return ...
- 在C#项目中需要用double类型操作MSSQL float类型数据(附C#数据类型和SQL数据类型对照)
C#操作SQL Float类型,数据会多很多小数,原来是C#的float和sql的float类型不一致.以下是数据库中与C#中的数据类型对照. /// <summary> /// 数据库中 ...
- 你真的理解Java的按引用传递吗?
首先我们来看下面这段代码: public class Test1 { String a = "123"; public static void change(Test1 test) ...
- 使用matlab进行空间拟合
假设有这么一组数据, x=[4 5 6 7 8 4 8 10]'; y=[56 56 56 56 56 60 60 60]';z=[6 6 6 9 6 19 6 6]'; 要求出其平面方程z=C+Ax ...
- oracle普通用户登录em
刚新创建一个用户,登陆EM(Enterprise Manager) 如下提示: 应用程序要求的数据库权限超出了您当前具有的权限.有关特定版本的详细信息, 解决办法: 给登陆用户赋予 select_ca ...
- Python【第四章】:socket
ocket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Uni ...
- .net 执行sql包含go语句的处理
今天工作中遇到了这个问题,其实只要把GO替换成“;”就行了,其它人写的例子用Split来拆分这一个脚本文件的内容,完全没有必要
- Linux 内核数据结构:Linux 双向链表
Linux 内核提供一套双向链表的实现,你可以在 include/linux/list.h 中找到.我们以双向链表着手开始介绍 Linux 内核中的数据结构 ,因为这个是在 Linux 内核中使用最为 ...