【unity】文字制限なし。戦闘ログをスクロール可能にして表示する方法

【unity】文字制限なし。戦闘ログをスクロール可能にして表示する方法

 UnityでRPGなどを作るとき、アイテムの入手ログ等でテキストを表示したいことってありますよね。でも、UIのテキストに書くと文字制限があったり、スクロールが常に下に表示してくれないという問題点があります。今回はプログラム初心者でも実装しやすい方法を紹介していきます。

今回作るもの

 このようなダンジョンログを作っていきます。

 必要な工程は2つで、unityの操作でスクロールするテキストUIを作成し、あとはコピーするだけで実装できるプログラムを記述していきます。

作成手順

UIを作成

 空のオブジェクトを作成し、名前をLogにします。

 Logの子オブジェクトにUI→テキストを作成し、名前をcombat_log_textにします。

 同じく、Logの子オブジェクトにUI→スクロールバーを作成し、名前をScrollbarにします。

 現時点で以下のようになっていればOKです。

それぞれにコーポネントを追加

Log

 Logのインスペクターを開いてコーポネントを追加していきます。Rect Transformは参考にしてください。

 ここでLogコーポネントの説明をしていきますね。

Imageログを表示したい範囲の背景画像
MaskLogの子オブジェクトがLogの範囲を超えた時に表示しなくする
Scroll Rectスクロール画面の設定。この項目は設定項目が多いのでしっかりと説明していきます。

では、Scroll Rectの設定を以下のようにしてください。

 コンテンツをcombat_log_text、垂直スクロールバーをcombat_log_textと同じ階層にあるScrollbarにしてください。ヒエラルキーからドラッグするか、◎を押すと設定できます。

 ここで移動タイプをクランプ済にするのは、スクロールしなくても良い時に動かないようにするためです。

combat_log_text

 combat_log_textのインスペクターを開いてコーポネントを追加していきます。Rect Transformは必ず合わせてください。

 コーポネントの説明の前に、最重要な項目があります。

 それは、ピボットという項目です。

 これは0~1の間でX座標、Y座標のどのあたりに位置するかを設定できます。

 これがX:0.5,Y:0.5(デフォルト)だと中央揃えになります。

 テキストを常に上に来るようにしたければ、ピボットのYを1に。常に下に来るようにしたければYを0にします。

 今回は更新されたログ(1番下の行)を表示したいのでYを0にしています。

 他にもスクリプトで文字が更新されるたびに位置を調整することもできますが、難しいですのでピボットで調整しちゃいましょう。

 それでは、コーポネントの説明です。

Text文字を表示するコーポネント。このコーポネントをスクリプトで指定して、ログを表示していきます。コピペで実装できるので安心してください。
Contents Size FitterTextの文字数に合わせてコンテンツサイズを変更してくれます。垂直レイアウトグループ等と一緒に使うと不具合を起こすので要注意。今回は垂直フィットだけをPreferred Sizeで指定しています。

Scrollbar

 スクロールバーにはコーポネントを追加しません。代わりにRect Transformを設定していきます。

 今回は横幅が800で、スクロールバーの幅を50にしたかったのでこのような調整になっています。

 次に子要素のSliding AreaとHandleについても設定していきましょう。

 これでOKです。

 後は簡単なスクリプトを実装していきましょう。

スクリプトを記述

 空のオブジェクトを作成して名前をGameManagerにします。

 次にここにGameSystemというスクリプトを作成し、以下のコードの必要部分ををコピペしましょう。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.IO;
using System;

public class GameSystem : MonoBehaviour
{
 //ダンジョンログ
 public static Text combat_log_text;
 public static string dungeon_log = "ダンジョンログ\n";

 void Start()
 {
  //combat_log_textという名前のオブジェクトを探してテキストコーポネントを格納
  combat_log_text = GameObject.Find("combat_log_text").GetComponent<Text>();

  //このようにテキストを追加する。
  dungeon_log += "テキストが変更された\n";

  //テキストを反映させる
  update_dungeon_log();
 }

 //ダンジョンログを更新する
 public static void update_dungeon_log()
 {
  combat_log_text.text = dungeon_log;
 }

}//end


 このスクリプトをGameManagerにドラッグして適用すると実装できるはずです。

 今後はログを変更したい処理の時にテキストを追加していきましょう。

まとめ

 ログの内容を常に下に表示したいときは、テキストコーポネントがあるオブジェクトのピボットのYを0にする。逆に、上にしたいときはYを1に。

 スクロール可能で文字数制限がないログが表示されましたね。

 ログを初期化したいときは、dungeon_log = “(初期化したいメッセージ)”として書くと良いですよ。