投稿記事

Unityの記事 (4)

もっきゃりぺお 2023/12/07 22:06

【ノベルゲーム制作】④Unity Naninovel カスタムUI、カスタム変数【まほだん】

Unityのことを完全に理解した

完全に過言ですが、ちょっとずつこなれてきている感じがします。またまた時間が開いてしまいましたが、進捗がないというよりは、機能を色々と追加していて、せっかく動画にするならちょっとまとまったところまでやろう、という感じで溜め込んでいました。AC6ももりもりやりましたが。

というわけで、何はともあれまず成果物です。

見ての通り、画面が動いたり、タイマーが表示されたり、カーソルが切り替わったりしてます。あと、Naninovelのバージョンがv1.18とそれ以前で大きく変わっていて、特に、TextからText Mesh Proに変わったこととかもあります。全部一つの記事にまとめると大変なので、いくつかに記事を分けます。

Naninovelというか、Unityをやっててわかったのは、まあオブジェクト指向なんですね。そりゃそうなんですけど、いや、今更って話なんですけど、なんか作りながらわかっていけばいいか~という気持ちで触れてたので、なんというかそういうことが腑に落ちたという感じです。インスペクターでぽちぽちしてるけど、基本的にはとりあえず、UnityEventを使って、呼び出す関数と、関数を呼び出す仕組みを作ればまあ色々できるというのを、GUIで便利にしてるんだな、というのがわかってきました。それを使って、タイマーを作ったり、アニメーションに合わせてSEを入れたり、カーソルを変えたりというのを作ってます。

それと、ラジオは一応毎月かかさずとってるので、有料のプランの方は聴いてみてね。

特別な演出

目的 ―― Naninovelにない演出や特別な処理をしたい

Naninovelにもいろんな効果や表現がデフォルトで実装されてますし、それだけでそれなりにリッチな表現ができると思うんですが、基本的にプレーンで、特定のスタイルを押し出したものではないし、冒頭の動画のようなタイマーみたいな処理は用意されていません。しかしNaninovelはUnityのアセットなので、プログラムすればそれこそUnityで出来ることは何でもできると言ってもいいでしょう。

魔法少女確殺弾では、タイトルの通り魔法少女確殺弾で、それを撃つ、撃たないというのが重要な選択になっていきます。その重要な選択を強調するのに、特別な演出を実装することになりました。
まほだん制作開始時ではそんな予定ではなかったんですが、専用のUIをこんな感じでやるといいんじゃないか、とみるきさんと話し合って、やることになりました。

カスタムUI ―― NaninovelとUnityの自由さの接合面

Naninovelでそういう色々な機能を追加したいときには、カスタムUIというものを使います。

WARNING
カスタムUIを作成したり、既存のUIを変更したりする前に、まずUnityのUIシステム 🡕(uGUI)をよく確認してください。以下で利用できるUIカスタマイズのチュートリアル動画とサンプルプロジェクトがありますが、Unityの組み込みツールについて追加のガイダンスまたはサポートは提供していませんので、ご注意してください。詳細は サポートページ をご覧ください。

って書いてありますが、Unityで好きにあれこれやるための機能なので、これを使えばかなりのことがNaninovelと結合できるよ、ということです。他のノベルゲームのエンジンについて何も詳しくないのであれなんですけど、UnityのPrefabやAnimatorの表現力や自由度ってかなりのものだと思っていて、わざわざUnity使ってノベルゲーム作る人って、そのあたりに魅力を感じているからではないでしょうか。たぶん。

カスタムUIの機能を使うと、動画の、黒い枠がにゅーっと出てきたり、タイマーを呼び出したりとか、カーソルが変わったりの演出が、


こんなかんじに、
@showUI MahodanUI (枠がでるほう) @showUI TimerUI (タイマーのほう)
とか
@hideUI TimerUI @hideUI MahodanUI
とかのコマンドで出し入れできるようになります。
Naninovel公式の説明動画だと、コマンドでカレンダーを呼び出してるのがわかりますね。私はだいたいこの動画を真似して実装していきました。

カスタムUIの作り方 ―― 無垢なカスタムUIの赤ちゃん

カスタムUIを作って使えるようにするだけなら、かなり簡単にできるようになっています。といっても、それだけだと何も機能のないものになりますが。


こんなかんじで、Projectの中を右クリックして、Create→Naninovel→CustomUIをすると、NewCustomUIというPrefabが作成されます。このカスタムUIの赤ちゃんに名前をつけて、Configulation→Naninovel→UIから登録すれば、それだけでオッケーです。

こんなかんじでMahodanUIとTimerUIが登録されてます。

カスタムUI ―― かわいいベイビーが動いたり、数を数えるようにする

Prefabを呼び出せるので、それだけで好きなオブジェクトを追加できて、枠なりなんなりはいくらでも作れます。枠や画像を出すだけじゃなくて、Prefabなのでアニメーションを入れたりもしてます。にゅーっと黒い枠で狭まる効果は、MahodanUIが呼び出されると共にアニメーションさせています。


これは実装したMahodanUIのCustomUIというコンポーネントです。項目は色々ありますが、重要なのはOn Show()とOn Hide()で、その通り、NaninovelからShowしたときとHideしたときにイベントを呼び出せるので、これによってアニメーションを操作してます。このあたりの処理は口パクのほうで結構書いたので、参考になれば。

Timerはこんな感じで、自作のscriptを追加しました。
ちょっと試行錯誤したままのコードなので恥ずかしいのですが、こんな感じです。

using UnityEngine;
using System.Collections;
using TMPro;
using Naninovel;
using UnityEngine.Events;

public class Timer : MonoBehaviour
{
    private float totalTime;
    private float seconds; // 秒数の変数
    private float timeSpeed = 1f; // timeSpeed の初期値を設定
    private bool timerStarted = false; // タイマーが開始されたかどうか

    [SerializeField]
    private TextMeshProUGUI TimerText;
     // 3秒以下の時に呼び出す
    [SerializeField]
    private UnityEvent onThreeSecondsLeftEvent;
     // 1秒以下の時に呼び出す
    [SerializeField]
    private UnityEvent onOneSecondLeftEvent;
    // タイマー終了時に呼び出す
    [SerializeField]
    private UnityEvent onTimerFinishedEvent;  

    public void Start()
    {
        
        timerStarted = false;

        // 外部の変数マネージャーから秒数を取得し、floatに変換して代入
        var variableManager = Engine.GetService<ICustomVariableManager>();
        string timerString = variableManager.GetVariableValue("timer");
        if (float.TryParse(timerString, out float timerValue))
        {
            totalTime = timerValue;
        }
        else
        {
            totalTime = 0f; // または適切なデフォルト値を設定
        }

        // タイマー表示用UIテキストを更新
        UpdateTimerText();
        StartCoroutine(UpdateTimerColor()); 
    }

    public void StartTimer() 
    {
        timerStarted = true; 
    }

    private void UpdateTimerText()
    {
        TimerText.text = totalTime.ToString("F2"); 
    }

    private IEnumerator UpdateTimerColor()
    {
        while (totalTime > 0f)
        {
            if (totalTime <= 1f)
            {
                TimerText.color = Color.red;
                onOneSecondLeftEvent.Invoke();
                timeSpeed = 0.8f; 
            }
            else if (totalTime <= 3f)
            {
                TimerText.color = Color.yellow;
                onThreeSecondsLeftEvent.Invoke();
                timeSpeed = 0.9f;
            }
            else
            {
                TimerText.color = Color.white; 
                timeSpeed = 1f;

            }

            yield return null; // 次のフレームまで待機
        }

        // タイマー終了時に timeSpeed を元に戻す
        timeSpeed = 1f;
    }

    void Update()
    {
        if (!timerStarted || totalTime <= 0f)
        {
            return;
        }

        totalTime -= Time.deltaTime * timeSpeed;

        if (totalTime < 0f)
        {
            totalTime = 0f;
        }

        // タイマー表示用UIテキストを更新
        UpdateTimerText();

        if (totalTime <= 0f)
        {
            Debug.Log("制限時間終了");
            onTimerFinishedEvent.Invoke(); 
        }
    }
}

こんなふうに自分で作った関数を呼び出せるので、カスタムUIでかなりのことができるなと思いました。同じ感じでカーソルが拳銃の照準に変わるのとかも、実装してます。
あとは、animatorの方にEventhandlerを持たせて、アニメーションに合わせてSEを鳴らしたりとかも実装しました。

カスタム変数 ―― Naninovelの方から変数に触る

ここで、タイマーの時間設定なんですが、8秒に設定されています。この決定は、自作のスクリプトの方ではなく、Naninovelの方で設定できるようになっています。Naninovelにはカスタム変数という機能があって、Naninovelのスクリプトの方からある程度変数に触れるようになっています。
公式のカスタムUIの日付表示の動画サンプルも、カスタム変数で実装しているので、この動画を見るとわかりやすいです。
タイマーの時間セットは、
@set timer=8 @showUI TimerUI @wait {timer+2}
という形でNaninovelのスクリプトの方で動くようになっています。
このtimerというカスタム変数を登録するだけなら、


こんなかんじでマニュアル通り、Custom Variablesに項目を追加するだけでできます。ここで作ったTimerというカスタム変数は、上記のコードだとstart()内の
var variableManager = Engine.GetService<ICustomVariableManager>(); string timerString = variableManager.GetVariableValue("timer");
で呼び出しており、設定したカスタム変数名を入れるだけで呼び出せます。

というわけで、今回はカスタムUIとカスタム変数について触れました。UnityそのものやC#についてはもっと詳しい記事がいっぱいあると思うので、そのあたりについてはかなり省略しました。

ゲームの制作って地道ですね。一つ一つ機能を追加したり、パラメータを調整したりして、いい感じになるように頑張っています。それでは!

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

もっきゃりぺお 2023/08/20 16:11

【ノベルゲーム制作】③Unity Naninovel カスタムプリンタ、口パク、SE【まほだん】

やっとNaninovelになれてきた

前回記事が5月末で、それからティアキンが挟まり、8月半ばという感じです。だいぶ開きました。ティアキンはだいたい三週間くらいでクリアしたので、色々NaninovelとUnityのほうで試行錯誤していました。

前回ポストエフェクトを実装しましたが、ゲーム中にスクリプトのコマンドで簡単にポストエフェクトの程度を切り替えたりできないかな、と思って一ヶ月ほど弄ってました。結構どうにかなりそうでならなかったので、一旦深追いせずできそうな方を優先して、予定していた口パクカスタムプリンターの方を実装しました。

見ての通り、平野さんのグラフィックはみるきさんの方で試行錯誤され、今回のもので行くことになっています。かわいいですね。教室の背景やカスタムプリンターの画像もみるきさんが作成しました。

また、しばらくずっとNaninovelの配布しているデモデータで試していたんですが、新しく『まほだん』本編用のプロジェクトを作成して、データを作りはじめました。やっとって感じですね!

あとはシナリオを何度か読み直しして、プロット作りの手伝いとかもしたり。シナリオの方の記事も追って上がるみたいです。

今回は、公式のマニュアルでは情報が省略されている口パクについて詳細に解説していきます。(カスタムプリンターについては手厚いので、あまり難しいことはありませんでした。どちらかというとPrefabについて触ることになるので、Unityサイドの話になります)

口パク

目的 ―― 喋ってるときに口を動かしたい!

というわけで口パクです。
該当キャラクターが喋っているとき、キャラクターの口が動く機能ですね。

ゲームってとにかく手触り(ボタンを押したときにいい感じに音や画面が動いたりする)が大事だと思うんですが、アクションゲームならともかく、ノベルゲームで手触りをよくできる部分って限られます。口パクはキャラクター表現を豊かにするだけじゃなくて、手触りにも大きく寄与する部分だと思います。

なので口パク、実装しました。

口パクの構造 ―― アニメーションを喋るタイミングで呼び出す

Naninovelではキャラクターのタイプがいくつかある、というのをポストエフェクトのときにも書いたんですが、口パクに対応してるタイプが限られます。現在のNaninovel日本語ドキュメントでは、[一般キャラクター]https://naninovel.com/ja/guide/characters.html#一般キャラクター)(一般キャラクター、と書いてあるけれど、英語だとgeneric characterで、設定的には一番詳細に設定する方法、という感じです)、Live2Dのキャラクターに対応していると書いてありますが、英語のドキュメントではLayerdCharacterにも対応していると書いてあります。

今回はLayerdCharacterで実装していくので、その方法を書いていこうかと思います。ちなみに口パクの設定方法について、Naninovelのドキュメントではあんまりフォローしていないです。

>一般キャラクターで口パク機能を利用するには、 CharacterActorBehaviour コンポーネントの On Started Speaking と On Finished Speaking Unityイベントを使用してください。そのキャラクターが表示メッセージを話始める時(またはメッセージが完全に表示された時)イベントが呼び出され、そのキャラクターの口パクアニメーションの開始や停止などのカスタムロジックをトリガーできます。これはUIの On Show イベントと On Hide イベントの仕組みに似ています。 UIカスタマイズガイドでカスタムアニメーションの駆動に使用する方法を見つけてください。

やってみるとおおよそこの通りなのですが、Unity初心者の私には大変でした。具体的な実装方法は、カスタムUIにある解説動画が一番参考になりました。

Naninovelの口パクは、喋るタイミングでアニメーションを呼び出し、また喋り終わるタイミングでアニメーションを止める、という形で実装されます。
アニメーション自体はNaninovelではなく、UnityのAnimatorによって実装され、NaninovelはしかるべきタイミングでAnimatorにトリガーを投げ込んで、状況を遷移させるという形です。なのでまずはアニメーションのデータを作る必要があります。

Animation Clipの作成

幸い、UnityのAnimatorについての記事はネットにもいっぱいあります。
私が手始めに参考にしたのは

【Unity】Animator機能のことはじめ
https://note.com/info_/n/n577f4f3147ec

です。
この記事の通り、とりあえずアニメーションウィンドウでクリップを作成します。この際、アニメーションさせるキャラクターのPrefabを開き、選択した状態にしましょう。prefabを開いていないとボタンが押せません。(初心者のうちはこういう何でもないところで結構躓いて、時間がとられますよね)

そうして作成したAnimation Clipに、Add Propertyでアニメーションさせるものを追加します。


こんな感じで、追加できるプロパティがめちゃめちゃ多くてろたえるのですが、

prefabの中から口パクさせたい口があるレイヤーを探し、そのscaleを追加します。
(口パクの際に位置も変えるなら、positonも追加する必要があるでしょう)
追加したら、いい感じにアニメーションを作ってください。

実際にキャラクターを口パクさせて、動きを確認しながら実装できるので結構楽しいです。こんな感じで実装されてます。

この際、色々な表情の口それぞれに口パクを実装しています。

ちなみにアニメーションでscaleを変更する方法以外に、Spriteの画像を切り替える方法でも試したのですが、prefabの動作ではちゃんと機能するものの、Naninovelで実際に動かしてみると機能しませんでした。

Animator Controllerの作成

上の記事にもある通り、アニメーションの遷移を管理するものです。ステートマシンですね。


こんな感じで、初期状態(init)と喋っている状態(speaking)、喋っていない状態(wait)を作り、transition(遷移する矢印)で結んでいます。スクショで選択しているspeakingに、先程作成したclipがMotionで紐付けます。waitとinitはnoneのままです。

この際、initとwaitのSpeedは高く設定してください。(私は10000)にしています。この値が低いと、口パクに切り替わるタイミングが遅れて、短い台詞だと口パクしなくなったりします。


あとは、遷移する条件を設定する必要があります。paramaterの+からTriggerを選択し、喋りはじめのトリガー(Started Speaking)と喋りおわりのトリガー(Finished Speaking)を追加します。トリガー名は任意です。

Naninovelの設定をしたら口パク完成!


重要なのは、
  • Layered Character BehaviourコンポーネントのAnimated をTrue
  • Layered Character BehaviourコンポーネントのOn Started Speaking()とOn Finished Speaking()にトリガーを設定
  • AnimatorコンポーネントのControllerに↑で作成したAnimator Controllerを設定
    です。

少し複雑なのはOn Started Speaking()とOn Finished Speaking()の設定。しゃべりはじめたときとしゃべり終えたときにこの関数が呼び出されるようです。ここで影響を与えるObjectを選択する必要があり、


Animatorをドラッグして選択します。

そのうえで、Animator.SetTriggerとAnimator.ResetTriggerに、↑で追加したトリガー名を追加します。お分かりだとおもいますが、しゃべりはじめたときにStarted Speakingをセットし、Finished Speakingをリセットします。しゃべりおわりはその逆です。

というわけで、口パクの完成です! やったー。

ついでにしゃべるときのSEとか

記事冒頭の動画では、しゃべりに合わせてぴろぴろと鳴っていますが、これについては全く別の設定です。また、しゃべっていないときにグレーがかって、しゃべっているときに明るく強調されるのも同様です。
どちらもNaninovelのConfiguration内のCharactersで設定します。


音声データをAudioのほうでNaninovelに登録すると、Message Soundで選択できます。

強調については強調されていないとき(wait)と、強調しているとき(highlight)の効果を、Poseの項目で設定します。そのうえで、Highlight When Speakingをtrueにし、設定したPose NameをSpeaking PoseとNot Speaking Poseに設定すればオッケーです。

というわけで、今回は口パクの記事でした。次はカットインとか、UIとか、独自のミニゲーム的な部分について触っていこうと考えています。が、5日後にはアーマード・コア6が発売してしまうので、またその分遅れると思います!

では!

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

もっきゃりぺお 2023/05/28 18:12

【ノベルゲーム制作】②Unity Naninovel ポストエフェクト、表情差分【まほだん】

大変でした

前回の終わりに、GWなのでそこでやれたらいいですね、とか言っていましたが、すっかり5月末になってしまいました。だいぶ難航してしまい、実装できたのが5月の半ばくらいです。この記事が5月末に書かれているのはティアキンのせいです。ティアキンやりたい。

今回の記事はポストエフェクトと表情差分について使えるようになったので、それについて書きます。

ポストエフェクト

目的 ―― いい感じの画面にしたい!

ゲームとしていいかんじの、おしゃれな画面づくりをしたい! と、みるきさんに相談を受けていました。ゲーム画面がいい感じかどうかっていうのはやっぱり大事ですよね。それで、作る背景画像やキャラ画像に直接気合でフィルタをかけてもある程度実装できると思うのですが、作業量がすごいことになりそうだし、色々と組み合わせて、揃えてから調整するのもすごく大変そうなので、Unity上でいい感じにやる、なんか、シェーダー? とかいうのを触ろうと思いました。

普通ゲーム制作でいきなりシェーダーとか触らない気がするんですが、みるきさんがこのあと実際にイラストの作製に入る前に、どこまでUnity側でやれるか確認しておきたかったので、ここから入りました。結果的に、かなりそれでよかったなと思っています。

シェーダーって何? ポストエフェクトって何?

というわけで、色々勉強しました。めちゃめちゃいい感じの動画がいっぱいあって、Unityってすごく勉強しやすいですね!

シェーダを書けるプログラマになろう #1 シェーダを理解しよう - Unity道場2019 2月
https://youtu.be/wUx_Y9BgC7k
Unity道場2D編 Shader Graph はじめてみよう!基礎編
https://www.youtube.com/live/3TXHMS8xFJ0?feature=share

まずこれら動画でシェーダーとは何かというのを勉強しました。ノベルゲーで2Dのゲームですから、特に2D向けで色々見ました。(ここに貼ってないものもいっぱいみたよ)

(シェーダーの勉強をしてからティアキンをやると、あ、ここBloomかかってるんだな、とか、ゲームの処理がちょっとだけ透けて感じられて面白いです。ティアキンやりたい)

それから実際にシェーダーを掛けられるまでの遠回りを、ちょっと書いてみようと思います。

遠回りその1 マテリアルに掛けたらだめだった

上記の2つ目の動画では、キャラクターのマテリアルを変更しています。
それに倣い、


デモのキャラクターにはいい感じに掛けることができたんですが、平野さんだけ、四角い黒い箱が出来てしまいます。(平野さんが荒い感じになっているのは意図したもので、ポスタリゼーションを掛けています)
どうも色々試したところ、全く無のシェーダー(入力がそのまま出力される)をかけてみても、この黒い箱は消えませんでした。
NaniNovelはキャラクターの表示方法がいくつかあり、平野さんはLayeredCharacter、他のキャラクターはSpriteCharacterとなっています。色々あがいてみましたが、多分LayeredCharacterと、このマテリアルを変える方法は相性がよくないっぽい……と判断しました。

というわけで、キャラクター単体じゃなくて、画面にポストエフェクトを掛けていくかたちで実装していきます。

遠回りその2 URP非推奨

NaniNovelのポストエフェクトは、エフェクトを追加したCameraPrefabに切り替えるよう設定することで実装できます。
公式のマニュアルにある動画では、Camera Filter Packというアセットを適応させています。今回は自作したいので、ポストエフェクトを掛けるだけじゃなくて、この方法でポストエフェクトを実装できるようにしないといけません。見たところかなりいい感じのアセットなので、買ってみるのもいいかもなんですけどね。

カメラにポストエフェクトを掛ける際、調べると出てくるのが、大体URPを使ったものです。Unityのシェーダーって言ったら、最近はURPが主流で、色々な場面で汎用的にいい感じに使えてURP最高!!! って感じだったので、私も最高になるか……って進めていたら、NaniNovelはURP非推奨です。素人にはおすすめできない。と書いてあって断念。

Post Processing Packageを入れる

URPを入れないで、カメラにポストエフェクトを掛けるには……と調べると、どうやらPost ProcessingというPackageを入れるとよい。結果的にこれが正解でした。

Post Processingはカメラのコンポーネントに追加でき、Post-process LayerとPost-process Volumeを追加し、Add effectボタンを押すと、ポストエフェクトを追加することができます。

初めからいくつかのポストエフェクトが入っていて、先程のBloomとか、色調を変えたりするやつとか、画面の調子を整えるだけならこれだけでも結構いけそうです。

ここに自作のポストエフェクトを追加するには、以下の記事が役立ちました。

【Unity】Post Processing Stack v2入門!簡単にポストエフェクトを掛ける手順を総まとめ - LIGHT11 https://light11.hatenadiary.com/entry/2018/08/07/235251

【Unity】Post Processingで自作のポストエフェクトを実装する - LIGHT11 https://light11.hatenadiary.com/entry/2019/03/31/225111

PostProcessing Stack v2でカスタムエフェクトを作る - Unityを頑張るblog https://ssr-maguro.hatenablog.com/entry/2019/11/19/181217

今回はSRPを使わないので注意が必要で、結局一番参考することになったのは、以下の公式のドキュメント。ここでグレースケールの自作ポストエフェクトを実装しているので、これを改造することでいくつかのポストエフェクトを実装しました。

Writing Custom Effects - unity
https://docs.unity3d.com/Packages/com.unity.postprocessing@2.0/manual/Writing-Custom-Effects.html

このドキュメントのグレースケールもせっかくなのでそのまま追加しました(そのまま追加できました)。もしまほだんでグレスケになる演出があったら、あ、これ使ったんだな、と思ってください。

これを見ると分かる通り、思いっきりシェーダーと実装のためのC#を書くことになっていますね。そう、結局shader graphではなんかいい感じにできなくて、コードを書くことになりました。

実装する上でいくつかわからないところは、chatGPTを活用したりもしました。

ちなみにCameraPrefabの設定はこんな感じ。

変えたのは、
Clear Flags : Solid Color
Background : #000000
Projection : Orthographic

ポストエフェクトが出来た!



というわけで、上がそのまま、下がポスタリゼーションと色収差を掛けたもの。

拡大すると、左がそのまま、右が掛けたものです。
画像だけで見ると掛けないほうが良くない? という感じですが、ゲーム画面だと掛けたほうがいい感じになります。実際の調整は絵との相談で、そのあたりも記事に出来たらいいですね。
何はともあれ自作のポストエフェクトを導入できました。めでたしめでたし。

表情差分

こっちのほうは素直に、NaniNovelのマニュアル通りにやればできました。


平野さんがニッコリ笑ってくれます。かわいいね。

これは平野さんのレイヤー構成がそのままPrefabのグループの構成になっており、


スクリプトのように表示レイヤーを切り替える感じで実装されています。

というわけで、今回はこんなところで。
次回は口パクに挑戦したいな~と思っています。調べてみると結構大変そうですが、頑張ります。多分ティアキンクリアしてからの更新になるんじゃないでしょうか。それではまた!

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

もっきゃりぺお 2023/04/29 21:01

【ノベルゲーム制作】①Unity Naninovelノベルゲーム 開始~キャラクター表示【まほだん】

活動記録

新たに一員となりました水面です。


もっきゃりぺおの一員となりました水面です(これはハセさんという方に描いてもらった私で、完全にこれです)。もっきゃりぺおでは、主にゲームとして実装していく仕事をします。他には(私自身もシナリオが書ける人なので)シナリオの相談に乗ったり、案を出したり、どういう方法で展開していくか……とかの話をしたりと、色々しています。備忘録や思考整理を兼ねて、せっかくなので記事に残しながら作っていこうと思います。使い方の解説をする記事じゃないので、細かい使い方はマニュアルを読んでね。

スキルについて

unityははじめてです。C#はちょっと触ったことがあります。
CとかpythonとかC++とかも浅く広く触っているので、プログラミングの全くの初心者ではないです。プログラミング初学者というところで……。私はどっちかというと組み込みとかのハードウェアを動かす方のエンジニアなので、ソフト開発らしいソフト開発はほとんどはじめてなんじゃないかな。
まあプロダクトを考えて実装することはどんなモノづくりだって同じでしょ。という気持ちで取り組んでいます。みるきさんがありえんスピードでゴリゴリシナリオを書いているから私も急がねばならぬと決意した。なんかもう最終章話書いてるし……。

Naninovel

NaninovelはUnityのアセットなのですが、英語です。色々と機能が充実してて、デフォの画面もかっこいいし、色々な環境に移植する際にも勝手に対応してくれるらしいので、Naninovelでやることになりました。
ちょっと触ってみた、みたいな記事や説明はあるけれど、これでガッツリ作っている過程が日本語の記事になっているのはあまり見ないので、読む価値のあるものが残せるだろうと思い、記事にしています。ci-enの記事はいくらあってもいいしね。
純粋にテクニカルな部分の書き出しだけじゃなくて、どういう流れでゲームを作っていくのか……みたいなのも残せたらいいですね。

まずはざっくりデモを触ってみる

基本的な処理はだいたいわかる

なにはともあれデモを触ってみます。プログラムならとにかくできてるものを見て学ぶのが一番だと思ってます。合わせて


NaniNovelはビジュアルエディターって機能があって、動かしながらコードをリアルタイムで追えるから、理解も容易だしデバッグもしやすそうです。キャラクターの挙動や画面効果、演出などを、こういう形でスクリプトとして書いていけばとりあえずはモノになりそうです。
さらっとNaniNovelみたいなアセットを使わない方法でのノベルゲーム作成を調べもしたんですが、バキバキにプログラムする必要がありそうで、ちょっと大変そうでした。
デモで基本的なことはわかりました。マニュアルも同時に追い、どういうことができるかをざっくり確認しました。みるきさんにも、こんな機能があるけどやりたい演出とかある? みたいな質問をしました。それ以外にも、とりあえずマニュアルを眺めて、実装方法はわからなくてもいいから使いたいものがあれは言ってねと伝えてあります。

機能の活用って、すでに表現したいものがあってその手段を探す場合と、機能があってそれならこういうこともできそうだねと広がる場合がありますよね。せっかくNaniNovelを使うので、よくなりそうなら積極的に使いたいところです。

ここからどう制作していくか

チュートリアルには当然、NaniNovelのすべてが書かれているわけじゃないので、すでに決まっている表現したいことの実装方法を考えていきます。
ノベルゲームとして形にするだけなら、テキストを流し込んだあと、ごりごりとスクリプトとして実装していけば、とにかく形になるというのはわかりました。そのままでもかなりおしゃれな感じのセーブ画面、ロード画面とかもすでに用意されてます。なので、ごりごりとスクリプトを書くだけじゃどうにもならない色々なことや、スクリプトを書く前の準備について考えてみます。

  • キャラクターの登録
    • 口パクしたい
    • 表情やらなにやら、差分がめちゃめちゃある
    • 照明の効果だったり、フィルタをかけたりしたい
  • 画面づくり
    • 文字が表示されるところ(プリンターというらしいです)も変えたいし
    • 枠とかつけたい
    • ちなみにおおよそ作りたい画はみるきさんにすでに提示してもらっています
  • かっこいいカットイン
    • カットインを入れるとき、かっこいい感じに入れたい
      • なんかこう……いい感じに入ってきたりね
  • ストーリーの分岐
    • 何を隠そう、まほだんには分岐があります!
  • 特殊なゲームモード
    • 『魔法少女確殺弾』モードというフリーカーソルのモードが挿入されます
    • これはまあ、ちゃんとプログラムをしないといけないでしょうね
  • 多言語対応
    • まほだんは英語とか中国語とかに展開する予定です
  • CG集 エンディング集
    • まほだんはマルチエンディングなので、コレクションしたいですよね

ざっとこんなところでしょうか。他にも細かい色々はありますが、とりあえずこんな感じで実際に作っていきましょう。ものを作るとき、仮固定として方針ぎめをして、それから進めるのがいいんじゃないかな、と思います。まったく方針ぎめをしないとバタバタするし、はじめに決断的に全部決めるのも、現実的じゃないですからね。

平野さんを表示できるようにしよう!

というわけで、まずはキャラクターの表示をしましょう。ただの立ち絵なら簡単で、枚数が少ないなら表情などの差分も全部画像を用意すればいいんですが、もう少し込み入ったことをやりたいです。特に口パク。
というわけで、今回はLayerdCharacterという方法でキャラクターを用意します。
この方法だと表情差分とかを作りやすそうです。unityのスプライトレンダラーという機能をガッツリ使う機能っぽいですね。服を変えるとかもやりやすそう。なにより、PSDImporterPacakageという方法で、PSDファイルからレイヤー情報をある程度維持ししたまま読み込めるらしいので、これは便利そうです。基本的にみるきさんにクリスタで作り込んでもらって、それをインポートする感じでやっていきます。

そのままPSBファイル(PSDインポーターだけどPSBファイルなんですね)を投げ込めばいいんだと思ってしばらく悩んだんですが、PSBインポーターっていうアセットをいれないといけないんですね。入れたら一発で通りました。ちゃんとレイヤーごとに分けられるデータになってますね。


というわけで、デモにねじ込まれて荒野で元気よく挨拶する平野さんです。やった~表示はできたぞ!(デモで表示されてるNaniNovelのNaniくんの代わりに平野さんを表示できるようすげ替えました)

今回はこんなところで。次回は表情差分とか、シェーダーとかで、もっとちゃんと色々実装してみようと思います。GWなので、そこでやれたらいいですね!

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

月別アーカイブ

記事を検索