xlua官方项目分析
xlua官方项目_U3DScripting分析代码里都放了我的注释哪里不懂都可以评论问我
LuaBehaviour.cs 代码
using UnityEngine;using System.Collections;using System.Collections.Generic;using XLua;using System;namespace XLuaTest
{//通过Injection来操控场景中的物体publicclassInjection{publicstring name;publicGameObjectvalue;}//从lua调用c#的某个类,希望生成适配代码所以打这个标签publicclassLuaBehaviour:MonoBehaviour{publicTextAsset luaScript;//lua代码,因为unity不能识别lua文件所以用txt类型public Injection[] injections;internalstaticLuaEnv luaEnv =newLuaEnv();//项目所有的lua文件都只用这一个虚拟机标志internalstaticfloat lastGCTime =0;internalconstfloat GCInterval =1;//1 second privateAction luaStart;//对应lua代码里的start函数privateAction luaUpdate;//对应lua代码的update函数privateAction luaOnDestroy;//对应lua代码里的ondestroy函数privateLuaTable scriptEnv;voidAwake(){
scriptEnv = luaEnv.NewTable();// 为每个脚本设置一个独立的环境,可一定程度上防止脚本间全局变量、函数冲突LuaTable meta = luaEnv.NewTable();
meta.Set("__index", luaEnv.Global);//赋值lua代码里的全局函数
scriptEnv.SetMetaTable(meta);
meta.Dispose();
scriptEnv.Set("self",this);//把c#的this对象赋值给lua的self,这样lua的self就能调用c#这个类的东西了foreach(var injection in injections)//把unity的对象传给lua文件{
scriptEnv.Set(injection.name, injection.value);}
luaEnv.DoString(luaScript.text,"LuaTestScript", scriptEnv);//表明是通过scriptEnv使用lua代码Action luaAwake = scriptEnv.Get<Action>("awake");//得到lua代码里的awake函数
scriptEnv.Get("start",out luaStart);//作用和上面一样都是为了得到对应函数
scriptEnv.Get("update",out luaUpdate);
scriptEnv.Get("ondestroy",out luaOnDestroy);if(luaAwake !=null){luaAwake();}}// Use this for initializationvoidStart(){if(luaStart !=null){luaStart();}}// Update is called once per framevoidUpdate(){if(luaUpdate !=null){luaUpdate();}if(Time.time - LuaBehaviour.lastGCTime > GCInterval){
luaEnv.Tick();
LuaBehaviour.lastGCTime = Time.time;}}voidOnDestroy(){if(luaOnDestroy !=null){luaOnDestroy();}
luaOnDestroy =null;
luaUpdate =null;
luaStart =null;
scriptEnv.Dispose();
injections =null;}}}? LuaTestScript.lua.txt 代码
local speed =10local lightCpnt =nilfunctionstart()print("lua start...")print("injected object", lightObject)
lightCpnt= lightObject:GetComponent(typeof(CS.UnityEngine.Light))--得到灯光对象endfunctionupdate()local r = CS.UnityEngine.Vector3.up * CS.UnityEngine.Time.deltaTime * speed
self.transform:Rotate(r)--对脚本挂载的物体进行旋转
lightCpnt.color = CS.UnityEngine.Color(CS.UnityEngine.Mathf.Sin(CS.UnityEngine.Time.time)/2+0.5,0,0,1)endfunctionondestroy()print("lua destroy")end
<div id="marketingBox" class="marketing-box"><div class="marketing-content">
暑期编程PK赛
得CSDN机械键盘等精美礼品!
页:
[1]