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

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

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

変数は、プログラミングにおいて値や文字列などのデータを保持できる仕組みを指します。自由に名前を付けることができるため、管理しやすくなるのが特徴です。プログラムで変数の宣言を行い、値を代入して利用。保持したデータが通用する範囲でローカル変数とグローバル変数に分けられます。

C#

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

Unity

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

2回答

334閲覧

InputFieldで入力したプレイヤー名を変数として配列の要素に導入したい

Cotton_0829

総合スコア0

変数

変数は、プログラミングにおいて値や文字列などのデータを保持できる仕組みを指します。自由に名前を付けることができるため、管理しやすくなるのが特徴です。プログラムで変数の宣言を行い、値を代入して利用。保持したデータが通用する範囲でローカル変数とグローバル変数に分けられます。

C#

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

Unity

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2023/09/16 05:50

実現したいこと

・セリフにInputFieldで入力したプレイヤー名を導入したい

前提

unityでノベルゲームを作っています。
プレイヤー名はInputFieldで入力されたものを変数として扱い、セリフにくっつけようと思っています。
現在配列の要素にセリフを入れています。

発生している問題・エラーメッセージ

CS0236 フィールド初期化子は、静的でないフィールド、メソッド、またはプロパティ 'Object.name' を参照できません

該当のソースコード

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using TMPro; public class CommentDisplay1 : MonoBehaviour { string[] texts = {"テキスト0", "テキスト1", "テキスト2", "テキスト3", $"{name}さんですね!"};//Unity上で入力するstringの配列 int textNumber;//何番目のtexts[]を表示させるか string displayText;//表示させるstring int textCharNumber;//何文字目をdisplayTextに追加するか int displayTextSpeed; //全体のフレームレートを落とす変数 bool click;//クリック判定 bool textStop; //テキスト表示を始めるか public GameObject NameInput; public GameObject Comment1; InputField inputField; // Start is called before the first frame update void Start() { inputField = GameObject.Find("InputField").GetComponent<InputField>(); } // Update is called once per frame void Update() { if (textStop == false) //テキストを表示させるif文 { displayTextSpeed++; if (displayTextSpeed % 10 == 0)//5回に一回プログラムを実行するif文 { if (textCharNumber != texts[textNumber].Length)//もしtext[textNumber]の文字列の文字が最後の文字じゃなければ { displayText = displayText + texts[textNumber][textCharNumber];//displayTextに文字を追加していく textCharNumber = textCharNumber + 1;//次の文字にする } else//もしtext[textNumber]の文字列の文字が最後の文字だったら { if (textNumber != texts.Length - 1)//もしtexts[]が最後のセリフじゃないときは { if(textNumber == 3) { NameInput.SetActive(true); } else if (click == true)//クリックされた判定 { displayText = "";//表示させる文字列を消す textCharNumber = 0;//文字の番号を最初にする textNumber = textNumber + 1;//次のセリフにする } } else //もしtexts[]が最後のセリフになったら { if (click == true) //クリックされた判定 { Comment1.SetActive(false); } } } this.GetComponent<TextMeshProUGUI>().text = displayText;//画面上にdisplayTextを表示 click = false;//クリックされた判定を解除 } if (Input.GetMouseButton(0))//マウスをクリックしたら { click = true; //クリックされた判定にする } } } public void GetInputName() { //InputFieldからテキスト情報を取得する string name = inputField.text; //入力フォームのテキストを空にする inputField.text = ""; displayText = "";//表示させる文字列を消す textCharNumber = 0;//文字の番号を最初にする textNumber = textNumber + 1;//次のセリフにする NameInput.SetActive(false); } }

試したこと

int変数(textNumber)でも試してみましたが、エラーは直りませんでした。
配列の要素だと変数を入れられないのかなとも思っていますが、解決策が分かりません。

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

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

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

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

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

guest

回答2

0

メッセージの初期値として$"{name}さん"と変数を入れようと考えるのではなく
"[name]さん"と初期化しておき、表示する時にreplaceでdisplayText.Replace("[name]",name)といった感じで置き換えるとか名前を決定した時点で配列のデータをreplaceするとかしてはどうでしょうか。

投稿2023/09/16 10:13

YAmaGNZ

総合スコア10258

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

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

0

C#

1 string[] texts = {"テキスト0", "テキスト1", "テキスト2", "テキスト3", $"{name}さんですね!"};//Unity上で入力するstringの配列

上記の変数nameは不定なので、初期値に入れることは出来ません。
(配列云々とは全く関係ないです)
そのため$"{name}さんですね!"は初期値ではなく、後から代入する必要があります。

また、$"{name}さんですね!"はそのタイミングでのnameの値が使われます。
nameを変えれば勝手に変わってくれる、という機能ではありません。
さらに言ってしまえば、nameは関数内で定義されているので、この場合あなたの定義したnameではなく、元々あるObject.nameが使われています。
入力内容が変わるたびに毎回、$"{name}さんですね!"を代入する必要があります。

投稿2023/09/16 08:01

編集2023/09/16 08:25
fiveHundred

総合スコア9805

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

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

Cotton_0829

2023/09/16 12:12

回答ありがとうございます。 関数内で定義されると関数外で使用することはできないということでしょうか?別のスクリプトに受け渡せる変数にしたいのですが、どのように書き換えるのが正しいでしょうか?
fiveHundred

2023/09/16 12:22

> 関数内で定義されると関数外で使用することはできないということでしょうか? はい。そうです。 > 別のスクリプトに受け渡せる変数にしたいのですが、どのように書き換えるのが正しいでしょうか? 関数外でクラスの中にpublic付きで定義すればよいです。 しかし、(間際らしいことを言ってすいませんが)今回の場合はinputField.textを受け取ればいいだけですから、受け渡せる変数にする必要は全くありません。 問題なのは、「$"{name}さんですね!"」と初期化しようとしてしまっていることです。 何度も言いますが、変数は不定なのでこのような初期化は出来ません。 この部分を初期化出来るものに変更してください。
Cotton_0829

2023/09/16 13:20

$"[yourname]さんですね!" public void GetInputName() { //InputFieldからテキスト情報を取得する string yourname = inputField.text; displayText.Replace("[yourname]", yourname); //入力フォームのテキストを空にする inputField.text = ""; displayText = "";//表示させる文字列を消す textCharNumber = 0;//文字の番号を最初にする textNumber = textNumber + 1;//次のセリフにする NameInput.SetActive(false); } こちらで書き換えたのですが、 string yourname = inputField.text; と inputField = GameObject.Find("InputField(TMP)").GetComponent<InputField>(); の部分でNullReferenceのエラーコードがunity側で出てしまいました。 Inspectorの設定は間違っていないです。 また私の知識不足で申し訳ないのですが、関数内で定義した変数を関数外で定義するにはどういった書き方をすればよろしいでしょうか?
fiveHundred

2023/09/17 01:56

Find()に指定している「"InputField(TMP)"」が間違っているのではないでしょうか。 Find()は「名前が完全に一致しないと取得できない」「同じ名前のゲームオブジェクトが複数存在するケースを考慮していない」ため、基本的に避けたほうがいいでしょう。 今回の場合、「inputField」に「[SerializeField]」か「public」を付けて、インスペクター上でinputFieldを指定するのがよいと思います(この場合、「inputField = GameObject.Find("InputField(TMP)").GetComponent<InputField>();」は不要です)。 > また私の知識不足で申し訳ないのですが、関数内で定義した変数を関数外で定義するにはどういった書き方をすればよろしいでしょうか? C#では動的に変数を定義することはできないので、最初から関数外で定義するしかありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問