天天看點

Xlua熱更新

目錄

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)

Xlua熱更新
Xlua熱更新

2.通過xlua插件運作lua程式

Xlua熱更新
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();
    }
}
           
Xlua熱更新

3.加載運作Lua源檔案

Xlua熱更新
Xlua熱更新
using UnityEngine;

public class Helloworld02 : MonoBehaviour {

	void Start () {
        TextAsset ta = Resources.Load<TextAsset>("HelloWorld.lua");
        print(ta);
    }
}
           
Xlua熱更新
Xlua熱更新
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();
    }
}
           
Xlua熱更新
Xlua熱更新

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;
    }
}
           
Xlua熱更新
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);
    }
}
           
Xlua熱更新
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);
    }
}
           
Xlua熱更新

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 ));
    }
}
           
Xlua熱更新
Xlua熱更新

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();
	}
}
           
Xlua熱更新
Xlua熱更新
Xlua熱更新
Xlua熱更新

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;
    }
}
           
Xlua熱更新
Xlua熱更新

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
 --]]
           
Xlua熱更新
Xlua熱更新
Xlua熱更新

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
           
Xlua熱更新
  • 含參函數
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
           
Xlua熱更新
  • 含參函數,多傳回值的情況(用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
           
Xlua熱更新

10.在Lua中new C#對象(建立一個遊戲物體gameobject)

Xlua熱更新
using UnityEngine;
using XLua;
public class LuaCallCSharp : MonoBehaviour {

    void Start()
    {
        LuaEnv env = new LuaEnv();
        env.DoString("require 'LuaCallCSharp'");
        env.Dispose();
    }
}
           
Xlua熱更新
Xlua熱更新

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"
           
Xlua熱更新

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
           
Xlua熱更新