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

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

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

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

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

Unity

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

Q&A

解決済

1回答

855閲覧

Stringに変数を埋め込み、さらにその変数を別のクラスから変更する方法

FujiBayashi

総合スコア19

C#

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

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

Unity

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

0グッド

0クリップ

投稿2021/11/10 02:18

編集2021/11/10 02:29

実現したいこと

実現したいことが二つあります。

一.Stringに変数を埋め込みたい。
二.埋め込んだ変数を別のクラスから変更したい。

前提条件(実行環境)

Canvas内にTextオブジェクトを置き、「TestTextScript」コンポーネントを持たせています。
また、カラのGameObjectに「SetHensuu」コンポーネントを持たせています。

イメージ説明

TestTextScript」の中身を次のようにして、

C#

1using System; 2using UnityEngine; 3using UnityEngine.UI; 4 5public class TestTextScript : MonoBehaviour 6{ 7 static int hensuuint = 111; 8 static string hensuuString = "あいうえお"; 9 string testTextString = $"数字は{hensuuint}、文字列は{hensuuString}。"; 10 11 private void Start() 12 { 13 this.GetComponent<Text>().text = testTextString; 14 } 15}

実行すると、次のようになります。

イメージ説明

ここまでは問題ない…ような気がします。

試したこと、発生している問題

この状態で「SetHensuu」スクリプトの中身を次のように書きます。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class SetHensuu : MonoBehaviour 6{ 7 public TestTextScript tts; 8 9 void Start() 10 { 11 tts.hensuuint = 999; 12 tts.hensuuString = "かきくけこ"; 13 } 14}

すると、
インスタンス参照でメンバー'TestTextScript.hensuuint'にアクセスできません。代わりに型名を使用してください
のエラーが発生します。
イメージ説明

変数がpublicになっていないからかな?と思い「TestTextScript」の変数に「public」を付けても、

C#

1 public static int hensuuint = 111; 2 public static string hensuuString = "あいうえお";

同じエラーが発生したままでした。

「static」が良くないのかな?と思い「TestTextScript」の変数から「static」を削除すると、

C#

1 public int hensuuint = 111; 2 public string hensuuString = "あいうえお";

今度は
フィールド初期化子は、静的でないフィールド、メソッド、またはプロパティ'TestTextScript.hensuuint'を参照できません
という新たなエラーが発生しました。

イメージ説明

補足情報

わざわざ「Stringに変数を埋め込む」なんてことをしたい理由は、
作品をローカライズ(多言語対応)する目的があることから
文字列どうしをくっつける方法ではなく、どうしても埋め込み変数で対応する必要があるためです。

この問題については根本的なことを解っていないような気がしており恐縮なのですが、
調べ方が悪いのか、恥ずかしながら原因や解決方法がわからない状況です…。

もしわかるかたがいらっしゃいましたら、ご教授いただければ幸いです。
よろしくお願いいたします。

※使用ソフト
Unity 2021.2.0f1 Personal
Microsoft Visual Studio Community 2019 Version 16.11.4

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

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

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

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

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

KoichiSugiyama

2021/11/10 02:24

見間違いだったらすみませんが、TestTextScript クラスには'''testHensuuint'''や'''testHensuuString'''というメンバはありません。どこで"test"が入ってきたんでしょうか?確認してみてください。
FujiBayashi

2021/11/10 02:30

大変失礼しました。質問を作る過程でおかしなことになっていました。 前提となるスクリプトの内容と、発生するエラーの文言を修正しました。
guest

回答1

0

ベストアンサー

まずこちら(1,2)の場合

static宣言した場合は

C#

1TestTextScript.hensuuint = 999; 2TestTextScript.hensuuString = "かきくけこ";

といった感じで型名でのアクセスになります。
なので、「インスタンス参照でメンバー'TestTextScript.hensuuint'にアクセスできません。代わりに型名を使用してください」とえらーになります。

3の場合ですが、フィールド変数の初期化時はstatic宣言した変数、もしくは定数しか使用できません。
なので、hensuuint等からstaticを取り除いたことによりエラーとなります。

ただ、最終的な目的がローカライズなのでしたら、上記のようなソースですとtestTextStringも初期化時に文字列が決定してしまうので期待した結果にはならないでしょう。

C#

1 public static int hensuuint = 111; 2 public static string hensuuString = "あいうえお"; 3 string testTextString = $"数字は{hensuuint}、文字列は{hensuuString}。"; 4 // インスタンスが生成された時点でtestTextStringは"数字は111、文字列はあいうえお。"となる 5 6 private void Start() 7 { 8 hensuuint = 999; 9 hensuuString = "かきくけこ"; 10 11 // hensuuint、hensuuStringを変更しても 12 // testTextStringは"数字は111、文字列はあいうえお。"のまま 13 this.GetComponent<Text>().text = testTextString; 14 // このようにすべき 15 this.GetComponent<Text>().text = $"数字は{hensuuint}、文字列は{hensuuString}。"; 16 }

今一度「Unity ローカライズ」等で検索すれば、また違った楽な方法が見つかるかもしれません。

投稿2021/11/10 03:28

YAmaGNZ

総合スコア10258

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

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

FujiBayashi

2021/11/10 03:37

大変解りやすい解説をいただき、本当に本当にありがとうございます! 無事解決いたしました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問