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

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

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

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

872閲覧

UnityC#メッセージウィンドウがうまくいかない

ssssggg

総合スコア40

C#

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

1グッド

0クリップ

投稿2019/03/06 13:30

編集2019/03/06 22:23

Unity(2018)、C#を使用しています。

Unityで、UI"Text"を使用したメッセージウィンドウを制作しているのですがうまくいきません。コードに問題があるみたいです。どう改善すればよろしいでしょうか?

Textに決められた台本の内容を1文字ずつ入力していき最終的にTextと台本のstring変数が同じになるのが理想なのですが、現在のコードで実行すると、Textに最初に台本が丸ごと表示されて、その後一文字ずつ消えていってしまいます。

下のコードを例に挙げると、シーンを開始すると、最初にTextに”入力したい文字”と表示され、その後、時間が経過するごとに”力したい文字””したい文字”という風に一文字ずつ消えていくのが現状です。最初に,"入"と表示され、時間が経過するごとに"入力"、”入力し"という風に一文字ずつ表示されていき、最終的に、"入力したい文字"と表示されるのが理想です。

回答の際には書き直した部分のコードの提示をお願いします。

上記の文には文法がおかしい部分が多々あると思いますが目をつぶっていただけたら幸いです。

コード
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Message : MonoBehaviour
{
public GameObject messagewindow = null;
string daihon = "入力したい文字";
int n = 0;
float t = 0f;
// Update is called once per frame
void Update()
{
t += Time.deltaTime;
n = (int)Mathf.Floor(t * daihon.Length);
string k = daihon.Substring(n);
Text messagewin = messagewindow.GetComponent<Text>();
messagewin.text = k;
}
}

bochan2👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sakura_hana

2019/03/06 14:44

後ろから1文字ずつ消えていきます?前からではなくて?(このコードだと「入力したい文字→力したい文字→したい文字」だと思うのですが)
ssssggg

2019/03/06 22:24

ご指摘ありがとうございました。 修正いたしました。
guest

回答1

0

ベストアンサー

1文字ずつ削れていくっていうのはSubstringの引数が1個だけなのでインデックス番号n(n+1文字目)から最後まで切り取る感じになっているからじゃないでしょうか。

daihon.Substring(3); だとdaihonのインデックス番号3から最後までを切り出します。
先頭からインデックス番号nまで切り出したい場合などは、daihon.Substring(0,n) でインデックス番号0(先頭)からインデックス番号nまでと引数2つ使って明示的に指定してあげると良さそうです。

コルーチン使ったほうがスムーズにいきそうなのでそっちで書いてみたサンプルと、提示されたコードを修正したもの2つを載せておきます。

C#

1 Text messagewindow; 2 string daihon = "入力したい文字"; 3 4 private void Start() { 5 6 messagewindow = GetComponent<Text>(); // アタッチされたTextコンポーネントを参照 7 8 // OutputMessage というコルーチンを daihon を引数に実行 9 StartCoroutine("OutputMessage", daihon); 10 } 11 12 13 // OutputMessage 引数 string 14 IEnumerator OutputMessage(string msg) { 15 16 // 引数でもらった文字列の文字数分繰り返し 17 for (int i = 0; i <= msg.Length; i++) { 18 var outputText = msg.Substring(0, i); // 先頭からi文字目を切り出す 19 messagewindow.text = outputText; // テキストに反映 20 yield return new WaitForSeconds(1); // 1秒待つ 21 } 22 23 24 }

ちなみに最初に提示されたコードを直す場合はこんな感じでいかがでしょうか。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class test : MonoBehaviour 7{ 8 9 public GameObject messagewindow = null; 10 string daihon = "入力したい文字"; 11 int n = 0; 12 float t = 0f; 13 // Update is called once per frame 14 void Update() { 15 t += Time.deltaTime; 16 n = (int)Mathf.Floor(t * daihon.Length); 17 18 // 条件かけないと文字数文以上もやってしまうので応急処置 19 if (n <= daihon.Length) { 20 string k = daihon.Substring(0, n); // 引数1でインデックス番号0、つまり文字列の先頭を指定 21 Text messagewin = GetComponent<Text>(); 22 messagewin.text = k; 23 } 24 25 } 26 27} 28

投稿2019/03/07 00:54

編集2019/03/07 01:08
hogefugapiyo

総合スコア3302

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問