スクリプトを貼りけるための空のオブジェクトの作成
Create → CreateEmptyをおします
名前をMessageControllerにします
会話機能のスクリプトの作成
Messageという名前のスクリプトを作成し、以下のスクリプトを入力します
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
using UnityEngine; using System.Collections; using UnityEngine.UI;// UI機能を使用するために追記 public class Message : MonoBehaviour { public bool isActive;// Canvasの表示非表示 public GameObject canvas;// 使用するCanvas public Text messageText;// メッセージを表示する文字 private string message;// 表示するメッセージ [SerializeField] private int maxTextLength = 90;// 1回のメッセージの最大文字数 private int textLength = 0;// 1回のメッセージの現在の文字数 [SerializeField] private int maxLine = 3;// メッセージの最大行数 private int nowLine = 0;// 現在の行 [SerializeField] private float textSpeed = 0.05f;// テキストスピード private float elapsedTime = 0f;// 経過時間 private int nowTextNum = 0;// 今見ている文字番号 private Image clickIcon;// マウスクリックを促すアイコン [SerializeField] private float clickFlashTime = 0.2f;// クリックアイコンの点滅秒数 private bool isOneMessage = false;// 1回分のメッセージを表示したかどうか private bool isEndMessage = false;// メッセージをすべて表示したかどうか private string[] conversation;// 会話 private int i = 0;// 文字列の列 private int stringsCount = 0;// 文字列の総行数 void Start() { gameObject.SetActive(true);// このオブジェクトを表示する clickIcon = canvas.transform.Find("Panel/Image").GetComponent<Image>();// clickIconをキャンバスの中のPanelの中のImageにする clickIcon.enabled = false;// clickIconのコンポーネントをオフにする messageText.text = "";// 文字を空白にする } void Update() { if (isEndMessage || message == null)// もし、メッセージが終わっていない、または設定されているなら { return;// 返す } if (!isOneMessage)// もし、1回に表示するメッセージを表示していなくて、 { if (elapsedTime >= textSpeed)// テキスト表示時間が経過したら、 { messageText.text += message[nowTextNum];// 次の文字番号にする if (message[nowTextNum] == '\n')// もし、改行文字だったら { nowLine++;// 行数を足す } nowTextNum++;// 次の文字番号にする textLength++;// 次の文字数にする elapsedTime = 0f;// 経過時間を0にする if (nowTextNum >= message.Length || textLength >= maxTextLength || nowLine >= maxLine)// もし、メッセージを全部表示、または行数が最大数表示されたなら、 { isOneMessage = true;// isOneMessageをtrueにする } } elapsedTime += Time.deltaTime;// 経過時間に時間の経過分足す //ここから左クリックして一気に表示させる処理 if (Input.GetMouseButtonDown(0))// もし、メッセージ表示中に左クリックされたら、 { var allText = messageText.text;// allTextに、文字を入れる for (var i = nowTextNum; i < message.Length; i++)// 表示するメッセージ文繰り返す { allText += message[i];//allTextに表示するi番目のメッセージを足す if (message[i] == '\n')// もし、改行文字だったら、 { nowLine++;// 今の行に一行足す } nowTextNum++;// 次の文字番号にする textLength++;// 次の文字数にする if (nowTextNum >= message.Length || textLength >= maxTextLength || nowLine >= maxLine)// もし、メッセージがすべて表示される、または1回表示限度を超えたなら、 { messageText.text = allText;// messageTextをallTextにする isOneMessage = true;// isOneMessageをtrueにする break;// 処理を止める } } } } else// クリックされていなければ、 { elapsedTime += Time.deltaTime;// 経過時間に時間の経過分足す if (elapsedTime >= clickFlashTime)// クリックアイコンを点滅する時間を超えたなら、 { clickIcon.enabled = !clickIcon.enabled;// クリックアイコンを点滅させる elapsedTime = 0f;// 経過時間を0にする } // クリックされたら次の文字を表示する処理 if (Input.GetMouseButtonDown(0))// もし、クリックされたら、 { messageText.text = "";// メッセージを空白にする nowLine = 0;// 今の行を0にする clickIcon.enabled = false;// クリックアイコンをオフにする elapsedTime = 0f;// 経過時間を0にする textLength = 0;// 文字数を0にする isOneMessage = false;// isOneMessageを0にする if (nowTextNum >= message.Length)// もし、メッセージが全部表示されていたら、 { nowTextNum = 0;// 現在の文字番号を0にする if (i == stringsCount - 1)// もし、文字列の総行数に達したら、 { isEndMessage = true;// isEndMessageをtrueにする canvas.transform.GetChild(0).gameObject.SetActive(false);// キャンバスの子オブジェクトを非表示にする } else// もし、文字列の総行数に達していなければ、 { i++; //iを1増やす SetMessage(conversation[i]);// SetMessageを実行する } } } } } void SetMessage(string message)// SetMessage { this.message = message;// このオブジェクトのmessageをmessageにする } public void SetMessagePanel(string[] message)// SetMessagePanel { i = 0;// iを0にする stringsCount = message.Length;// 文字列の総行数をmessageの要素数にする conversation = message;// coversationをmessageにする canvas.SetActive(true);// キャンバスを表示する SetMessage(conversation[0]);// SetMessageを実行する canvas.transform.GetChild(1).gameObject.SetActive(true);// キャンバスの子オブジェクトを表示する isEndMessage = false;// isEndMessageをfalseにする } } |
入力したらMessageControllerにドラッグ&ドロップします
メッセージウィンドウの作成
メッセージウィンドウの枠の作成
Create → UI → Panelを選択します
UIの位置バランスが崩れないようにする
キャンバスを選択し、UI Scale ModeをScale With Screen Sizeに変更します
Reference Resolutionを画面比率と同じ倍率にします
※16:9なら1600:900という具合です。画面比率は初期設定だとFreeAspectになっているので、好きなサイズに変更しましょう
Panelの位置や大きさを変更して画面に合わせます
クリックアイコンの作成
Create → UI → Imageを選択します
ImageをPanelにドラッグ&ドロップします
アイコンに使う画像をImageを選択したままにして、SourceImageにドラッグ&ドロップします
※画像はなければ、自作するか、こちらを使って下さい
アイコンの位置や大きさを調整します
表示する文字の作成
Create → UI → Textを選択します
文字はパネルの下に来るようにドラッグして、文字の設定をします
※Canvasが画像のような構造になっていることを確認しましょう
会話を表示するスクリプトの作成
MessageScriptという名前のスクリプトを作成し、以下のスクリプトを入力します
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
using UnityEngine; using System.Collections; public class MessageController : MonoBehaviour { public Message messageScript;// Messageスクリプトを読み込む public string[] message;// 表示させるメッセージ void Start() { StartCoroutine("Message");// Messageコルーチンを実行する } IEnumerator Message()// Messageコルーチン { yield return new WaitForSeconds(0.01f);// 0.01秒待つ messageScript.SetMessagePanel(message);// messageScriptのSetMessagePanelを実行する } } |
入力したら、会話を実行するオブジェクトにドラッグ&ドロップします
※今回はプレイヤーにドラッグ&ドロップしています
MessageScriptを貼りつけたオブジェクトを選択し、スクリプトのMessageScriptにMessageControllerをドラッグ&ドロップします
MessageScriptのMessageの横にある▷をおし、Sizeに行数を入力すると、文字を打つことができます
MessageControllerを選択し、CanvasにはCanvasを、MessageTextにはTextをドラッグ&ドロップします
テストプレイをすると、文字が表示されます
複数の会話や表示されるタイミングを自分で決めたい場合
以下のようにMessageScriptを入力します
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
using UnityEngine; using System.Collections; public class MessageScript2 : MonoBehaviour { [SerializeField] private Message messageScript;// Messageスクリプトを読み込む public string[] message1;// 管理したい会話の数だけ作成する public string[] message2; public string[] message3; void Start() { } void Update() { if(Input.GetKeyDown(KeyCode.A))// Aキーがおされたら、 { StartCoroutine("Message",message1);// Messageコルーチンを実行する } if (Input.GetKeyDown(KeyCode.B))// Bキーがおされたら、 { StartCoroutine("Message",message2);// Messageコルーチンを実行する } if (Input.GetKeyDown(KeyCode.C))// Cキーがおされたら、 { StartCoroutine("Message",message3);// Messageコルーチンを実行する } } IEnumerator Message(string[] Conversation)// Messageコルーチン { yield return new WaitForSeconds(0.01f);// 0.01秒待つ messageScript.SetMessagePanel(Conversation);// messageScriptのSetMessagePanelを実行する } } |
入力したら各会話の行数や内容を設定します
テストプレイをすると、ABCキーをおすと、それぞれ別の会話が表示されます
キャラクターに触れた時や、目的地に着いた時など条件を変えてみてください
[…] 会話機能 […]