LoginSignup
4
0

More than 1 year has passed since last update.

Yarn Spinner を使えばゲームの会話機能を作れそうな

Posted at

インターネットをご覧の皆さん こんばんは。
Yarn Spinner を触ってみたところ、なかなか面白かったのでメモがてら記事を書いてみます。

試した時点の環境は

  • Yarn Spinner v2.2.1
  • Unity2021.3.10f1
  • VSCode 1.71.2
  • Yarn Spinner VSCode Extension v2.2.15

です。

Yarn Spinner とは?

Secret Lab ( https://secretlab.games/ ) が開発している、
ゲームの会話機能を実現するツールです。
ScreenShot.png
※上記スクショは公式ドキュメントの サンプル から引用させていただきました。

Yarn Spinner は以下のような特徴を持っています。

Yarn scripts

Yarn Spinner では会話内容を Yarn Script ( *.yarn ファイル )というテキスト形式のファイルで記述します。
Yarn Script は大きく分けて、Node、Line(台詞)、Option(選択肢)、Command で構成されており、制御構文や変数なども使用できます。

基本要素は Node 単位で、---=== で囲われたノード本文に

  • Line (台詞)
  • Option (選択肢。 ->で始まる行)
  • Command/制御構文/変数等(<< >>で囲われた箇所)

が含まれます。

ノード構成
title: タイトル
---
台詞
キャラ名:台詞

-> 選択肢1
-> 選択肢2
===
Yarn scripts サンプル
title: Start
tags: background:fountain
---
<<set $gold to false>>
<<set $silver to false>>

きこりが佇んでいる。泉に斧を落としてしまったようだ。
すると女神が現れて

女神:よっこいしょ

<<jump Select>>
===
title: Select
tracking: always
---
<<if visited_count("Select") < 1>>
女神:あなたが落としたのはどちらの斧ですか?
<<else>>
女神:よくよく考えなさい
<<endif>>

-> 金の斧
    女神:金の斧を落としたのですね?
    -> はい
        <<jump ChooseGold>>
    -> よく見たら違いました。
        <<set $gold to true>>
        <<jump Select>>
-> 銀の斧
    女神:銀の斧を落としたのですね?
    -> はい
        <<jump ChooseSilver>>
    -> 勘違いでした。
        <<set $silver to true>>
        <<jump Select>>
-> 鉄の斧 <<if $gold and $silver>>
    <<jump ChooseIron>>
===
title: ChooseGold
---
女神:ある意味正直ものですね。
===
title: ChooseSilver
---
女神:え?銀?
女神:珍しいですよ。銀を選ぶ人。
===
title: ChooseIron
---
女神:正直ものですね。
===

独自コマンドの登録&呼び出し

Yarn Script では独自に作成したコマンドを登録&使用することもできます。
static なコマンドのほか、コンポーネントのメソッドとして登録することや、コルーチン形式のコマンドも登録できます。

YarnCommand 属性で登録
public class FadeCamera {
    // <<fade_camera>> コマンドを登録
    [YarnCommand("fade_camera")]
    public static void FadeCamera(bool fade_in) {
        Debug.Log($"Fading the camera! {fade_in}");
    }
}
手動登録
public class CustomCommands : MonoBehaviour {    
    [SerializeField] private DialogueRunner dialogueRunner;

    public void Awake() {
        // <<camera_look>> コマンドを登録
        dialogueRunner.AddCommandHandler<GameObject>(
            "camera_look",     // the name of the command
            CameraLookAtTarget // the method to run
        );
    }

    private void CameraLookAtTarget(GameObject target) {
        if (target == null) {
            debug.Log("Can't find the target!");
        }
        Camera.main.transform.LookAt(target.transform);
    }    
}

Unity 上での会話再生

Unity では、主に Dialogue Runner と Dialogue View を使用して会話を表示します。

Dialogue Runner

DialogueRunner.png
Dialogue Runner は Yarn Script を解析&再生するコアコンポーネントです。
指定された Yarn Script ( Yarn Project ) を解析して、解析された会話データ( Line や Option 等 )を Dialogue View に送信することで会話を再生します。
Dialogue View は複数登録することができ、それぞれの役割に応じて会話の表示や選択肢の提示を行います。

Dialogue View

LineView.png
OptionListView.png
OptionView.png
Dialogue View は Dialogue Runner から受け取った会話データを表示するコンポーネントです。
標準で Line View や Options List View 等が提供されているので、UI 要素を設定するだけでも使用できます。
また、独自の Dialogue View を作成することもできるようです。

おわりに

機能はほかにもありますが、ドキュメント がある程度まとまっているほか、オープンソースなので調べやすいのもありがたいところです。
実際に Yarn Spinner を使ったゲームもリリースされているようで、会話表現に必要な基本機能を網羅しているほか、拡張性もあるところが魅力だなと感じました。

以上 おつきあいいただきありがとうございました。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0