スクリプトを貼りけるための空のオブジェクトの作成
Create → CreateEmptyをおします
名前をMessageControllerにします
会話機能のスクリプトの作成
Messageという名前のスクリプトを作成し、以下のスクリプトを入力します
/
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という名前のスクリプトを作成し、以下のスクリプトを入力します
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を入力します
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キーをおすと、それぞれ別の会話が表示されます
キャラクターに触れた時や、目的地に着いた時など条件を変えてみてください
コメント
コメント一覧 (1件)
[…] 会話機能 […]