redhat9i 发表于 2022-7-16 09:57

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]
查看完整版本: xlua官方项目分析