メッセージを表示するScript(2018/7/21修正)
以前、メッセージウィンドウの作り方をブログで紹介しました。そこで、テキストメッセージを表示するScriptを作成しました。
Script
作成したScriptはこちらです。
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 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 |
using System.Collections; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class CreateMessageV3 : MonoBehaviour { public GameObject preMessageWindow, preText, preSndMessage, preSndNextMessage; public Vector3 windowPosition; //メッセージウィンドウの位置 public Vector2 windowSize; //メッセージウィンドウの大きさ /* テキストはメッセージウィンドウと同じ位置に作られる */ public Vector2 textAreaSize; //テキスト領域の大きさ public int lineNumber = 3; //行数 public Vector3 textOffset; //位置調整用 public float textSpacing; //行間の広さ public int fontSize; //フォントサイズ /* msgSpeedは一文字を、lineSpeedは次の行を表示するまでの時間 */ public float msgSpeed = 0.05f, lineSpeed = 0.5f; private GameObject objManager, objMsgWindow; private GameObject[] objTextMsg = new GameObject[2]; private Transform trfCanvas; private Text[] textMessage = new Text[2]; private string msgName; private string[] msg; private bool flg = false, flgStop = false, flgEom = true; private int charCount = 1, mLength = 0, lineCount = 0; private float timer = 0f; Queue<string> qName = new Queue<string>(); Queue<string[]> qMsg = new Queue<string[]>(); // Use this for initialization void Start () { trfCanvas = GameObject.Find("Canvas").transform; } /* メッセージがあるとtrueなければfalseを返す */ public bool MessageEnd { get { return flgEom; } } public void CreateMsg(string mName, string[] message) { qName.Enqueue(mName); qMsg.Enqueue(message); } private void CreateWindow() { flgEom = false; string mName = qName.Dequeue(); msg = qMsg.Dequeue(); mLength = msg.Length; if (mName != "system") { msgName = mName + "」"; } else { msgName = mName; } objMsgWindow = (GameObject)Instantiate(preMessageWindow, Vector3.zero, Quaternion.identity, trfCanvas); objMsgWindow.transform.localPosition = windowPosition; RectTransform rectMsgWindow = objMsgWindow.GetComponent<recttransform>(); rectMsgWindow.sizeDelta = windowSize; objMsgWindow.transform.localScale = new Vector3(1f, 1f, 1f); objTextMsg[0] = (GameObject)Instantiate(preText, Vector3.zero, Quaternion.identity, trfCanvas); objTextMsg[0].transform.localPosition = new Vector3(windowPosition.x + textOffset.x, windowPosition.y + textOffset.y, 0f); objTextMsg[0].transform.localScale = new Vector3(1f, 1f, 1f); RectTransform rText = objTextMsg[0].GetComponent<recttransform>(); rText.sizeDelta = textAreaSize; textMessage[0] = objTextMsg[0].GetComponent<text>(); textMessage[0].text = ""; textMessage[0].fontSize = fontSize; textMessage[0].lineSpacing = textSpacing; objTextMsg[1] = (GameObject)Instantiate(preText, Vector3.zero, Quaternion.identity, trfCanvas); objTextMsg[1].transform.localPosition = new Vector3(0f, windowPosition.y - windowSize.y / 2 + fontSize + 2, 0f); objTextMsg[1].transform.localScale = new Vector3(1f, 1f, 1f); textMessage[1] = objTextMsg[1].GetComponent<text>(); textMessage[1].text = ""; textMessage[1].alignment = TextAnchor.LowerCenter; textMessage[1].fontSize = fontSize - 4; if(msgName != "system") textMessage[0].text = msgName; flg = true; } /* 会話表示 */ void WriteMessage() { timer += Time.deltaTime; int nextLine = (lineCount + 1) % lineNumber; if (timer > msgSpeed) { if (lineCount != mLength) { if (charCount <= msg[lineCount].Length) { textMessage[0].text = textMessage[0].text + msg[lineCount].Substring(charCount - 1, 1); charCount += 1; timer = 0; if(preSndMessage != null) Instantiate(preSndMessage, Vector3.zero, Quaternion.identity); } else if (nextLine != 0) { charCount = 1; lineCount += 1; timer = -1f * lineSpeed; textMessage[0].text += "\n "; } else if (nextLine == 0 && charCount > msg[lineCount].Length) { lineCount += 1; if(lineCount != mLength) { textMessage[1].text = "▼"; flgStop = true; } } } else { flg = false; } } } /* システムメッセージ */ void SystemMessage() { timer += Time.deltaTime; int nextLine = (lineCount + 1) % lineNumber; if (timer > lineSpeed) { if (lineCount + 1 != mLength) { if (nextLine != 0) { textMessage[0].text = textMessage[0].text + msg[lineCount] + "\n"; lineCount += 1; } else { if (lineCount + 1 != mLength) { textMessage[0].text = textMessage[0].text + msg[lineCount]; textMessage[1].text = "▼"; lineCount += 1; flgStop = true; } } timer = 0; } else { textMessage[0].text = textMessage[0].text + msg[lineCount]; flg = false; } } } private void Main() { if (!flg && qName.Count > 0 && objMsgWindow == null) { CreateWindow(); } if (flg == true) { if (!flgStop) { if (msgName != "system") { WriteMessage(); } else { SystemMessage(); } } if (Input.GetKeyDown(KeyCode.Space) && flgStop) { timer = -1f; charCount = 1; textMessage[0].text = ""; if (msgName != "system") textMessage[0].text = msgName; textMessage[1].text = ""; flgStop = false; if(preSndNextMessage != null) Instantiate(preSndNextMessage, Vector3.zero, Quaternion.identity); } } else if (flg == false) { if (Input.GetKeyDown(KeyCode.Space) && objMsgWindow != null) { charCount = 1; lineCount = 0; timer = 0; if(qName.Count == 0) flgEom = true; if (preSndNextMessage != null) Instantiate(preSndNextMessage, Vector3.zero, Quaternion.identity); Destroy(objMsgWindow); Destroy(objTextMsg[0]); Destroy(objTextMsg[1]); } } } // Update is called once per frame void Update() { Main(); } } </text></text></recttransform></recttransform></string[]></string[]></string></string> |
使い方
先ほどのScriptを適当なゲームオブジェクトにドラック&ドロップでアタッチします。ゲームオブジェクトの名前をCreateMessageに変更します。
preMessageWindowへCreate→UI→Imageで作成し、メッセージウィンドウ用のゲームオブジェクトを、preTextにはCreate→UI→Textで作成したゲームオブジェクトprefabeにし、ドラック&ドロップで指定します。これらを。さらに、preSndMessageには一文字表示した際に再生する効果音を、preSndNextMessageには次のメッセージを表示する際に再生する効果音のprefabを指定します。Create→Audio→Audio Soruceから作成できます。
※効果音はなくても問題ありません。
次に新しく下記のようなScriptを作成します。
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 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class MessageTest : MonoBehaviour { private CreateMessage createMessage; private bool flg = true; // Use this for initialization void Start () { GameObject obj; obj = GameObject.Find("CreateMessage"); if (obj != null) createMessage = obj.GetComponent<CreateMessage>(); } // Update is called once per frame void Update () { if (flg) { string[] msg = { "テストメッセージ", "テストメッセージ", "テストメッセージ", "テストメッセージ", "テストメッセージ" }; createMessage.CreateMsg("あああ", msg); createMessage.CreateMsg("system", msg); flg = false; } if (createMessage.MessageEnd) { Debug.Log("メッセージは表示されていません。"); } else { Debug.Log("メッセージは表示されています。"); } } } |
createMessage.CreateMsg(名前, 表示するメッセージ)でメッセージを表示することができます。通常は一文字ずつ表示されますが、名前の部分にsystemと入力すると、一行ずつ表示されるようになります。また、表示したいメッセージはString型の配列を指定します。また、createMessage.MessageEndでメッセージが表示されているか否かを判別できます。
新しくゲームオブジェクトを作成し、このScriptをアタッチし、実行するとメッセージが表示されます。
バグ等、何かありましたらコメントもしくはお問い合わせいただけると幸いです。
-
前の記事
メッセージウィンドウの作り方 2018.06.16
-
次の記事
メッセージを表示するScript2 2018.07.22
コメントを書く