[Unity]UnityでLuaを使う[MoonSharp]

0

    JUGEMテーマ:ゲーム

    RPGでは会話シーンなどにイベント用のスクリプトを書く。

     

    イベント用のスクリプト言語は自分で作る事もあるがゲーム業界では「Lua」を使うことが多い。

    Luaは組み込みが簡単で高速で動作するスクリプト言語だ。

    https://ja.wikipedia.org/wiki/Lua

     

    RogueLiveではイベントスクリプトに「MoonSharp」を使用している。

    http://www.moonsharp.org/

    MoonSharpはUnity上で動作するLuaだ。

     

    MoonSharpの使い方はとても簡単。

    まずLuaスクリプト内部で呼び出すクラスを作成する。

    [ MoonSharp.Interpreter.MoonSharpUserData ]を頭に付けるとLuaから呼び出せるようになる。

    それをRegisterAssembly()でLuaに登録する。

    // スクリプト内から呼び出す関数群
    [ MoonSharp.Interpreter.MoonSharpUserData ]
    class EventData
    {
      // 画面にセリフを表示
      public void serif( string mes )
      {
        Debug.Log( mes );
      }
     
      // 選択肢を表示
      public void select( string title, params string[] choices )
      {
        // 中身は省略
      }
    }
     
    // EventDataをスクリプト内で使えるようにする
    MoonSharp.Interpreter.UserData.RegisterAssembly( typeof( EventData ).Assembly );
    

     

    以下のコードが今回実行するLuaスクリプトだ。 ちょっとした会話シーンである。

    実際の運用時にはEvent001.bytesのようなテキストファイルにして保存しておく。

    string code =
    @"
      return function()
     
        event.serif( 'やあ。ウチは[word:15000]から来た[name:10103]やで' )
        coroutine.yield()
     
        event.serif( '自分はどっからきたん?' )
        coroutine.yield()
     
        event.select( '', 'ここが地元', '別の島', '[word:15000]', 'わからない' )
        local selected = coroutine.yield()
        if selected == 0 then
     
          event.serif( 'へえ。じゃあウチよりこの辺には詳しそうやね' )
          coroutine.yield()
     
        elseif selected == 1 then
     
          event.serif( 'この島へは何しにきたんやろなあ' )
          coroutine.yield()
     
        elseif selected == 2 then
     
          event.serif( '同郷やね。でもそんな風には見えへんなあ?' )
          coroutine.yield()
     
        elseif selected == 3 then
     
          event.serif( 'どういうこっちゃ' )
          coroutine.yield()
     
        end
     
      end
    ";
    

     

    次にスクリプトインスタンスを生成して、EventDataのインスタンスを渡す。

    これによりLuaコード内部からevent.serif()のようにしてC#側の関数を呼び出せるようになる。

    // スクリプトインスタンスを生成
    MoonSharp.Interpreter.Script script = new MoonSharp.Interpreter.Script();
     
    // EventDataクラスをスクリプト内部で使えるようにする
    script.Globals[ "event" ] = new EventData();
    

     

    次にコードをコンパイルする。コンパイルできたらコルーチンを作成する。

    コルーチンとは強調的マルチスレッドとも呼ばれ、任意のタイミングでスクリプトの実行を停止できる。

    ゲームではイベントの途中でスクリプトが停止する事がよくある。

    例えばセリフを表示してプレイヤーがボタンを押すまでは次のセリフに進まないなどだ。

    coroutine.yield()を呼び出す事でスクリプトの実行が停止する。

    // コードをコンパイル
    MoonSharp.Interpreter.DynValue function = script.DoString( code );
     
    // コルーチンを生成
    MoonSharp.Interpreter.DynValue coroutine = script.CreateCoroutine( function );
    

     

    あとはResume()関数でスクリプトが終了するまでグルグル回す。

    // コルーチン開始
    while( coroutine.Coroutine.State != MoonSharp.Interpreter.CoroutineState.Dead )
    {
      // スクリプトを再開
      coroutine.Coroutine.Resume();
    }
    

    スポンサーサイト

    0
      • 2018.11.02 Friday
      • -
      • 18:59
      • -
      • -
      • by スポンサードリンク

      コメント
      コメントする








         

      PR

      calendar

      S M T W T F S
          123
      45678910
      11121314151617
      18192021222324
      252627282930 
      << November 2018 >>

      情報

      広告

      広告

      広告

      広告

      [商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

      Nintendo Switch Joy-Con(L) ネオンブルー/(R) ネオンレッド
      価格:32378円(税込、送料無料) (2018/7/29時点)


      selected entries

      categories

      archives

      links

      profile

      search this site.

      others

      mobile

      qrcode

      powered

      無料ブログ作成サービス JUGEM