UnityでRPGゲームのメッセージ表示機能を作る

今回はRPGゲーム等でよく使われるメッセージ表示機能を作りたいと思います。
誰かと話した時に、その会話の内容を表示する部分です。

大まかな仕様として、表示したい会話の内容を一定秒数後に一文字づつ表示していく。
1回で表示出来る文字数を指定しておき、それを超えたらマウスクリックするまで次の
話の内容を表示しない。

また、文字を表示している間にマウスクリックをしたら、1回で表示出来る文字数分を一気に表示するクイック表示機能をつける。
表示したい会話の内容がなくなった場合、マウスクリックでメッセージ画面ごと消す。

こんな感じの仕様にします。

スポンサーリンク

メッセージ表示用のUIを作成

まずはメッセージを表示する場所を作成します。

ヒエラルキーにCreateからUI→Canvasを作り、名前をMessageUIとします。
MessageUIの子要素にUI→Panelを作り、その子要素にUI→Text、UI→Imageを作成します。

メッセージ1

上のような感じの階層を作成します。

RPGの会話メッセージ表示領域

大枠がPanelで、それより少し小さくTextを作成します。Imageは右下に配置します。

Imageはクリックを促すアイコンになるのでインスペクタのSource ImageでSpriteを設定してください。

TextをPanelより少し小さくしたのは、同じ大きさにすると枠ギリギリに表示されてしまうので見づらくなる為です。

メッセージ表示のTextの設定

Textのインスペクタで設定を上のようにします。

Textは親のPanelのサイズに合わせて大きさを変え、Panelの枠から10ピクセル内側になります。

Alignmentは左上を指定し、左上から会話が表示されるようにします。
Horizontal OverflowはWrapにし、横幅を超える文字があった場合自動で次の行に表示します。
Vertical OverflowはTruncateにします。Truncateにすると縦幅を超える文字があった場合表示しません。
Overflowに設定すると、指定した文字は枠を超えて表示されるようになります。

ここの設定は自由に設定してください。

Best Fitにチェックを入れると枠に応じて制限内で文字の大きさが自動で変更されます。
制限値はBest Fitにチェックを入れると、Min SizeとMax Sizeの指定が出来ます。
しかし、メッセージは統一した文字の大きさで表示したいので、今回はチェックを入れません。

メッセージ表示スクリプトMessageを作成

メッセージを表示するスクリプトMessageを作成します。

MessageスクリプトはMessageUIゲームオブジェクトに設定します。

フィールド宣言はコメントにある通りです。

Messageスクリプトの設定

メッセージの表示が終わっているかメッセージが設定されていなければreturnでUpdateのそれ以降の処理を行いません。

isOneMessage(1回で表示するメッセージを表示しているか?)がfalseの時はtextSpeedの時間を超えたら1文字ずつ表示します。

改行文字が検出されたら改行数に+1をします。

今回の仕様では1回のメッセージの表示はmaxLine内での表示にしています。

メッセージの数を超えた、または1回で表示する文字数を超えた、または最大改行数を超えた場合はisOneMessageをtrueにします。

1回で表示する文字数を超えた時は、文章の途中でブツ切りにされてしまうので、ある程度改行文字を入れて改行で次のメッセージに遷移させた方がいいかもしれません。(^_^;)

1回のメッセージの表示が完了したら、クリックを促すアイコンを点滅させる為、一定時間が経過したらアイコンのオン・オフをします。

またマウスの左ボタンを押したら初期化処理をしてisOneMessageをfalseにし、次のメッセージを表示させます。

メッセージを最後まで表示していたら自身の子要素であるPanelを非アクティブにします。

SetMessagePanelは外部のスクリプトから再びメッセージを表示する時に使用します。

今回はサンプルなのでヒエラルキー上に空のゲームオブジェクトを作成し、名前をActiveMessagePanelにし、これにActiveMessagePanelスクリプトを取り付け、ここから新しいメッセージを設定出来るようにしてみます。

ActiveMessagePanelスクリプトはマウスの右ボタンを押したらMessageスクリプトのSetMessagePanelにメッセージを設定して、呼び出します。

今回はマウスの右ボタンを押してメッセージを設定していますが、普通ならば村人と会話を開始するというイベントのタイミングでMessageスクリプトのSetMessagePanelを呼び出せばいいと思います。

Unityの実行ボタンを押して確認してみましょう。

メッセージ5

上のようになりました。

メッセージ機能の問題点

現状ではメッセージの途中で意図せず途切れてしまう事があります。

これは最大文字数で制限している為です。

1回のメッセージで表示をする最後を何らかの記号などを書いて設定しておき、

その文字を検出したら一旦表示をやめクリックを促すという処理を加えるといいかもしれません。

その最後の検出文字が出る前に1回のメッセージ表示限度を超えてしまっては元も子もありませんが・・・。

スポンサーリンク

記事をシェアして頂ける方はこちら

フォローして頂くとやる気が出ます