月1よてーと書いたが

・スマン ありゃウソだった……。

・拍手レス
 (多分)特になし。
 メールに転送されてくるから一応見てるよ。

・映画
 ローグ・ワンは結局見てない。
 新スパイダーマンは見た、最高だった。
 あと今年度はスター・ウォーズとブラックパンサーは見る予定。

・ゲーム
 今年もずっとPoEばっかやってる。
 とはいえ3.0が解禁された8月上旬から早二ヶ月強、
 最近は流石に飽きてT16回してShaperの挑戦権集めてるだけ。
 多分どっかのタイミングで配信でまとめて消化すると思われる。
 ↓以下今年に入ってから投稿したぽえ動画、下2つは後日ゆっくり解説付けて再投稿する(多分)
 
 
 

・エロゲ
 結局雷神7がずっとメイン。
 あとはワガハイとかワガハイOCとか、恋姫革命とか。
 恋姫革命はあんまりにもリメイク過ぎてガッカリした、呉は買うけど。

・とにかく
 日記書かなくなったのもあり文章を長々と書くのに全然慣れてない。
 かべつべとかついったがあるからなー、日記なんてもうオワコンかなー。
 ぽえのビルド紹介もニコニコやらようつべに動画上げればそれで概ね済むからなー。
 まとめて書くような話題が特になければ書く意味ないし、そもそも書いても誰も読まな(ry
 まあ継続は力なり、裏返すと日記を書くことを継続しなかった僕自身の自業自得なんだけどねー。

というわけで(?)約10ヵ月ぶりに更新、

基本思ったままはついったで呟いてるから更新ないのは仕方ないね。

久々に更新しようと思った理由は単純、ゲーム制作を再開したため。
数年来の着手だけど、ひとつ変えたのは旧来の一から作成を止めたこと。
もういい歳だからね、DirectX直接弄って全部作ってたらそもそも完成しないよ。

というわけでUnityを勉強中、その勉強結果を貼ってみる→[LuaTestSrc][LuaTestBin]
Unity⇔C#⇔Luaでやり取りするサンプルだよ、これにて分かったことは……
・UnityではLuaが使用可能(XLuaを使う)
・XLuaからUnityのコンポーネントを作成・変更可能
・luaファイルをAssets外に置いても問題ない、
・そこからUnityのコンポーネントを作成・変更可能
・つまりUnityを使ってもMOD導入可能なゲームは作れる
代表的なコードは以下に↓

using System.Collections.Generic;
using UnityEngine;
using XLua;
using System;   //←Action使用には必要

public class Character_2
{
    public int m_id;
    public string m_name;
}

[CSharpCallLua]
public interface ICharacter_4
{
    int Id { get; set; }
    string Name { get; set; }
    int Add(int a, int b);
}

/*public class Result7
{
    public int m_coin;
    public int m_exp;
}
[CSharpCallLua]
public delegate string Func7(int id, string name, out Result7 c);

[CSharpCallLua]
public delegate Action Attack8();*/

public class Character_13
{
    public int m_id;
    public string m_name;

    public void Log()
    {
        Debug.Log(m_id + ": " + m_name);
    }
}

public class Manager_14
{
    public static int m_score;

    public static void Log()
    {
        Debug.Log(m_score);
    }
}

public class Character_15
{
    public void Log(int id)
    {
        Debug.Log("intの方");
        Debug.Log(id);
    }

    public void Log(string name)
    {
        Debug.Log("stringの方");
        Debug.Log(name);
    }
}

public class Character_16
{
    public void Log(int id = 1, string name = "フシギダネ")
    {
        Debug.Log(id + ": " + name);
    }
}

public class Character_17
{
    public void Log(params string[] names)
    {
        foreach (var n in names)
        {
            Debug.Log(n);
        }
    }
}

/*public class Character_18
{
}
[LuaCallCSharp]
public static class CharacterExt_18
{
    public static void Log(this Character_18 self)
    {
        Debug.Log("拡張メソッド");
    }
}*/

public class Character_19
{
    public void Attack(ref int hp, out int exp)
    {
        hp = 25;
        exp = 100;
    }
}

public enum ParamType_20
{
    FIRE,
    WATER,
    GRASS,
}

/*public class Character_21
{
    public Action<string> OnLog = str => Debug.Log("C#: " + str);
}*/

public class Character_22
{
    public event Action<string> OnLog;

    public void Log(string str)
    {
        if (OnLog == null) return;
        OnLog(str);
    }
}

public interface ICharacter_24
{
    void Log();
}
public class Character_24 : ICharacter_24
{
    public void Log()
    {
        Debug.Log("ピカチュウ");
    }
}

//ボタン名変更
public class LuaFunc_25
{
    public static UnityEngine.UI.Text GetButtonText(string Name)
    {
        return (GameObject.Find(Name).GetComponent<UnityEngine.UI.Text>());
    }
}

//ボタン名変更
public class LuaFunc_26
{
    public static void CreateButton(string Name)
    {
        UnityEngine.GameObject result = GameObject.Instantiate<GameObject>(Resources.Load<GameObject>("Prefabs/Button26"));
        result.transform.SetParent(GameObject.Find("Canvas").transform, false);
        result.name = Name;
    }

    public static UnityEngine.UI.Text GetButtonText(string Name)
    {
        return (GameObject.Find(Name).GetComponent<UnityEngine.UI.Text>());
    }

}










public class NewBehaviourScript : MonoBehaviour {

	// Use this for initialization
	void Start () {

        //Lua起動
        LuaEnv le = new LuaEnv();



        //C#:開始時にボタンテキストを変更
        GameObject.Find("Text").GetComponent<UnityEngine.UI.Text>().text = "ああああ";

        //C#→Lua→Unity
        string LogMessage = "hello world";
        le.DoString("CS.UnityEngine.Debug.Log('" + LogMessage + "')");
        le.DoString("CS.UnityEngine.Debug.Log('ピカチュウ')");
        le.DoString("CS.UnityEngine.Debug.Log('カレントディレクトリ:" + System.Environment.CurrentDirectory.Replace("\\", "|") + "')");

        //Lua1:Lua変数の参照
        Debug.Log("【1:Lua変数の参照】");
        le.DoString("require 'Lua/LuaTest01'");
        int LuaVar_id = le.Global.Get<int>("id");
        string LuaVar_name = le.Global.Get<string>("name");
        bool LuaVar_isMale = le.Global.Get<bool>("isMale");
        Debug.Log("id(Lua変数):" + LuaVar_id.ToString());
        Debug.Log("name(Lua変数):" + LuaVar_name);
        Debug.Log("isMale(Lua変数):" + LuaVar_isMale.ToString());

        //Lua2:Luaクラスの参照
        Debug.Log("【2:Luaクラスの参照】");
        le.DoString("require 'Lua/LuaTest02'");
        Character_2 ch2 = le.Global.Get<Character_2>("Character_l2");
        Debug.Log("id(LuaのCharacter_l2クラスのメンバ):" + ch2.m_id.ToString());
        Debug.Log("name(LuaのCharacter_l2クラスのメンバ):" + ch2.m_name);

        //Lua3:リストの参照
        Debug.Log("【3:Luaリストの参照】");
        le.DoString("require 'Lua/LuaTest03'");
        var ch3 = le.Global.Get<List<int>>("Character_l3");
        Debug.Log("Character_l3[0]:" + ch3[0].ToString());
        Debug.Log("Character_l3[1]:" + ch3[1].ToString());
        Debug.Log("Character_l3[2]:" + ch3[2].ToString());
        Debug.Log("Character_l3.count:" + ch3.Count.ToString());

        //Lua4:インターフェースの参照
        Debug.Log("【4:Luaインターフェースの参照】");
        le.DoString("require 'Lua/LuaTest04'");
        var ch4 = le.Global.Get<ICharacter_4>("Character_l4");
        Debug.Log("Character_l4.id:" + ch4.Id);
        Debug.Log("Character_l4.name:" + ch4.Name);
        Debug.Log("Character_l4.Add:" + ch4.Add(5, 10).ToString());

        //Lua5:LuaTableによる参照
        Debug.Log("【5:LuaTableによる参照】");
        le.DoString("require 'Lua/LuaTest05'");
        var ch5 = le.Global.Get<LuaTable>("Character_l5");
        Debug.Log("id(LuaのCharacter_l5クラスのメンバ):" + ch5.Get<int>("m_id").ToString());
        Debug.Log("name(LuaのCharacter_l5クラスのメンバ):" + ch5.Get<string>("m_name"));

        //Lua6:関数の参照
        /*Debug.Log("【6:関数の参照】");
        le.DoString("require 'Lua/LuaTest06'");
        var ch6 = le.Global.Get<Action>("newFunc6");
        ch6();
        ch6 = null;*/
        //ActionにCSharpCallLuaの追加を要求されるため保留、
        //多分この使い方はしないかな(関数はインターフェースの参照でやりとりする気がする)

        //Lua7:複雑な関数の参照
        /*Debug.Log("【7:複雑な関数の参照】");
        le.DoString("require 'Lua/LuaTest07'");
        var ch7 = le.Global.Get<Func7>("newFunc7");
        Result7 result;
        var message7 = ch7(25, "ピカチュウ", out result);
        ch7 = null;
        Debug.Log(message7);
        Debug.Log("m_coin(関数の戻り値):" + result.m_coin);
        Debug.Log("m_exp(関数の戻り値):" + result.m_exp);*/
        //callbackでLuaEnv.dispose()するよう要求されるため保留、
        //多分この使い方はしないかな(関数はインターフェースの参照でやりとりする気がする)

        //Lua8:デリゲートの参照
        /*Debug.Log("【8:デリゲートの参照】");
        le.DoString("require 'Lua/LuaTest08'");
        var ch8 = le.Global.Get<Attack8>("Attack8");
        var ch8_2 = ch8();
        ch8_2();
        ch8 = null;
        ch8_2 = null;*/
        //デリゲートの受け渡しが上手くいかないため保留、
        //多分この使い方はしないかな(関数はインターフェースの参照でやりとりする気がする)

        //Lua9:LuaFunctionによる参照
        Debug.Log("【9:LuaFunctionによる参照】");
        le.DoString("require 'Lua/LuaTest09'");
        var ch9 = le.Global.Get<LuaFunction>("ShowMessage9");
        ch9.Call();

        //Lua10~26:LuaからC#/Unityを実行
        Debug.Log("【10~26:LuaからC#/Unityを実行】");
        le.DoString("require 'Lua/LuaTest10'");

        //Lua27:Assets外のLuaを実行
        Debug.Log("【27:Assets外のLuaを実行】");
        System.IO.StreamReader sr = new System.IO.StreamReader(System.Environment.CurrentDirectory + "\\LuaTest27.lua.txt", System.Text.Encoding.GetEncoding("UTF-8"));
        le.DoString(sr.ReadToEnd());
        sr.Close();



        //Lua終了
        le.Dispose();
		
	}
	
	// Update is called once per frame
	void Update () {
		
	}
}
-- 10:ゲームオブジェクトの作成
print( '【10:ゲームオブジェクトの作成】' )
local obj1_10 = CS.UnityEngine.GameObject()
local obj2_10 = CS.UnityEngine.GameObject( 'ピカチュウ' )
print( obj1_10, obj2_10 )

-- 11:名前空間の省略
print( '【11:名前空間の省略】' )
local GameObject_11 = CS.UnityEngine.GameObject
local obj1_11 = GameObject_11()
local obj2_11 = GameObject_11( 'ピカチュウ' )
print( obj1_11, obj2_11 )

-- 12:Unityのstaticクラスへアクセス
print( '【12:Unityのstaticクラスへアクセス】' )
local GameObject12 = CS.UnityEngine.GameObject
local Time = CS.UnityEngine.Time
print( 'deltaTime:', Time.deltaTime )
Time.timeScale = 0.5
print( 'helloworld', GameObject12.Find( 'ピカチュウ' ) )

-- 13:独自クラスのインスタンスの生成
print( '【13:独自クラスのインスタンスの生成】' )
local Character13 = CS.Character_13
local Character13_2 = Character13()
Character13_2.m_id = 25
Character13_2.m_name = 'ピカチュウ'
print( Character13_2.m_id )
print( Character13_2.m_name )
Character13_2:Log()

-- 14:staticな変数や関数の呼び出し
print( '【14:staticな変数や関数の呼び出し】' )
local Manager_14 = CS.Manager_14
Manager_14.m_score = 100
Manager_14.Log();
print( Manager_14.m_score )

-- 15:オーバーロードされた関数の呼び出し
print( '【15:オーバーロードされた関数の呼び出し】' )
local Character_15 = CS.Character_15
local Character_15_2 = Character_15()
Character_15_2:Log( 25 )
Character_15_2:Log( 'ピカチュウ' )

-- 16:デフォルト引数が設定された関数の呼び出し
print( '【16:デフォルト引数が設定された関数の呼び出し】' )
local Character_16 = CS.Character_16
local Character_16_2 = Character_16()
Character_16_2:Log()
Character_16_2:Log( 25 )
Character_16_2:Log( 25, 'ピカチュウ' )

-- 17:可変長引数が設定された関数の呼び出し
print( '【17:可変長引数が設定された関数の呼び出し】' )
local Character_17 = CS.Character_17
local Character_17_2 = Character_17()
Character_17_2:Log()
Character_17_2:Log( 'フシギダネ' )
Character_17_2:Log( 'フシギソウ', 'フシギバナ' )

-- 18:拡張メソッドの呼び出し
--[[
print( '【18:拡張メソッドの呼び出し】' )
local Character_18 = CS.Character_18
local Character_18_2 = Character_18()
Character_18_2:Log()
]]--
-- コード生成するとnilが返るようになるので保留、
-- 多分この使い方はしないかな

-- 19:refやoutキーワードの使用
print( '【19:refやoutキーワードの使用】' )
local Character_19 = CS.Character_19
local Character_19_2 = Character_19()
local hp, exp = Character_19_2:Attack()
print( hp, exp )

-- 20:列挙型の使用
print( '【20:列挙型の使用】' )
local ParamType_20 = CS.ParamType_20
local ParamType_20_2 = ParamType_20.FIRE
print( ParamType_20_2 )
print( ParamType_20.__CastFrom( 1 ) )
print( ParamType_20.__CastFrom( 'GRASS' ) )

-- 21:デリゲートの使用
--[[
print( '【21:デリゲートの使用】' )
local Character_21 = CS.Character_21
local Character_21_2 = Character_21()
Character_21_2.OnLog( 'フシギダネ' )
local function lua_delegate( str )
    print( 'Lua: ', str )
end
Character_21_2.OnLog = Character_21_2.OnLog + lua_delegate
Character_21_2.OnLog( 'フシギソウ' )
Character_21_2.OnLog = Character_21_2.OnLog - lua_delegate
Character_21_2.OnLog( 'フシギバナ' ) 
]]--
-- ActionにCSharpCallLuaの追加を要求されるため保留、
-- 多分この使い方はしないかな(関数はインターフェースの参照でやりとりする気がする)

-- 22:イベントの使用
--[[
print( '【22:イベントの使用】' )
local Character_22 = CS.Character_22
local Character_22_2 = Character_22()
local function lua_callback( str )
    print( str )
end
-- コールバックの登録
Character_22_2:OnLog( '+', lua_callback )
Character_22_2:Log( 'フシギダネ' )
-- コールバックの解除
Character_22_2:OnLog( '-', lua_callback )
Character_22_2:Log( 'フシギソウ' )
]]--
-- ActionにCSharpCallLuaの追加を要求されるため保留、
-- 多分この使い方はしないかな(関数はインターフェースの参照でやりとりする気がする)

-- 23:typeofの使用
print( '【23:typeofの使用】' )
local GameObject23 = CS.UnityEngine.GameObject
local ParticleSystem23 = CS.UnityEngine.ParticleSystem
local GameObject23_2 = GameObject23()
GameObject23_2:AddComponent( typeof( ParticleSystem23 ) )

-- 24:キャストする
print( '【24:キャストする】' )
local Character_24 = CS.Character_24
local Character_24_2 = Character_24()
local ICharacter_24 = CS.ICharacter_24
Character_24_2:Log()
cast( Character_24_2, typeof( ICharacter_24 ) )
Character_24_2:Log()

-- 25:ボタン名変更
print( '【25:ボタン名変更】' )
local LuaFunc25 = CS.LuaFunc_25
local ButtonText25 = LuaFunc25.GetButtonText('Text')
ButtonText25.text = 'いいいい'

-- 26:ボタン作成
print( '【26:ボタン作成】' )
local LuaFunc26 = CS.LuaFunc_26
LuaFunc26.CreateButton('NewButton')
local ButtonText26 = LuaFunc26.GetButtonText('Text26')
ButtonText26.text = 'にゅーぼたん'

以上。そんな感じ。書くのは基本ゲーム制作技術かぽえのビルド自慢かなー。