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

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

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

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Q&A

解決済

1回答

1803閲覧

質問:子オブジェクトの変数を親のスクリプトの変数に代入する方法について

Yamatake

総合スコア13

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

0グッド

1クリップ

投稿2019/01/22 04:19

こんにちわ。
初めて投稿する者です。
現在、Unityで3Dオブジェクトのスイッチ(左・右・中央)に乗ると対応する3Dオブジェクトのアニメーションが発生するシステムを作っています。

そこで、スイッチ(左・右・中央)のスクリプトにある変数を親のスクリプトにある変数に代入するスクリプトを作りました。
しかしコンソールから「NULL」と表記されてしまいます。
どこが間違っているか分からないので、ご教示頂けたら幸いです。

ハイラキーの構造(一つの親に三つの子が並列して並んでいます。)
「Goal」(親)
→「Left Switch」(子)
→「Right Switch」(子)
→「Top Switch」(子)

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

親オブジェクト内に格納されている変数「name」がNULLと表示されてしまう。

該当のソースコード

<親オブジェクトのソースコード> using System.Collections; using System.Collections.Generic; using UnityEngine; public class Goal : MonoBehaviour { public GameObject player; [SerializeField] Animator[] animator; public GameObject[] switches; //ここで「Null」と出る。 private string name; void Start() { name = ""; } //親オブジェクトのアニメーションを再生 public void activateGate() { print(name); switch (name) { case "left": animator[0].SetBool("Unlock", true); break; case "right": animator[1].SetBool("Unlock", true); break; case "top": animator[2].SetBool("Unlock", true); break; } } } <子オブジェクトのソースコード>(三つの子オブジェクトすべてにアタッチされています。) using System.Collections; using System.Collections.Generic; using UnityEngine; public class GateSwitch : MonoBehaviour { public string switchName; public GameObject player; // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } private void OnTriggerEnter(Collider other) { if (other.gameObject == player) { print("you touched "+switchName);        //下記から親オブジェクトの変数「name」に「switchName」の文字を代入するスクリプトと親オブジェクトのアニメーションを起動するスクリプト gameObject.GetComponentInParent<Goal>().name = switchName; gameObject.GetComponentInParent<Goal>().activateGate(); } } }

試したこと

子オブジェクトのトリガーが起動することは確認できました。

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

「private」な変数には外部からアクセス出来ません。
public string name;にすれば多分動きます。

(その他余談)
・「name」はGameObjectでも使われている変数名なので、出来れば別の名前にした方がいいです。(誤用の可能性がある為)
GetComponentInParentを衝突の度に呼ぶのは負荷が掛かります。クラス変数に入れた方がいいです。(1回しか衝突しないことが保証されているならこれでもOK)
・質問にエラーメッセージを記載する時は、翻訳等せずそのままコピペした方がいいです。(今回は正しい解釈ですが、「英語で表示されているエラー文の独自解釈が間違っていて解決出来ない」みたいなケースも考えられる為)

投稿2019/01/22 04:53

sakura_hana

総合スコア11425

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

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

Yamatake

2019/01/22 05:12

ご回答ありがとうございます。 試してみます。
Yamatake

2019/01/22 05:29

試し化結果、問題なく動作しました。 ただ、publicにすると何かの拍子にinspectorに書き込んでしまう恐れがあるかもしれませんので、下記のように親の変数を下記のように直しましたが、’GetSwitchName’はメゾットグループのため割り当てることができませんと出てしまいます。 どうすればよろしいでしょうか? private string SwitchName; public string GetSwitchName() { return SwitchName; }
sakura_hana

2019/01/22 05:43 編集

呼び方が悪いのではないでしょうか? gameObject.GetComponentInParent<Goal>().GetSwitchName() = switchName; もしこうやっているなら、エラーになります。 もしメソッドで書くなら public void SetSwitchName (string str) { SwitchName = str; } gameObject.GetComponentInParent<Goal>().SetSwitchName(switchName); こんな感じ。 後は「unity セッター ゲッター」で調べると別の書き方も出ます。 なお「unity public インスペクタ 非表示」などでググると出て来るのですが [HideInInspector] public string name; または [System.NonSerialized] public string name; で、publicな状態でもインスペクタ上から表示が消えます。 http://pafu-of-duck.hatenablog.com/entry/2017/11/02/182306 メソッドとどちらがいいかはお好みでどうぞ。
Yamatake

2019/01/22 06:16

すいません。 下記のスクリプトを親に記載して、 public void SetSwitchName (string str) { SwitchName = str; } 下記のスクリプトを子のスクリプトに入れるとNullと出ます。 gameObject.GetComponentInParent<Goal>().SetSwitchName(switchName); どうすればよろしいでしょうか?
Yamatake

2019/01/22 06:21

すいません。 下記のように変更して、解決しました。 gameObject.GetComponentInParent<Goal>(). ↓ transform.parent.GetComponent <Goal> ().
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問