找回密码
 立即注册
查看: 234|回复: 0

xlua官方项目分析

[复制链接]
发表于 2022-7-16 09:57 | 显示全部楼层 |阅读模式
xlua官方项目_U3DScripting分析

代码里都放了我的注释哪里不懂都可以评论问我
LuaBehaviour.cs 代码
  1. using UnityEngine;using System.Collections;using System.Collections.Generic;using XLua;using System;namespace XLuaTest
  2. {//通过Injection来操控场景中的物体[System.Serializable]publicclassInjection{publicstring name;publicGameObjectvalue;}[LuaCallCSharp]//从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(){
  3.             scriptEnv = luaEnv.NewTable();// 为每个脚本设置一个独立的环境,可一定程度上防止脚本间全局变量、函数冲突LuaTable meta = luaEnv.NewTable();
  4.             meta.Set("__index", luaEnv.Global);//赋值lua代码里的全局函数
  5.             scriptEnv.SetMetaTable(meta);
  6.             meta.Dispose();
  7.             scriptEnv.Set("self",this);//把c#的this对象赋值给lua的self,这样lua的self就能调用c#这个类的东西了foreach(var injection in injections)//把unity的对象传给lua文件{
  8.                 scriptEnv.Set(injection.name, injection.value);}
  9.             luaEnv.DoString(luaScript.text,"LuaTestScript", scriptEnv);//表明是通过scriptEnv使用lua代码Action luaAwake = scriptEnv.Get<Action>("awake");//得到lua代码里的awake函数
  10.             scriptEnv.Get("start",out luaStart);//作用和上面一样都是为了得到对应函数
  11.             scriptEnv.Get("update",out luaUpdate);
  12.             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){
  13.                 luaEnv.Tick();
  14.                 LuaBehaviour.lastGCTime = Time.time;}}voidOnDestroy(){if(luaOnDestroy !=null){luaOnDestroy();}
  15.             luaOnDestroy =null;
  16.             luaUpdate =null;
  17.             luaStart =null;
  18.             scriptEnv.Dispose();
  19.             injections =null;}}}
复制代码
? LuaTestScript.lua.txt 代码
  1. local speed =10local lightCpnt =nilfunctionstart()print("lua start...")print("injected object", lightObject)
  2.         lightCpnt= lightObject:GetComponent(typeof(CS.UnityEngine.Light))--得到灯光对象endfunctionupdate()local r = CS.UnityEngine.Vector3.up * CS.UnityEngine.Time.deltaTime * speed
  3.         self.transform:Rotate(r)--对脚本挂载的物体进行旋转
  4.         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机械键盘等精美礼品!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2025-5-1 07:04 , Processed in 0.335400 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表