unityで、流れるテキスト表示をしたいと思っています。
とりあえずこのサイトを参考にしました。
参考にしたサイト
で、呼び出す側に問題があったので、そのスクリプトも書いておきます。
どういうことを実現したいかというと、建造物(タグ house)に触れたかつzキーが押された時に、文字を表示するというものです。文字を表示している最中でzキーが押される場合を想定して、キーが押されたのを検知した瞬間、コライダーがオフになるようにしてあります。
しかし、メッセージ"こおりでできたいえだ。"を3回表示した後、"おや?かゆいところがあるようだ"を表示するまで、文字が一文字ずつ出ず、いっぺんに表示されてしまいます。
メッセージ関数が何回も呼び出されてしまっているからかと思いましたが、
それらしい部分は見当たりませんでした。
どうしたらいいですか?
スクリプト メッセージ
using UnityEngine; using System.Collections; using UnityEngine.UI; using System.Text.RegularExpressions; public class Message : MonoBehaviour { // メッセージUI private Text messageText; // 表示するメッセージ [SerializeField] [TextArea(1, 20)] private string allMessage; // 使用する分割文字列 [SerializeField] private string splitString = "<>"; // 分割したメッセージ private string[] splitMessage; // 分割したメッセージの何番目か private int messageNum; // テキストスピード [SerializeField] private float textSpeed = 0.05f; // 経過時間 private float elapsedTime = 0f; // 今見ている文字番号 private int nowTextNum = 0; // マウスクリックを促すアイコン private Image clickIcon; // クリックアイコンの点滅秒数 [SerializeField] private float clickFlashTime = 0.2f; // 1回分のメッセージを表示したかどうか private bool isOneMessage = false; // メッセージをすべて表示したかどうか private bool isEndMessage = false; void Start() { clickIcon = transform.Find("Panel/Image").GetComponent<Image>(); clickIcon.enabled = false; messageText = GetComponentInChildren<Text>(); messageText.text = ""; } void Update() { // メッセージが終わっているか、メッセージがない場合はこれ以降何もしない if (isEndMessage || allMessage == null) { return; } // 1回に表示するメッセージを表示していない if (!isOneMessage) { // テキスト表示時間を経過したらメッセージを追加 if (elapsedTime >= textSpeed) { messageText.text += splitMessage[messageNum][nowTextNum]; nowTextNum++; elapsedTime = 0f; // メッセージを全部表示、または行数が最大数表示された if (nowTextNum >= splitMessage[messageNum].Length) { isOneMessage = true; } } elapsedTime += Time.deltaTime; // メッセージ表示中にマウスの左ボタンを押したら一括表示 if (Input.GetKeyDown(KeyCode.Z) { // ここまでに表示しているテキストに残りのメッセージを足す messageText.text += splitMessage[messageNum].Substring(nowTextNum); isOneMessage = true; } // 1回に表示するメッセージを表示した } else { elapsedTime += Time.deltaTime; // クリックアイコンを点滅する時間を超えた時、反転させる if (elapsedTime >= clickFlashTime) { clickIcon.enabled = !clickIcon.enabled; elapsedTime = 0f; } // マウスクリックされたら次の文字表示処理 if (Input.GetKeyDown(KeyCode.Z){ nowTextNum = 0; messageNum++; messageText.text = ""; clickIcon.enabled = false; elapsedTime = 0f; isOneMessage = false; // メッセージが全部表示されていたらゲームオブジェクト自体の削除 if (messageNum >= splitMessage.Length) { isEndMessage = true; transform.GetChild(0).gameObject.SetActive(false); } } } } // 新しいメッセージを設定 void SetMessage(string message) { this.allMessage = message; // 分割文字列で一回に表示するメッセージを分割する splitMessage = Regex.Split(allMessage, @"\s*" + splitString + @"\s*", RegexOptions.IgnorePatternWhitespace); nowTextNum = 0; messageNum = 0; messageText.text = ""; isOneMessage = false; isEndMessage = false; } // 他のスクリプトから新しいメッセージを設定しUIをアクティブにする public void SetMessagePanel(string message) { SetMessage(message); transform.GetChild(0).gameObject.SetActive(true); } }
スクリプト 呼び出す側
using System.Collections; using System.Collections.Generic; using UnityEngine; public class NewBehaviourScript : MonoBehaviour { const float value = 0.1f; bool moving = true; public float speed = 6.0F; //歩行速度 public float jumpSpeed = 8.0F; //ジャンプ力 public float gravity = 20.0F; //重力の大きさ public float rotateSpeed = 3.0F; //回転速度 private float mX, mY; private CharacterController controller; private Vector3 moveDirection = Vector3.zero; private float h,v; Animator animator; public AudioClip footsteps; protected AudioSource audioSource; [SerializeField] AudioClip[] clips; [SerializeField] bool randomizePitch = true; [SerializeField] float pitchRange = 0.1f; int coliderchecker = 0; public bool flag = false; bool atatta = false; [SerializeField] private Message messageScript; int housetime; public int icegold = 0; // Use this for initialization void Start () { controller = GetComponent<CharacterController>(); animator = GetComponent<Animator>(); audioSource = GetComponents<AudioSource>()[0]; } // Update is called once per frame void Update () { if(moving == true) { h = Input.GetAxis ("Horizontal"); v = Input.GetAxis ("Vertical"); } moveDirection = new Vector3 (h, 0, v); //moveDirection = transform.TransformDirection(moveDirection); moveDirection *= speed * 3.0f; moveDirection.y -= gravity * Time.deltaTime; controller.Move(moveDirection * Time.deltaTime); if (Input.GetKeyDown(KeyCode.Z)) { if(flag == true) { } if(flag == false) { GetComponent<BoxCollider>().enabled = true; if(coliderchecker == 1) { housetime++; flag = true; if(housetime < 4) { messageScript.SetMessagePanel ("こおりでできたいえだ"); } if(housetime == 4) { messageScript.SetMessagePanel ("おや?かゆいところがあるようだ。"); } if(housetime == 5) { messageScript.SetMessagePanel ("かゆいところをかいてあげた・・・<>いえは よろこんでいるみたいだ。\nいえは おれいに アイスゴールドを 20こ くれた!"); icegold =+ 20; } GetComponent<BoxCollider>().enabled = false; } } } } void OnCollisionStay(Collision collision) { atatta = true; } void OnTriggerEnter(Collider other) { if (other.gameObject.tag == "house") { coliderchecker = 1; } else if (other.gameObject.tag == "store") { coliderchecker = 2; } } void OnTriggerExit(Collider other) { coliderchecker = 0; } void OnCollisionExit(Collision collision) { atatta = false; } }
回答2件
あなたの回答
tips
プレビュー