質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

解決済

RPGの流れるテキスト表示のエラー

suika_people
suika_people

総合スコア14

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

2回答

-1評価

0クリップ

668閲覧

投稿2021/10/22 10:55

編集2021/10/26 13:07

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; } }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

SurferOnWww
SurferOnWww

2021/10/22 11:17

何はともあれ、コードは ``` と ``` で囲ってください(``` はバッククォート 3 つ)。
y_waiwai
y_waiwai

2021/10/22 11:40

このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
suika_people
suika_people

2021/10/22 13:14

できました!すみません。。
mimi_no_naka
mimi_no_naka

2021/10/24 14:29 編集

エラーが出ているのがこのコードでは無いのであれば質問文を編集してその部分を記載して下さい 他の人の回答でのやり取りを拝見する限り現状真面目に問題解決しようとしている態度に思えません YOshimさんの回答でのコメントで「呼び出す側にも~」とエラー箇所が複数あるように見受けられますが複数個所あるならばその旨の記載もして下さい

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。