プロジェクト3完了!

・ゲーム
 
 Dark Pact Zerkerに並んでお気に入りのWildstriker動画のうp完了!
 動画の中でも語ってるけど次期はGlacial Hammerとか使ってみたいね。

・特撮
 ウルトラマンジード
 めっちゃ良かった! 神回!
 ……と言いたいところだが、マグニフィセント回には負けるかな?
 でもここから先にもめっちゃ期待してる、ベリアルパパと最後はどうなるんかな?
 仮面ライダービルド
 まさかあのキャラが裏切るとは……。
 予想外の展開にあんまり乗れてなかったのが乗ってきた感じ。
 とりあえず平成ジェネレーションズ FINALは初日に見てくると思う。

さて本題、今回は動的UIを頑張ってみたよ。

[DynamicUITestSrc][DynamicUITestBin]

今回やったのは以下のこと↓
・新イベント作成(OnPointerClickで左/右/ホイールクリックが判別可能に)
・右クリックメニューその1(ボタンの数に応じて大きさが変わる)
・右クリックメニューその2(ボタンの数に応じて大きさが変わるが上限あり(スクロールバーが付いてる))
・右クリックメニューその3(その2と同じだがUnityおよびC#で一切処理の記述をしていない

ソースコードはこんな感じ↓
Events.cs:一部のみ抜粋、メニューその3の記述はこれだけ(Lua関数の呼び出しのみ)

	// Use this for initialization
	void Start () {
		AbyssLibU_XLua.Instance.DoScript("Lua/LTI");
		AbyssLibU_XLua.Instance.DoScript(System.Environment.CurrentDirectory + "\\LuaTest.lua.txt");
		AbyssLibU_XLua.Instance.Call("MakeMenu3");
	}

LuaTest.lua.txt:メニューとメニュー内のボタン作成処理を記述、クリック時のコールバックもLua関数を割り当ててるよ!

-- ショートカット
Unity = CS.UnityEngine;
AbyssLibU = CS.AbyssLibU;
-- ボタンに設定する関数
Counter = 1;
ButtonFuncs = {"BF1", "BF2", "BF3", "BF4", "BF5"};

-- ボタン関数1
function BF1()
	print("1だよ");
end

-- ボタン関数2
function BF2()
	print("2だよ");
end

-- ボタン関数3
function BF3()
	print("3だよ");
end

-- ボタン関数4
function BF4()
	print("4だよ");
end

-- ボタン関数5
function BF5()
	print("5だよ");
end

-- ボタン関数6以降
function BEnd()
	print("おわり");
end

-- ボタンを作成
function MakeButton()
	local NewButton = AbyssLibU.ButtonManager.Instantiate("Prefabs/Button");
	NewButton.transform:SetParent(Unity.GameObject.Find("Menu3").transform:Find("Viewport/Content").gameObject.transform);
	local NewText = CS.AbyssLibU.ButtonManager.GetButtonText(NewButton);
	if Counter > 5 then 
		NewButton.name = "じぇねれいてっどぼたん!!!";
		NewText.text = "おわり";
		NewButton.onClick:AddListener(CS.AbyssLibU_XLua.Instance:MakeCallback("BEnd"));
	else 
		NewButton.name = ButtonFuncs[Counter];
		NewText.text = ButtonFuncs[Counter];
		NewButton.onClick:AddListener(CS.AbyssLibU_XLua.Instance:MakeCallback(ButtonFuncs[Counter]));
	end
	Counter = Counter + 1;
end

-- メニューを作成
function MakeMenu3()
	-- メニューを作成
	local Menu3 = Unity.Object.Instantiate(Unity.Resources.Load("Prefabs/Menu3"));
	Menu3.name = "Menu3";
	Menu3.transform:SetParent(Unity.GameObject.Find("Canvas").transform);
	-- ベースボタンを作成
	local NewButton = AbyssLibU.ButtonManager.Instantiate("Prefabs/Button");
	NewButton.transform:SetParent(Unity.GameObject.Find("Menu3").transform:Find("Viewport/Content").gameObject.transform);
	NewButton.onClick:AddListener(CS.AbyssLibU_XLua.Instance:MakeCallback("MakeButton"));
end

AbyssLibU_XLua.cs:上のコールバック割り当てを含むLua周りの面倒を見てるマネージャクラス

using XLua;
using UnityEngine;

/// 
/// XLuaの管理を行うシングルトンマネージャです。
/// スクリプトファイルの読み込み、Lua関数の実行等の操作を提供します。
/// 
public sealed class AbyssLibU_XLua
{
    //シングルトン
    private static AbyssLibU_XLua _instance = new AbyssLibU_XLua();
    public static AbyssLibU_XLua Instance
    {
        get
        {
            return _instance;
        }
    }
    private AbyssLibU_XLua() { }
    //LuaEnvインスタンス
    public LuaEnv LE = new LuaEnv();

    /// 
    /// スクリプトファイルを読み込み実行します。
    /// Resourcesフォルダ⇒外部データの順に読み込みを試みます。
    /// 
    /// スクリプトファイルのパスを指定します。
    public void DoScript(string path)
    {
        try
        {
            LE.DoString("require '" + path + "'");
        }
        catch (LuaException)
        {
            System.IO.StreamReader sr = new System.IO.StreamReader(path, System.Text.Encoding.GetEncoding("UTF-8"));
            LE.DoString(sr.ReadToEnd());
            sr.Close();
        }
    }

    /// 
    /// Lua関数を実行します。
    /// 
    /// 関数名を指定します。
    /// Lua関数による戻り値を返します。
    public object[] Call(string function)
    {
        return (LE.Global.Get(function).Call());
    }

    /// 
    /// Lua関数によるコールバック関数を作成します。
    /// 
    /// 関数名を指定します。
    /// Lua関数によるコールバック関数を返します。
    public UnityEngine.Events.UnityAction MakeCallback(string function)
    {
        return (() => LE.Global.Get(function).Call());
    }
}

大体こんな感じ、スクリプトからUnity弄る方法もある程度までは慣れてきたかな?
あとマネージャクラスで何をラップすればいいのかある程度理解できてきた感ある。
XLuaはLuaの言語仕様がガバガバなのを良いことにやりたい放題できる神ライブラリだけど、
Luaの言語仕様上テンプレートまではカバーできないから、
テンプレート周りの処理だけはマネージャクラスでラップしてあげる必要があるという雑感。
まあラッパー周りは実際色々使いつつ調整かけていくことになるだろうから、
今は深く考えずSubversionにでも突っ込んで適宜使いつつブラッシュアップかけていこう。

今後の予定は引き続きこんな感じで↓
プロジェクト4:ジョーカースクリプトを色々テスト
プロジェクト5:過去に制作したゲーム(ゆっくりスイーパー)をUnityでリメイク
プロジェクト6:ゲーム用AIの作成(あんまりUnity関係ない)
今回はこんなところでまた次回!