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的网络游戏,不可避免的会用到一个技术-资源动态加载.比如想加载一个大场景的资源,不应该在游戏的开始让用户长时间等待全部资源的加载完毕.应该优先加载用户附近的场景资源,在游 ...
随机推荐
- Log4j简单学习笔记
log4j结构图: 结构图展现出了log4j的主结构.logger:表示记录器,即数据来源:appender:输出源,即输出方式(如:控制台.文件...)layout:输出布局 Logger机滤器:常 ...
- Python学习Day2笔记(集合和文件操作)
1.集合的使用 列表是有序的可包含重复内容的 集合是无序的不可包含重复内容的 1) 集合关系测试 #列表去重list_1=[1,4,5,6,7,8,9,7,5,4,23,2] #有重复数据 list_ ...
- 20145208 GDB调试汇编堆栈过程分析
20145208 GDB调试汇编堆栈过程分析 测试代码 #include<stdio.h> short addend1 = 1; static int addend2 = 2; const ...
- CSS基本知识1-CSS基本概念
CSS基本概念: 选择器{属性:值;属性:值} CSS继承:子元素继承父元素样式,父子关系看DOM结构. CSS覆盖: 浏览器缺省设置 外部样式表 内部样式表(位于 <head> 标签内部 ...
- 数学的东西(BZOJ1951)
#include <cstdio> #define LL long long LL finmo=; LL fac[][],inv[][]; LL tmp[],rev[]; LL n,g,x ...
- Node+Socketio实现消息群发功能
注:本博文是作者原创,转载请注明出处. 在项目中时常会使用到socketio,今天我们就来实现Node+socketio实现群发消息功能, 项目源码:https://github.com/zhangx ...
- 递推 hdu 2048
t 关于错排 共n个数 第n个 和一个交换 其他n-2错排 (n-1)*z[n-2]; n-1个错排 第n个和n-1个交换 (n-1)*z[n-1]; 求和 然后概率的话要除n! 一个一个除 ...
- UTF-8 Unicode ANSI网页编码的区别
1.ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte).也 ...
- bzoj4571: [Scoi2016]美味
4571: [Scoi2016]美味 Time Limit: 30 Sec Memory Limit: 256 MB Submit: 275 Solved: 141 [Submit][Status][ ...
- BZOJ3168: [Heoi2013]钙铁锌硒维生素
设$A^TC=B^T$,这样$C_{ij}$表示$B_j$的线性表出需要$A_i$,那么$B_j$可以替换$A_i$,根据$C=(A^T)^{-1}B^T$求出$C$.要求字典序最小完美匹配,先求任意 ...