2020年8月22日土曜日

Unity初心者向け、会話アセットFungusでできること紹介!


初めてこういう技術記事的なの書きます。何か間違いがあったら教えてください……。

はじめに


僕がUnityでゲームを作るにあたって、ヘビーローテーションして重宝しているアセットに
というものがあります。


無料です。


簡単にこんな感じの立ち絵付き会話が作れます。
主にノベルゲームやストーリー付きのゲームで、キャラクター同士の会話シーンに使われるアセットですが、かなり多機能でストーリーがないゲームでも有用なので、せっかくなので紹介したいと思います。

基本全て英語ですが、そこまで難しくない単語しか使われていないのでたぶん大丈夫!


前置きはここまでにして、早速本題に入りましょう。


※この記事で登場するのは「僕が普段使ってる機能の紹介」です!だいぶ偏りがあるので使えそうなものだけ使ってね!


1.何はともあれフローチャートを作成


Fungusをアセットストアからダウンロードしたら、まずはUnityの画面上部、ステータスバーにある「ツール(tools)」から、「Fungus」→「作成(createかな)」→「Flowchart」でフローチャートを作成します。


このフローチャートがFungusの管理画面になります。Flowchartのインスペクターから、「Open Flowchart Window」をクリック。


左側が開いたFlowchartです。New Blockを選択するか、右クリックでAdd Blockを選択することでインスペクターに各ブロックの情報が出ます。

インスペクターのうち、Execute On Eventからイベントの発生条件を選び、下部の+ボタンからイベントの内容を追加します。残りは特に使わないので今は放置。


2.発火・発生条件を設定


Execute On Eventの右にあるリストから発生条件を選択します。
とりあえずよく使うのを3つ覚えてください(投げやり)。


Game Started

シーン開始と同時に発火します。

Input/Key Pressed

指定されたキーを押したら発火します。Key Codeのリストでキーを指定。

Scene/Message Received

これが3つの中で一番使い勝手がいいです。(かつ一番ややこしいのでまずは前者二つを試してみて)
スクリプトで指定された文字列が送られてきたら発火。

message」の欄に発火するための文字列を入力します。今回はkoppe(コッペ)と入れておきます。(これは僕のゲーム『絵本のコッペ』の主人公の名前です。覚えてね)


続いて、「koppe」という文字列をこのFlowchartに送りこむためのスクリプトを書きます。

新規のスクリプトを作成します。とりあえず名前は適当に「FungusExecute」とかにします。


① public class FungusExecute: MonoBehaviourのクラス内、void start()の前に以下の一文を追加します。
public Fungus.Flowchart flowchart = null;


②発火したい条件が書かれている部分に以下の一文を追加します。
flowchart.SendFungusMessage("koppe"); 

この"koppe"の部分をmessageで入力した文字列に対応させてください。


③スクリプト「FungusExecute」をオブジェクトにくっつけます。続いて、インスペクター中のFlowchartにヒエラルキーからフローチャートをドラッグ&ドロップ。


これでOK!


一例として、"Player"タグがついているオブジェクト(=操作キャラ)と接触したときにイベントを発生させたい!という場合は、以下のように設定します。

①そのまま。

②接触を判定するためのコードを書きます。
    private void OnTriggerEnter(Collider other)
     {
        if(other.gameObject.tag == "Player")
        {
            flowchart.SendFungusMessage("koppe");
        }
     }

③ここもそのまま。Player側とオブジェクト両方にcolliderを設定するのを忘れずに。

これでプレイヤーとオブジェクトがぶつかると発火してイベントが発生するようになるはずです。
 


3.イベント内容を設定


各ブロック下部のCommandsの欄にイベント内容を追加していきます。
 Commandsのさらに下にある +マークをクリックすると、イベント内容のリストがずらっと表示されます。これをクリックすると、一つずつCommandsの欄に追加されます。

先ほど設定した発火条件を満たすと、上から順に実行されます。



イベントの種類について

こちらも僕が普段使っているものをいくつかピックアップして紹介します。
ここからは箇条書きになるので、自分が使いたいものを確認してください。


会話文の表示:Narrative/Say

メッセージ表示機能です。
これ単体でも簡単なメッセージは表示できますが、「キャラクターのセリフとして表現したい!」とか、「キャラクターの立ち絵も一緒に表示したい!」とかの場合はもう少し詳しく設定する必要があります。

もう少し詳しく設定

まずは「Fungus」→「作成(create)」→「文字/Character」を、用意したキャラクターの人数分作成します。(日本語に設定してると"character"が「文字」に翻訳されている罠があります)
次に、今作ったCharacterのインスペクター内にある「Character(スクリプト)」を編集して、各キャラクターの情報を追加します。


Name Text:キャラ名。
Name Color:キャラ名の色。
Sound Effect:効果音かな?(すいません使ったことないです)→キャラクターが喋ってる間、文字表示に合わせて鳴る効果音を変更できます(情報ありがとうございます!)
Set Say Dialog:Say Dialogの設定をキャラクターごとに変えたい時はここにセットする(Say Dialogについては下の方参照)
Portraits:キャラの立ち絵。サイズで立ち絵差分の数を指定、要素に一つずつ追加していく。



また、今のうちに「Fungus」→「作成(create)」→「Stage」で ステージを作成しておきましょう。もしこの先で立ち絵を表示するなら必要です。


さて、メッセージを書くための準備が整いました。Narrative/Sayを追加し、ガンガン書き込んでいきましょう。



Character:どのキャラクターのセリフかを選択。
Portrait:セリフの隣にキャラクターの顔画像を表示したいなら、ここで先ほど追加したPortraitsの中から選んでください。
Story Text:セリフの内容を入力。

とりあえずこの三つを把握してれば言葉を話すことができるはずです。人類はついに言葉を手にしたのだ。



*日本語の文章が表示されない時は
デフォルトのフォントである「Amaranth-Regular」と「Exo2-Regular」が日本語に対応していないことが理由の可能性が高いです。Say Dialogを弄りましょう。

「Fungus」→「作成(create)」→「Say Dialog」で文字に関する設定を作成、ヒエラルキーの中にある「Say Dialog」を開いて→「Panel」→「NameText」と「StoryText」を見つけてください。
次に、それぞれのインスペクター内のText→Characterの中にあるフォントの欄に、別で用意した日本語フォントを放り込んでください。おそらくこれでうまくいくはず……。



立ち絵の表示:Portrait

Portraitを使えばどのキャラクターが喋ってるのかを明らかにするために、画面上に立ち絵を表示することができます。



Display:Show(出てくる)とHide(ひっこむ)しか使ってない……。
Character:立ち絵を動かすキャラクターを選択。
Portrait:どの画像を使うかを選択
At Position:画面のどこに立ち絵を配置するか。

移動:これにチェックするとスッ……って感じで登場するようになります。
From Position・To Position:どこからどこに移動しながら登場するかを決定。画面外から出てきて欲しい時はOffscreen Right/Leftを使おう。

これをNarrative/Sayと組み合わせるだけで、基本的な会話シーンが作れます。



まだまだあるよ便利機能!

Commandに追加して色々試してみてください。

シーンの遷移:Load Scene
遷移先のScene名をScene Nameに入れるだけ。

画面のフェードイン・フェードアウト:Fade Screen
Target Alphaを1にすると画面がフェードアウト、すでにフェードアウトしている状態からTarget Alphaを0にするとフェードイン。
僕はよく「Fade Screen(Target Alpha 1)でフェードアウト→ Load Sceneで別のシーン移動→Fade Screen(Target Alpha 0)でフェードイン」というコンボを使っています。


オブジェクトのアクティブ化/非アクティブ化:Set Active
切り替えたいオブジェクトをインスペクターから引っ張ってくるだけ。Active Stateにチェックを入れるとアクティブ化、入れないと非アクティブ化。

オブジェクトの色を変える:Fade Sprite
スプライトレンダラーにインスペクターから放り込んで、継続時間とTarget Colorを設定。

オブジェクトの移動:iTween、LeanTweenシリーズ
基本的に「ターゲットオブジェクト」が「継続時間」の間に「オフセットで定められた位置」に移動します。
全貌を把握できていないので色々試してみてください。

BGM・ SEの挿入:Play Music/Play Sound
アセットの中から使いたい音源ファイルを入れるだけ。
鳴らしたいタイミングで呼び出せるから、うまく使えばかなり重宝する機能だと思う。

他のスクリプトのメソッドの呼び出し:Call Method
ターゲットオブジェクトを入れてメソッド名を入力。これも使いたいタイミングで呼び出せるのが使い勝手良い。

などなど。



ずらっと並べるとこんな感じになります。

Fungusを使うと、イベントを「起こしたいタイミングで」「起こしたい順に」発生させるのがとても楽になります。
是非一度試してみてはいかがでしょうか。(この終わり方アフェリエイトみたいで嫌だなあ)



0 件のコメント:

コメントを投稿

【UGDG】ギルド民よ、ペンを取れ! ibisPaintで描くお絵かき入門のススメ!【アドカレ2020】

この記事は、 Unityゲーム開発者ギルド Advent Calendar 2020  12月2日の記事です。 タイトル長いな。 前置き(それから言い訳) うすいしお と申します。ゲームつくりびとです。 『絵本のコッペ』 ならびに 『ノワのお花畑大作戦!』 の二作品をリリースして...