要素が多すぎるリーサルパズル

## 作ったもの
どうも、ゲーム制作系Vtuberの<strong>園児ニア</strong>です

突然ですがカードゲームをやったことがありますか？
ニアはあまりやったことがないので、新しいカードゲームをやろうとするとカードの効果やルールを覚えるのにとても苦労します。

そんな体験を大げさにできるように作ったのが


<strong>要素が多すぎるリーサルパズル

です！


https://unityroom.com/games/yousoooi-puzzle


要素をいたずらに多くしたので良く読んでリーサルパズルを解いてみてください。

敵はHP1の雑魚敵です！











以下ネタバレ含みますので未プレイの方はご留意ください。


## 声優協力

![warai.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692320/1cb020f6-93d3-d81a-2540-5f8e23527c17.png)


<strong>CV:葉桜サクラ 様</strong> (Twitter: [@hazakura_hari39](https://x.com/hazakura_hari39) )


オタク君、チャンネルで待ってるよ♡
https://www.youtube.com/@hazakurasakura




まさかこのゲームの声優さんをやっていただけるとは思いませんでした！
ありがとうございます！！！
みんな葉桜サクラさんのチャンネル登録よろしくお願いします。


## 利用した技術
- Unity6
- Utage(ノベル系アセット)


## 宴便利
途中のストーリー部分ではUtageというノベル系アセットを使いました。

既存プロジェクトに後からいれられて、途中で呼び出すことができるのはとても柔軟で便利でした。


まずは呼び出すためのクッションとなる自作のスクリプトを作ります。

下記はutage公式で紹介されているサンプルコードです、ゲームが軽微なものだったので今回はそのままで利用できました。

```c#:SampleAdvEngineController.cs
using System;
using System.Collections;
using UnityEngine;
using Utage;
using UtageExtensions;

public class SampleAdvEngineController : MonoBehaviour
{
    // ADVエンジン
    public AdvEngine AdvEngine { get { return advEngine; } }
    [SerializeField]
    protected AdvEngine advEngine;

    //再生中かどうか
    public bool IsPlaying { get; private set; }

    float defaultSpeed = -1;

    //指定のラベルのシナリオを再生する
    public void JumpScenario(string label)
    {
        StartCoroutine(JumpScenarioAsync(label, null));
    }

    //指定のラベルのシナリオを再生する
    //終了した時にonCompleteが呼ばれる
    public void JumpScenario(string label, Action onComplete)
    {
        StartCoroutine(JumpScenarioAsync(label, onComplete));
    }

    IEnumerator JumpScenarioAsync(string label, Action onComplete)
    {
        IsPlaying = true;
        AdvEngine.JumpScenario(label);
        while (!AdvEngine.IsEndOrPauseScenario)
        {
            yield return null;
        }
        IsPlaying = false;
        if (onComplete != null) onComplete();
    }

    //指定のラベルのシナリオを再生する
    //ラベルがなかった場合を想定
    public void JumpScenario(string label, Action onComplete, Action onFailed)
    {
        JumpScenario(label, null, onComplete, onFailed);
    }

    //指定のラベルのシナリオを再生する
    //ラベルがなかった場合を想定
    public void JumpScenario(string label, Action onStart, Action onComplete, Action onFailed)
    {
        if (string.IsNullOrEmpty(label))
        {
            if (onFailed != null) onFailed();
            Debug.LogErrorFormat("シナリオラベルが空です");
            return;
        }
        if (label[0] == '*')
        {
            label = label.Substring(1);
        }
        if (AdvEngine.DataManager.FindScenarioData(label) == null)
        {
            if (onFailed != null) onFailed();
            Debug.LogErrorFormat("{0}はまだロードされていないか、存在しないシナリオです", label);
            return;
        }

        if (onStart != null) onStart();
        JumpScenario(
            label,
            onComplete);
    }

    //シナリオの呼び出し以外に、
    //AdvEngineを操作する処理をまとめておくと、便利
    //何が必要かはプロジェクトによるので、場合によって増やしていく


}
```

呼び出す際はこんな感じ



```c#:呼び出し.cs


    [SerializeField] private SampleAdvEngineController engine;

    public void StartGalGame()
    {

        // utage側を呼び出す
        engine.JumpScenario("start", FinishGalGame);
    }

```


簡単に解説すると
"start"はシナリオラベル（どのシナリオを再生するか）を示しています。

Utageでは下記のようにスプレッドシートでストーリーや音楽などを管理します。
上のコードによって、2行目の*startから再生されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692320/a95a3ea6-27b0-8dee-fdc4-e8ac59dcdb8f.png)


FinishGalGameはUtage側でシナリオが終了したときに実行したい関数を渡します。

今回は、
FinishGalGame内では
- 1ダメージを与えるカードを生成する
- フェードアウトしてもとのカードゲームUIを表示する処理
などを書いていますが各ゲームに合わせて実装可能です！


めっちゃ便利！



## まとめ

最後までお読みいただきありがとうございました。
クソアプリアドベントカレンダー10年目に参加できてとても光栄です！

来年もまた楽しいクソを提供できたらと思います。
みんなもいっぱいクソゲーで遊ぼうね！！！

クソゲーを愛そう