toLua中Lua呼叫C#中的類

畅知發表於2024-05-14

toLua中Lua呼叫C#:

[7]Lua指令碼呼叫C#中的class

準備工作:
1.呼叫lua指令碼
2.繫結LuaState虛擬機器,這樣在lua指令碼中才可以對C#指令碼進行訪問。
3.在lua中使用Debug列印資訊,需要在自定義CustomSetting指令碼中新增Debug,並生成wrap檔案。

image-20240514070352258

image-20240514070442189

---
--- Generated by EmmyLua(https://github.com/EmmyLua)
--- Created by TonyChang.
--- DateTime: 2024/5/14 6:55
---
print("----------------------toLua中呼叫c#指令碼-------------------------")


--呼叫Unity中的類
local object1 = UnityEngine.GameObject("object1")
local object2 = UnityEngine.GameObject("TonyChang")

GameObject  = UnityEngine.GameObject
local object3 = GameObject("object3")


--類中的靜態物件可以使用 . 來呼叫

local TonyChang = GameObject.Find("TonyChang")
print(TonyChang.transform.position.x)

image-20240514072109660

呼叫的C#自定義指令碼

Lua中呼叫自定義指令碼

與使用Debug列印資訊方式一樣,如果lua中要呼叫C#中的內容則需要在CustomSetting中新增類,要透過名稱空間.類名形式新增。之後仍需生成對應的wrap指令碼。如果有報錯,註釋掉相關內容即可!

下面在lua指令碼中的呼叫吧~

--使用Unity的Debug來列印
Debug = UnityEngine.Debug
Debug.Log("----------Hello-----------")

Vector3 = UnityEngine.Vector3
--使用 :呼叫成員方法
TonyChang.transform:Translate(Vector3.right)
Debug.Log(TonyChang.transform.position.x)

--呼叫繼承了MonoBehaviour的類
TonyChang:AddComponent(typeof(TestScripts.Test))

--呼叫沒有繼承MonoBehaviour的類
local JackStu = TestScripts.Student("Jack")
JackStu:Speak()

Lua中要呼叫的自定義類

using UnityEngine;

namespace TestScripts
{
    public class Student
    {
        private string _name;

        public Student(string name)
        {
            _name = name;
        }

        public void Speak()
        {
            Debug.Log("my name is " + _name);
        }
    }
    public class Test : MonoBehaviour
    {
        private void Awake()
        {
           Debug.Log("Test.cs is running");
        }
    }
}

img
執行結果:
image-20240514082302000

此處注意:在生成的Debug warp檔案時候會報錯產生,是因為wrap檔案中使用指標,將相關的程式碼註釋掉即可!

總結:在lua指令碼中呼叫:類中的靜態物件可以使用 . 來獲取,方法則使用 : 來呼叫,呼叫定義指令碼需要在配置資訊中新增,並重新生成wrap檔案。

相關文章