LuaComponent可以支持配一个需要执行在这个gameObject上的lua脚本,并且每个gameObject上的lua都是一个实例

  1. using UnityEngine;
  2. using LuaInterface;
  3. using System.Collections.Generic;
  4.  
  5. //Lua组件 public class LuaComponent : MonoBehaviour
  6. {
  7. //lua环境,需要在使用前给其赋值
  8. public static LuaState s_luaState;
  9.  
  10. //函数名字定义
  11. protected static class FuncName
  12. {
  13. public static readonly string Awake = "Awake";
  14. public static readonly string OnEnable = "OnEnable";
  15. public static readonly string Start = "Start";
  16. public static readonly string Update = "Update";
  17. public static readonly string OnDisable = "OnDisable";
  18. public static readonly string OnDestroy = "OnDestroy";
  19. };
  20.  
  21. //lua路径,不用填缀名,可以是bundle
  22. [Tooltip("script path")]
  23. public string LuaPath;
  24.  
  25. //预存函数提高效率
  26. protected Dictionary<string, LuaFunction> mDictFunc = new Dictionary<string, LuaFunction>();
  27.  
  28. //lua表,当gameObject销毁时要释放
  29. private LuaTable mSelfTable = null;
  30.  
  31. //初始化函数,可以被重写,已添加其他
  32. protected virtual bool Init()
  33. {
  34. if (string.IsNullOrEmpty(LuaPath))
  35. {
  36. return false;
  37. }
  38.  
  39. object[] luaRet = s_luaState.DoFile(LuaPath);
  40. if (luaRet == null || luaRet.Length < )
  41. {
  42. Debug.LogError("Lua must return a table " + LuaPath);
  43. return false;
  44. }
  45.  
  46. mSelfTable = luaRet[] as LuaTable;
  47. if (null == mSelfTable)
  48. {
  49. Debug.LogError("null == luaTable " + LuaPath);
  50. return false;
  51. }
  52.  
  53. AddFunc(FuncName.Awake);
  54. AddFunc(FuncName.OnEnable);
  55. AddFunc(FuncName.Start);
  56. AddFunc(FuncName.Update);
  57. AddFunc(FuncName.OnDisable);
  58. AddFunc(FuncName.OnDestroy);
  59.  
  60. return true;
  61. }
  62.  
  63. //保存函数
  64. protected bool AddFunc(string name)
  65. {
  66. var func = mSelfTable.GetLuaFunction(name);
  67. if (null == func)
  68. {
  69. return false;
  70. }
  71. mDictFunc.Add(name, func);
  72. return true;
  73. }
  74.  
  75. //调用函数
  76. protected void CallLuaFunction(string name, params object[] args)
  77. {
  78. LuaFunction func = null;
  79. if (mDictFunc.TryGetValue(name, out func))
  80. {
  81. func.BeginPCall();
  82. foreach (var o in args)
  83. {
  84. func.Push(o);
  85. }
  86. func.PCall();
  87. func.EndPCall();
  88. }
  89. }
  90.  
  91. void Awake()
  92. {
  93. Init();
  94. CallLuaFunction(FuncName.Awake,mSelfTable,gameObject);
  95. }
  96.  
  97. void OnEnable()
  98. {
  99. CallLuaFunction(FuncName.OnEnable, mSelfTable, gameObject);
  100. }
  101.  
  102. void Start()
  103. {
  104. CallLuaFunction(FuncName.Start, mSelfTable, gameObject);
  105. }
  106.  
  107. void Update()
  108. {
  109. CallLuaFunction(FuncName.Update, mSelfTable, gameObject);
  110. }
  111.  
  112. void OnDisable()
  113. {
  114. CallLuaFunction(FuncName.OnDisable, mSelfTable, gameObject);
  115. }
  116.  
  117. void OnDestroy()
  118. {
  119. CallLuaFunction(FuncName.OnDestroy, mSelfTable, gameObject);
  120.  
  121. //记得释放资源
  122. foreach (var pair in mDictFunc)
  123. {
  124. pair.Value.Dispose();
  125. }
  126. mDictFunc.Clear();
  127. if (null != mSelfTable)
  128. {
  129. mSelfTable.Dispose();
  130. mSelfTable = null;
  131. }
  132. }
  133.  
  134. }

lua脚本形如,记得最后一定要return 这个表 而且每个变量都得是local的

  1. local Player = {}
  2.  
  3. local transform = nil;
  4.  
  5. local characterController = nil;
  6. local moveDirection = Vector3.zero;
  7.  
  8. function Player:Awake(gameObject)
  9. print("Awake");
  10.  
  11. transform = gameObject.transform;
  12. characterController = gameObject:GetComponent('CharacterController');
  13. end
  14.  
  15. function Player:Start( gameObject )
  16. print("Start")
  17.  
  18. --gameObject.transform.localPosition = Vector3.New(200,100);
  19. end
  20.  
  21. function Player:OnDestroy( gameObject )
  22. print("OnDestroy")
  23. end
  24.  
  25. function Player:Update(gameObject)
  26. if (characterController.isGrounded) then
  27. moveDirection = Vector3.New(Input.GetAxis("Horizontal"), , );
  28. moveDirection = transform:TransformDirection(moveDirection);
  29. moveDirection = moveDirection * ;
  30. end
  31. -- Apply gravity
  32. moveDirection.y =moveDirection.y- * Time.deltaTime;
  33. characterController:Move(moveDirection * Time.deltaTime);
  34.  
  35. end
  36.  
  37. 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. Log4j简单学习笔记

    log4j结构图: 结构图展现出了log4j的主结构.logger:表示记录器,即数据来源:appender:输出源,即输出方式(如:控制台.文件...)layout:输出布局 Logger机滤器:常 ...

  2. Python学习Day2笔记(集合和文件操作)

    1.集合的使用 列表是有序的可包含重复内容的 集合是无序的不可包含重复内容的 1) 集合关系测试 #列表去重list_1=[1,4,5,6,7,8,9,7,5,4,23,2] #有重复数据 list_ ...

  3. 20145208 GDB调试汇编堆栈过程分析

    20145208 GDB调试汇编堆栈过程分析 测试代码 #include<stdio.h> short addend1 = 1; static int addend2 = 2; const ...

  4. CSS基本知识1-CSS基本概念

    CSS基本概念: 选择器{属性:值;属性:值} CSS继承:子元素继承父元素样式,父子关系看DOM结构. CSS覆盖: 浏览器缺省设置 外部样式表 内部样式表(位于 <head> 标签内部 ...

  5. 数学的东西(BZOJ1951)

    #include <cstdio> #define LL long long LL finmo=; LL fac[][],inv[][]; LL tmp[],rev[]; LL n,g,x ...

  6. Node+Socketio实现消息群发功能

    注:本博文是作者原创,转载请注明出处. 在项目中时常会使用到socketio,今天我们就来实现Node+socketio实现群发消息功能, 项目源码:https://github.com/zhangx ...

  7. 递推 hdu 2048

    t 关于错排 共n个数 第n个 和一个交换  其他n-2错排  (n-1)*z[n-2]; n-1个错排 第n个和n-1个交换    (n-1)*z[n-1]; 求和 然后概率的话要除n! 一个一个除 ...

  8. UTF-8 Unicode ANSI网页编码的区别

    1.ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte).也 ...

  9. bzoj4571: [Scoi2016]美味

    4571: [Scoi2016]美味 Time Limit: 30 Sec Memory Limit: 256 MB Submit: 275 Solved: 141 [Submit][Status][ ...

  10. BZOJ3168: [Heoi2013]钙铁锌硒维生素

    设$A^TC=B^T$,这样$C_{ij}$表示$B_j$的线性表出需要$A_i$,那么$B_j$可以替换$A_i$,根据$C=(A^T)^{-1}B^T$求出$C$.要求字典序最小完美匹配,先求任意 ...