目錄
1.導入xlua插件(下載下傳位址:https://github.com/Tencent/xLua)
2.通過xlua插件運作lua程式
3.加載運作Lua源檔案
4.添加自定義的Loader方法
5.通過自定義Loader加載指定目錄的Lua腳本
6.C#通路Lua中的全局變量
7.C#通路Lua中的table(映射到Class,不推薦使用此方式)
8.C#通路Lua中的table(推薦使用此方式,即映射到interface)
9.C#通路Lua中的全局函數(推薦使用此方式,即映射到delegate)
10.在Lua中new C#對象(建立一個遊戲物體gameobject)
11.Lua通路C#靜态屬性和靜态方法
12.Lua通路C#成員屬性和成員方法
1.導入xlua插件(下載下傳位址:https://github.com/Tencent/xLua)
2.通過xlua插件運作lua程式
using UnityEngine;
using XLua;
public class helloworld01 : MonoBehaviour {
private LuaEnv luaenv;
void Start () {
luaenv = new LuaEnv();
luaenv.DoString("print('hello world')");
luaenv.DoString("CS.UnityEngine.Debug.Log('你好')");
}
private void OnDestroy()
{
luaenv.Dispose();
}
}
3.加載運作Lua源檔案
using UnityEngine;
public class Helloworld02 : MonoBehaviour {
void Start () {
TextAsset ta = Resources.Load<TextAsset>("HelloWorld.lua");
print(ta);
}
}
using UnityEngine;
using XLua;
public class Helloworld02 : MonoBehaviour {
void Start () {
TextAsset ta = Resources.Load<TextAsset>("HelloWorld.lua");
LuaEnv env = new LuaEnv();
env.DoString(ta.text);
env.Dispose();
}
}
4.添加自定義的Loader方法
using UnityEngine;
using XLua;
public class CreateLoader : MonoBehaviour {
void Start () {
LuaEnv env = new LuaEnv();
env.AddLoader(MyLoader);
env.DoString("require 'HelloWorld'");
env.Dispose();
}
private byte [] MyLoader(ref string filePath)
{
return null;
}
}
using UnityEngine;
using XLua;
public class CreateLoader : MonoBehaviour {
void Start () {
LuaEnv env = new LuaEnv();
env.AddLoader(MyLoader);
env.DoString("require 'HelloWorld'");
env.Dispose();
}
private byte [] MyLoader(ref string filePath)
{
string s = "print(123)";
return System.Text.Encoding.UTF8.GetBytes(s);
}
}
using UnityEngine;
using XLua;
public class CreateLoader : MonoBehaviour {
void Start () {
LuaEnv env = new LuaEnv();
env.DoString("require 'HelloWorld'");
env.AddLoader(MyLoader);
env.Dispose();
}
private byte [] MyLoader(ref string filePath)
{
string s = "print(123)";
return System.Text.Encoding.UTF8.GetBytes(s);
}
}
5.通過自定義Loader加載指定目錄的Lua腳本
using System.IO;
using UnityEngine;
using XLua;
public class CreateLoader : MonoBehaviour {
void Start () {
LuaEnv env = new LuaEnv();
env.AddLoader(MyLoader);
env.DoString("require 'test007'");
env.Dispose();
}
private byte [] MyLoader(ref string filePath)
{
print(filePath);//test007
print(Application.streamingAssetsPath);//E:/unityPractice/XluaPractice/Assets/StreamingAssets
string absPath = Application.streamingAssetsPath + "/" + filePath + ".lua.txt";
return System .Text .Encoding .UTF8 .GetBytes (File.ReadAllText (absPath ));
}
}
6.C#通路Lua中的全局變量
using UnityEngine;
using XLua;
public class CSharpCallLua : MonoBehaviour {
void Start () {
LuaEnv env = new LuaEnv();
env.DoString("require 'CSharpCallLua'");
int a = env.Global.Get<int>("a");
print(a);
string str = env.Global.Get<string >("str");
print(str );
bool isDie = env.Global.Get<bool >("isDie");
print(isDie );
env.Dispose();
}
}
7.C#通路Lua中的table(映射到Class,不推薦使用此方式)
using UnityEngine;
using XLua;
public class CSharpCallLua : MonoBehaviour {
void Start () {
LuaEnv env = new LuaEnv();
env.DoString("require 'CSharpCallLua'");
Person p = env.Global.Get<Person>("person");
print(p.name + ":" + p.age);
p.name = "nihao";
env.DoString("print(person.name)");//LUA:lijiang
env.Dispose();
}
class Person
{
public string name;
public int age;
}
}
8.C#通路Lua中的table(推薦使用此方式,即映射到interface)
using UnityEngine;
using XLua;
public class CSharpCallLua : MonoBehaviour {
void Start () {
LuaEnv env = new LuaEnv();
env.DoString("require 'CSharpCallLua'");
IPerson p = env.Global.Get<IPerson>("person");
print(p.name + ":" + p.age);
p.name = "nihao";
env.DoString("print(person.name)");//LUA:lijiang
p.Eat(12, 34);
env.Dispose();
}
[CSharpCallLua ]
interface IPerson
{
string name { get; set; }
int age { get; set; }
void Eat(int a, int b);
}
}
person={name="lijiang",age=20}
function person.Eat(self,a,b)
print(a+b)
print("I am eating")
end
--[[function person:Eat(a,b) 這種方式也是可以的,預設帶一個self參數,代表目前table
print(a+b)
print("I am eating")
end
--]]
9.C#通路Lua中的全局函數(推薦使用此方式,即映射到delegate)
- 不含參函數
using UnityEngine;
using XLua;
using System;
public class CSharpCallLua : MonoBehaviour {
void Start () {
LuaEnv env = new LuaEnv();
env.DoString("require 'CSharpCallLua'");
Action A= env.Global.Get<Action>("Add");
A ();
A = null;
env.Dispose();
}
}
function Add() --不含參函數
print("A")
end
- 含參函數
using UnityEngine;
using XLua;
public class CSharpCallLua : MonoBehaviour {
void Start () {
LuaEnv env = new LuaEnv();
env.DoString("require 'CSharpCallLua'");
Add A= env.Global.Get<Add >("Add");
A (1,2);
A = null;
env.Dispose();
}
[CSharpCallLua]
delegate void Add(int a, int b);
}
function Add(a,b) --含參函數
print(a+b)
end
- 含參函數,多傳回值的情況(用ref,out都可以)
using UnityEngine;
using XLua;
public class CSharpCallLua : MonoBehaviour {
void Start()
{
LuaEnv env = new LuaEnv();
env.DoString("require 'CSharpCallLua'");
Add A = env.Global.Get<Add>("Add");
int resa; int resb;
int a = A(1, 2, out resa, out resb);
print(a);
print(resa);
print(resb);
A = null;
env.Dispose();
}
[CSharpCallLua]
delegate int Add(int a, int b, out int resa, out int resb);
//void Start()
//{
// LuaEnv env = new LuaEnv();
// env.DoString("require 'CSharpCallLua'");
// Add A = env.Global.Get<Add>("Add");
// int resa=0; int resb=0;
// int a = A(1, 2, ref resa, ref resb);//用ref也可以,不過上面的resa要指派,這裡指派為0
// print(a);
// print(resa);
// print(resb);
// A = null;
// env.Dispose();
//}
//[CSharpCallLua]
//delegate int Add(int a, int b, ref int resa, ref int resb);
}
function Add(a,b) --含參函數
print(a+b)
return a+b,a,b
end
10.在Lua中new C#對象(建立一個遊戲物體gameobject)
using UnityEngine;
using XLua;
public class LuaCallCSharp : MonoBehaviour {
void Start()
{
LuaEnv env = new LuaEnv();
env.DoString("require 'LuaCallCSharp'");
env.Dispose();
}
}
11.Lua通路C#靜态屬性和靜态方法
using UnityEngine;
using XLua;
public class LuaCallCSharp : MonoBehaviour {
void Start()
{
LuaEnv env = new LuaEnv();
env.DoString("require 'LuaCallCSharp'");
env.Dispose();
}
}
print(CS.UnityEngine.Time .deltaTime ) --讀靜态屬性
CS.UnityEngine.Time.timeScale=0.5 --寫靜态屬性
local gameObject=CS.UnityEngine.GameObject --調用靜态方法
local camera=gameObject.Find("Main Camera")
camera.name="update by lua"
12.Lua通路C#成員屬性和成員方法
using UnityEngine;
using XLua;
public class LuaCallCSharp : MonoBehaviour {
void Start()
{
LuaEnv env = new LuaEnv();
env.DoString("require 'LuaCallCSharp'");
env.Dispose();
}
}
local gameObject=CS.UnityEngine.GameObject
local camera=gameObject.Find("Main Camera")
local cameraCom=camera:GetComponent("Camera")
--用local cameraCom=camera.GetComponent(camera,"Camera")也是可以的,注意和上面用冒号的差別
cameraCom.enabled = false