300x250

1. XLua란?

 

XLua는 C#과 Lua 스크립트를 결합하여 Unity 프로젝트에서 스크립트를 작성할 수 있도록 지원하는 라이브러리예요. XLua는 Lua 스크립트 엔진과 C# 언어 간의 인터페이스를 제공하여, Lua 스크립트와 C# 클래스 간의 데이터 전송 및 상호 작용을 쉽게 할 수 있도록 도와줘요. 이를 통해 C# 언어의 장점과 Lua 스크립트 언어의 장점을 모두 활용하여 Unity 게임 개발을 더욱 효율적으로 할 수 있어요.

 

 

2.Unity에서 XLua를 사용하기 위한 설치 및 설정하기

 

2.1 xLua 프로젝트 다운로드하기

Tencent/xLua: xLua is a lua programming solution for C# ( Unity, .Net, Mono) , it supports android, ios, windows, linux, osx, etc. (github.com)

 

GitHub - Tencent/xLua: xLua is a lua programming solution for C# ( Unity, .Net, Mono) , it supports android, ios, windows, linu

xLua is a lua programming solution for C# ( Unity, .Net, Mono) , it supports android, ios, windows, linux, osx, etc. - GitHub - Tencent/xLua: xLua is a lua programming solution for C# ( Unity, .N...

github.com

 

xLua 페이지에서 프로젝트를 다운받아요.

 

 

2.2 다운로드한 프로젝트 Unity로 열기

 

압축파일을 풀고 해당프로젝트를 Unity로 열면

이렇게 에디터 버전이 누락됐다고 나오는데 전 그냥 설치되어 있는 2021.3.5f1 버전으로 열었어요.

 

'Continue' 클릭

 

이렇게 잘 열렸다면 성공이에요.

 

2.3 프로젝트 유니티패키지로 뽑아내기

 

에셋 폴더에서 우클릭을 해서 'Export Package...' 을 클릭해서 유니티 패키지를 생성해요.

준비는 끝났어요. 이제 저희 프로젝트에 이 패키지를 임포트 하면 돼요.

 

 

2.4 새 프로젝트 생성

저는 3D 프로젝트를 만들어서 테스트했어요.

 

 

2.5 xLua 패키지 임포트 하기

생성된 프로젝트에 아까 뽑아낸 유니티 패키지를 임포트 해줘요.

 

상단에 XLua가 표시되면 정상적으로 설치가 된 거예요.

 

 

 

3. Lua 스크립트 작성하기

 

이제 Lua 스크립트를 작성해야 하는데 마우스 우클릭 했을 때 C# 스크립트처럼 Create 메뉴에 Lua스크립트가 없어서 이거 먼저 메뉴버튼을 만들어 줬어요.

 

 

XLuaMenuEditor.cs

using UnityEditor;
using System.IO;

public class XLuaMenuEditor : Editor
{
    [MenuItem("Assets/Create/Lua Script")]
    private static void CreateLuaScript()
    {
        string path = AssetDatabase.GetAssetPath(Selection.activeObject);
        if (path == "")
        {
            path = "Assets";
        }
        else if (Path.GetExtension(path) != "")
        {
            path = path.Replace(Path.GetFileName(AssetDatabase.GetAssetPath(Selection.activeObject)), "");
        }

        // 새 텍스트 파일을 생성
        string fileName = "NewLuaScript.lua.txt";
        int fileIndex = 0;
        while (File.Exists(Path.Combine(path, fileName)))
        {
            fileIndex++;
            fileName = "NewLuaScript" + fileIndex + ".lua.txt";
        }

        // 파일 생성 후 이름 변경
        string newFilePath = Path.Combine(path, fileName);
        File.Create(newFilePath).Dispose();
        AssetDatabase.Refresh();
    }
}

이제 'Lua Script'를 클릭하면 루아 스크립트 파일이 생성돼요. 

간단하게 유니티 Debug.Log()를 찍는 코드를 작성해볼게요.

 

 

HelloWorld.cs와, HelloWorld.lua.txt 파일을 만들어요.

 

Helloworld.cs

using UnityEngine;
using XLua;
using System;

[LuaCallCSharp]
public class HelloWorld : MonoBehaviour
{
    public TextAsset luaScript;
    internal static LuaEnv luaEnv = new LuaEnv(); //all lua behaviour shared one luaenv only!

    private Action luaStart;
    private Action luaUpdate;
    private Action luaOnDestroy;
    float delta = 0;
    private LuaTable scriptEnv;

    void Start()
    {
        Init();
    }

    
    void Update()
    {
        if (luaUpdate == null && Input.GetKeyDown(KeyCode.G))
        {
            Init();
        }
        if (luaUpdate != null)
        {
            delta += Time.deltaTime;
            luaUpdate();
        }

        if (luaUpdate != null && delta >= 3)
        {
            DestroyLua();
        }
    }

    void Init()
    {
        delta = 0;
        scriptEnv = luaEnv.NewTable();

        LuaTable meta = luaEnv.NewTable();
        meta.Set("__index", luaEnv.Global);
        scriptEnv.SetMetaTable(meta);
        meta.Dispose();

        scriptEnv.Set("self", this);

        luaEnv.DoString(luaScript.text, "HelloWorld", scriptEnv);

        scriptEnv.Get("start", out luaStart);
        scriptEnv.Get("update", out luaUpdate);
        scriptEnv.Get("ondestroy", out luaOnDestroy);


        if (luaStart != null)
        {
            luaStart();
        }
    }

    void DestroyLua()
    {
        if (luaOnDestroy != null)
        {
            luaOnDestroy();
        }
        luaOnDestroy = null;
        luaUpdate = null;
        luaStart = null;
        scriptEnv.Dispose();
    }
}

 

저도 공부하는 중이라 간단하게 공부한 바로는

 

 

[LuaCallCSharp] : 이 클래스가 Lua 스크립트에서 호출될 수 있는 C# 메서드를 가지고 있음을 XLua에 알려줘요.


TextAsset luaScript: 이 변수는 실행할 Lua 스크립트를 저장하는 텍스트 파일을 참조해요.


static LuaEnv luaEnv: 이 변수는 모든 Lua 동작이 하나의 LuaEnv를 공유할 수 있도록 하는 XLua의 LuaEnv 클래스의 인스턴스를 저장해요. internal로 선언되어 있기 때문에, 같은 어셈블리 내에서만 사용 가능해요.


Action luaStart, luaUpdate, luaOnDestroy: 이 변수들은 각각 Lua 스크립트에서 가져온 start(), update(), ondestroy() 함수를 저장해요. 이 변수들은 Lua 스크립트에서 해당 함수가 정의되어 있지 않은 경우에도 null 값을 가질 수 있으며, 이러한 경우에는 해당 함수를 호출하지 않아요.


LuaTable scriptEnv: 스크립트가 실행될 때 생성된 Lua 환경을 저장하기 위한 LuaTable 변수를 선언해요

 

 

HelloWorld.lua.txt

function start()
	print("lua start...")
end

function update()
	print("lua update...")
end

function ondestroy()
    print("lua destroy")
end

 

 

4. 테스트해보기

 

이제 씬에 게임오브젝트를 하나 만들고 HelloWorld.cs를 넣어준 다음 인스팩터 창에서 Lua Script부분에 작성한 Lua Scirpt를 어싸인해줘요.

 

 

그리고 프로젝트를 실행하면

아래처럼 Lua스크립트에서 print 메서드를 잘 호출하고 있음을 확인할 수 있어요.

또한 루아가 가진 타입스크립트에 특징인데 중간에 루아 스크립트를 수정하고 저장하면 프로젝트를 껐다키지 않아도 바로 반영이 돼요.

이걸 확인하려고 'G'키를 누를 때마다 루아스크립트가 실행 중이지 않다면 실행되게 코드를 작성했어요.

 

이 기능이 루아가 가진 큰 장점 중 하나라서 지금은 간단한 디버그만 찍어봤지만 다양한 작업을 할 수 있을 거라 공부해 볼 가치가 있다고 생각해요.

 

 

출처 및 참고문헌

Tencent/xLua: xLua is a lua programming solution for C# ( Unity, .Net, Mono) , it supports android, ios, windows, linux, osx, etc. (github.com)

300x250