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的网络游戏,不可避免的会用到一个技术-资源动态加载.比如想加载一个大场景的资源,不应该在游戏的开始让用户长时间等待全部资源的加载完毕.应该优先加载用户附近的场景资源,在游 ...
随机推荐
- # 2015-2016-2 《Java程序设计》课程总结
2015-2016-2 <Java程序设计>课程总结
- docfx daylybuild
参考:https://myget.org/gallery/docfx-dev 根据对应的vs或nuget版本中添加地址. PS:daylybuild可能包含很多错误哦.
- css的继承性
为了减少css的代码量,很多时候,我们必须要非常重视css的继承性 1.首先,有些属性是不能继承的.这没有任何原因,只是因为它就是这么设置的.举个例子来说:border属性,大家都知道,border属 ...
- js 判断各种数据类型
了解js的都知道, 有个typeof 用来判断各种数据类型,有两种写法:typeof xxx ,typeof(xxx) 如下实例: typeof 2 输出 number ...
- 【51Nod 1674】【算法马拉松 19A】区间的价值 V2
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1674 对区间分治,统计\([l,r]\)中经过mid的区间的答案. 我的 ...
- Dedecms去掉URL中a目录的方法
本文实例讲述了Dedecms去掉URL中a目录的方法.分享给大家,供大家参考.具体分析如下: 使用dedecms的朋友可能会发现自己的URL目录生成是会自动带有一个/A/目录了,那么要如何去掉URL中 ...
- js判断用户的浏览设备是移动设备还是PC
<script type="text/javascript"> function browserRedirect() { var sUserAgent = naviga ...
- 解决:ERROR: Cannot launch Jack server
问题重现: Install: /home/dinphy/sm/out/target/product/ido/system/lib/libdl.so java -Xmx3500m -jar /home/ ...
- Zabbix使用点滴
Application --> Items --> Triggers 1.磁盘柜日志输出至Rsyslog服务器,Zabbix抓取:System-Syslogsystem-log(log[/ ...
- <<< Oracle表空间创建、修改、删除基本操作
ORACLE 中,表空间是数据管理的基本方法,所有用户的对象要存放在表空间中,也就是用户有空间的使用权,才能创建用户对象 create tablespace myts //建立表空间,名为mytsd ...