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

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

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

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

Unity

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

Q&A

解決済

1回答

6807閲覧

Unity2Dで他スクリプトから変数が参照できません。

SocketWrench255

総合スコア5

C#

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

Unity

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

0グッド

0クリップ

投稿2020/02/02 11:52

前提・実現したいこと

Unity2Dで単語カードのようなものを作っています。
仕組みとしてはランダムで単語の画像を表示し、入力フォームでユーザが入力したものと答えが一致すれば正解の表示、一致しなければ失敗を表示するといったものを作りたいと思っています。
画像をランダムで表示する部分はUnityのTrain機能を使用し、空のオブジェクトにランダムでPrefabを呼び出すといった方法をとりました。
参考にしたページ→https://qiita.com/maki0321/items/cb01fb4ee8cf0a6bbafe

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

現在困っているのは、このランダムで画像を表示したときの乱数を代入した変数を入力フォームのスクリプトから参照して、入力された単語がその画像に対する答えと一致するか比較するといった処理を行おうとしたところ、下記のようなエラーメッセージが表示されてしまい、変数の参照ができないことです。

Asset\Script\KanjiScript(18,5): error CS0106: The modifier 'public' is not valid for this item

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class KanjiScript : MonoBehaviour 6{ 7 8 //GameObjectの配列を宣言 9 public GameObject[] Train; 10 11 void Start() 12 { 13 //指定したオブジェクトの配列からランダムに一つ選んで生成 14 int kanjinumber = Random.Range (0, Train.Length); 15 Instantiate(Train[kanjinumber],transform.position,transform.rotation); 16 17 //取得用のkanjinumber変数を作成 18 public int GetKanjiNumber(){ 19 return kanjinumber; 20 } 21 22 //ランダムに選ばれたオブジェクト番号kanjinumberを表示 23 Debug.Log(kanjinumber); 24 25 } 26 27 void Update() 28 { 29 30 } 31}

入力フォームのソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class ImiScript: MonoBehaviour 7{ 8 //InputFieldを格納するための変数 9 InputField inputField; 10 11 // Start is called before the first frame update 12 void Start() 13 { 14 //InputFieldコンポーネントを取得 15 inputField = GameObject.Find("InputField").GetComponent<InputField>(); 16 } 17 18 //入力された名前情報を読み取ってコンソールに出力する関数 19 public void GetInputName() 20 { 21 //InputFieldからテキスト情報を取得する 22 string mean = inputField.text; 23 Debug.Log(mean); 24 25 KanjiScriptからkanjinumberを参照 26 int kNumber; 27 kNumber = KanjiScript.GetKanjiNumber(); 28 Debug.Log(kNumber); 29 30 //入力フォームのテキストを空にする 31 inputField.text = ""; 32 33 34 } 35 36 37} 38

試したこと

変数がグローバル化していないがために呼び出すことができないんだろうということで、下記のサイトの変数をpublicで宣言する、プロパティーを使う、上記のコードのように取得用の関数を作成するなど一通り試しましたがうまくいきませんでした。
https://qiita.com/Teach/items/8d1cdb90a3b533707c9a

補足情報(FW/ツールのバージョンなど)

Unity Ver: 2019.3.0f

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

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

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

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

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

guest

回答1

0

ベストアンサー

このソースコードでは関数の中で関数を定義しようとしています。
関数の中で関数を定義した場合、定義した関数の中でしか使用することができません。
そのため、publicにすると矛盾が生じ、エラーになるのだと思います。
(なお、変数も同じです)

なので、GetKanjiNumber()とその中で使われているkanjinumberをStart()の外で定義すればよろしいかと思います。

投稿2020/02/02 12:21

fiveHundred

総合スコア10152

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

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

SocketWrench255

2020/02/02 14:03

解答ありがとうございます。おかげで該当ソースの中の”//取得用のkanjinumber変数を作成”部分をStart()の外に作成することで変数のグローバル化することができました!しかし、まだ参照部分で躓いています。呼び出すためのコードをStart()の外に置いてみたりもしたのですが、別のエラーがいくつか発生してしまい、うまくいきません。入力フォームのソースコードそのままだとAn Object reference is required for the non-static field, method, or property …といったエラーが出ています。何が問題だと思いますか?
fiveHundred

2020/02/02 15:03

staticでなければ、「KanjiScript.~」という形で呼び出すことはできません。 この場合、KanjiScriptのインスタンスを何らかの方法で取得する必要があります。 取得する方法としては、FindObjectOfType()やGetComponent<>()など色々あるので調べて適宜使うようにしてください。
SocketWrench255

2020/02/03 03:58

ありがとうございます!勉強不足ゆえにそこの仕組みがよくわかっていませんでした。教えていただいたように、取得方法をしっかり調べて勉強してからもう一度挑戦してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問