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

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

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

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

Unity

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

Q&A

解決済

1回答

1974閲覧

親オブジェクトのスクリプト内の変数を参照したい

Melipofolia

総合スコア6

C#

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

Unity

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

0グッド

0クリップ

投稿2020/04/11 02:54

親オブジェクトにアタッチされたスクリプトの変数が子オブジェクトにアタッチされたスクリプトに反映されない問題が起きています。何かを間違えていることによると思いますが、具体的にそれが何かが分かりません。

これらはすべてヒエラルキー上のオブジェクトにアタッチされています。
また、該当の変数が絡まない部分をすべて省略しましたが、必要であれば追記します。

C#

1親オブジェクトのスクリプト 2public class Ichika_player : PlayerStandard 3{ 4 //参照したい変数、これを用いた処理は未実装 5 [System.NonSerialized] public int Ichikahitcount; 6 7 //以下略 8} 9 10親オブジェクトのスクリプトの継承元 11public class PlayerStandard : MonoBehaviour 12{ 13 // 中略 14 15 //参照したい変数、これを用いた処理は未実装 16 public float Power; 17 18 //参照したい変数 19 public int MSholdtime; 20 21 void Update() 22 { 23 //MSholdtimeに関する処理 24 if (Input.GetKey(KeyCode.Z)) //MSキー押下状態の管理 25 { 26 MSholdtime++; //押されている間ずっとカウントアップ 27 } 28 else 29 { 30 MSholdtime = 0; //押されていない場合はずっと0 31 } 32  } 33} 34 35 36子オブジェクトのスクリプト 37public class Ichika_shotposition : MonoBehaviour 38{ 39 //本体 40 public GameObject Player; 41 42 //撃つショット 43 public GameObject shot; 44 45 //親オブジェクトからとりたい変数を保存 46 public int MSholdtime; 47 public int Hit; 48 public float Power; 49 50 // Start is called before the first frame update 51 void Start() 52 { 53     //ここで親を取得 54 GameObject Player = this.transform.parent.gameObject; 55 //親オブジェクトのスクリプトから参照したい変数を代入 56 MSholdtime = Player.GetComponent<Ichika_player>().MSholdtime; 57 Hit = Player.GetComponent<Ichika_player>().Ichikahitcount; 58 Power = Player.GetComponent<Ichika_player>().Power; 59 } 60 61 // Update is called once per frame 62 void Update() 63 { 64 //ここで使いたい、2で割ったあまりが1の時ショットを撃つ 65 if (MSholdtime % 2 == 1) 66 { Instantiate(shot, transform.position, transform.rotation); } 67 }

補足
//親オブジェクトのスクリプトから参照したい変数を代入 という部分を、
Start()に記述すると親と子のMSholdtimeがZキーを入力しても0になるがエラーが出ないことと、
Update()に記述すると子のMSholdtimeだけがZキーを入力しても0になり、以下のエラーが出ることを確認しています

UnassignedReferenceException: The variable Player of Ichika_shotposition has not been assigned.

You probably need to assign the Player variable of the Ichika_shotposition script in the inspector.>

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

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

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

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

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

guest

回答1

0

ベストアンサー

GameObject Player = this.transform.parent.gameObject;
だとStart()内でしか使えないローカル変数に代入してるので、GameObject の部分を削除してください。
また、GetComponentはあまり軽い処理ではなく、見栄えも悪いのでStart内で1回だけ使うようにしましょう。

c#

1 //本体 2 public Ichika_player Player; 3 4 //撃つショット 5 public GameObject shot; 6 7 //親オブジェクトからとりたい変数を保存 8 public int MSholdtime; 9 public int Hit; 10 public float Power; 11 12 // Start is called before the first frame update 13 void Start() 14 { 15     //ここで親を取得 16 Player = this.transform.parent.gameObject.GetComponent<Ichika_player>(); 17 } 18 19 // Update is called once per frame 20 void Update() 21 { 22 //親オブジェクトのスクリプトから参照したい変数を代入 23 MSholdtime = Player.MSholdtime; 24 Hit = Player.Ichikahitcount; 25 Power = Player.Power; 26 27 //ここで使いたい、2で割ったあまりが1の時ショットを撃つ 28 if (MSholdtime % 2 == 1) 29 { Instantiate(shot, transform.position, transform.rotation); } 30 }

投稿2020/04/11 03:48

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Melipofolia

2020/04/11 04:35

ありがとうございます。無事に動きました。 追加で、非常に初歩的ですが1点質問です。 public Ichika_player Player; の部分の、Ichika_playerはどのような意味を持っているのでしょうか。
退会済みユーザー

退会済みユーザー

2020/04/11 04:59

Ichika_player型の変数という意味です。 public GameObject Player;とするとPlayerにゲームオブジェクトを入れられますが、 public Ichika_player Player;とすると、 なにかしらのゲームオブジェクトにアタッチされているIchika_playerコンポーネントを入れられます。 なので、 Player = this.transform.parent.gameObject.GetComponent<Ichika_player>(); を削除しても、インスペクタービューでIchika_shotpositionのPlayerの項目に 親オブジェクトをドラッグアンドドロップすれば、アタッチできます。
Melipofolia

2020/04/11 05:08

GameObjectという型は存在するからコンポーネントの格納には使えない。 一方でIchika_playerという型は存在しないから、定義すればコンポーネントの格納に使える変数の型になる。 というイメージでしょうか。
退会済みユーザー

退会済みユーザー

2020/04/11 06:03

そうです 自分で定義したクラスもコンポーネントとして扱われます
Melipofolia

2020/04/11 06:16

ありがとうございました。 この形の宣言方法をずっと疑問に思っていたのでスッキリしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問