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

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

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

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

スクロール

スクロールとは、ディスプレイスクリーン上において連続的にコンテンツが滑っていくことを指します。

Unity

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

Q&A

解決済

2回答

1748閲覧

Unity 親要素のスクリプトから子要素のスクリプトのpublic boolを取得したい

Kageyama_23457

総合スコア21

C#

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

スクロール

スクロールとは、ディスプレイスクリーン上において連続的にコンテンツが滑っていくことを指します。

Unity

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

0グッド

0クリップ

投稿2020/02/10 09:38

編集2020/02/15 02:23

★2月15日 自己解決したので書き換えました。

前提

Unity、C#ともに初心者なので不合理な点などあるかもしれませんが、一応自己解決したので反映しました。
Unityの3Dモードでタテスクロールの、障害物競争のようなゲームを作っています。
CPUに擬似AIのような挙動を取らせたく模索しております。
結局「親スクリプトから子スクリプトのboolを取得して、親スクリプトに挙動を記述し動かす」のではなく、
「子スクリプトから親オブジェクトを動かす」かたちになりました。

###構造
CPUキャラ(親)と、障害物やアイテム検知用の空のGameObject(子)があり、それぞれ
親:Rigidbody2D,collider2D,スクリプト「CPU」
子:collider2D(IsTrigger),スクリプト「Kenchi」 を持っています。

親スクリプト「CPU」※関係個所のみ抜粋

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class CPU : MonoBehaviour 6{ 7public GameObject Kenchi_Object;//インスペクタで各CPUキャラ専用の子オブジェクトを取得 8public float Speed;//インスペクタで各CPUキャラの通常時の移動速度を入力 9 10 void Start() 11 {} 12 void Update() 13 { 14 Kenchi kenchi=Kenchi_Object.GetComponent<Kenchi>();//子オブジェクトのスクリプトを取得 15 isKIBAKO=kenchi.IsKIBAKO();//子スクリプト内のboolを取得 16 } 17}

子スクリプト「Kenchi」※関係個所のみ抜粋

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Kenchi : MonoBehaviour 6{ 7 private GameObject Kenchi_Object; 8 public Rigidbody2D chara;//インスペクタで各親キャラを取得 9 public float Speed;//インスペクタで各親キャラの通常時の移動速度を入力(親スクリプトのものと同じにする) 10 11 private string kibakoTag = "kibako";//木箱(障害物)タグ 12 public bool hakken_kibako_E,hakken_kibako_S,hakken_kibako_X;//障害物タグとの当たり判定のbool 13 14 void Start() 15 { 16 Kenchi_Object = GetComponent<GameObject>();//自身のインスタンスを取得 17 CPU CPUScript=chara.GetComponent<CPU>();//現在は使用していませんが、とりあえず各親キャラのスクリプトを取得 18 } 19 20 public bool IsKIBAKO() 21 { 22 if(hakken_kibako_E||hakken_kibako_S) 23 { 24 isKIBAKO = true; 25 chara.velocity = new Vector2(1 * Speed,0);//親オブジェクトにx速度を与える。これでは不十分なので、ここの挙動は模索中です。 26 } 27 else if(hakken_kibako_X) 28 { 29 isKIBAKO = false; 30 chara.velocity = new Vector2(Speed, -1 * Speed);//通常に戻って走行 31 } 32 33 hakken_kibako_E = false; 34 hakken_kibako_S = false; 35 hakken_kibako_X = false; 36 return isKIBAKO; 37 } 38 39 private void OnTriggerEnter2D(Collider2D collision) 40 { 41 if (collision.gameObject.tag == "kibako") 42 { 43 hakken_kibako_E = true; 44 } 45 } 46 47 public void OnTriggerStay2D(Collider2D collision) 48 { 49 if (collision.gameObject.tag == "kibako") 50 { 51 hakken_kibako_S = true; 52 } 53 } 54 55 public void OnTrrigerExit2D(Collider2D collision) 56 { 57 if (collision.gameObject.tag == "kibako") 58 { 59 hakken_kibako_X = true; 60 } 61 } 62}

###参考サイト様
参考サイト様① 他オブジェクトのスクリプトを参照する方法について
参考サイト様② 親子オブジェクトの連結記述について

###実現したいこと
全て、以上に書いた「子スクリプトから親オブジェクトを動かす」という方法になるかとは思うのですが、
・前方に障害物があったら避ける
・前方に加速アイテムなど有益なアイテムがあったら取りに行く
など、擬似AIのような挙動を取らせたいです。
子スクリプト内のコメントにも書きましたが、現在の挙動ではまだまだ不十分なので模索を続けます。
ご覧くださいましてありがとうございました。

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

■作業環境
Mac Sierra10.12.6(4GB)
Unity2019.3.f06

■ここまで出来ていること
・プレイヤーキャラクターの移動(AddForce)及びアニメ遷移
・カメラのプレイヤー追従(y軸のみ)
・加速アイテム実装
・オブジェクトのランダム座標生成、及びランダムな方向への移動
・Gridを使いTileMapで背景を塗りました
・CPUキャラの親オブジェクトと検知用子オブジェクトの連携(当ページ)

ここまで同じゲームで質問させて頂き、解決に至るご教授を頂いておりますので、
そちらのページも貼っておきます。

加速アイテム実装
アイテムランダム生成、及びランダム移動

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

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

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

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

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

guest

回答2

0

自己解決

上記の通り「子スクリプトから親オブジェクトを動かす」というかたちを取ることにしました。

投稿2020/02/15 02:24

Kageyama_23457

総合スコア21

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

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

0

GetComponent<Kenchi>() がNULLを返してます
理由は、GetComponent は自分自身のオブジェクトの範囲でしか探さないので、
子オブジェクトにあるKenchiは引っ張ってきません

子オブジェクトも含めた範囲で探す場合は、GetComponentInChildren<Kenchi>() とします

投稿2020/02/10 09:56

izmktr

総合スコア2856

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

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

Kageyama_23457

2020/02/10 10:01

izmktr様 ありがとうございます。 ご教授頂いた通り書き換えたところ、依然ゲームは動くものの今度は別のエラーが出ました。 こちらについては何と言われているのか見当がつきません… ArgumentException: GetComponent requires that the requested component 'GameObject' derives from MonoBehaviour or Component or is an interface. UnityEngine.Component.GetComponentInChildren (System.Type t, System.Boolean includeInactive) (at /Users/builduser/buildslave/unity/build/Runtime/Export/Scripting/Component.bindings.cs:67) UnityEngine.Component.GetComponentInChildren[T] () (at /Users/builduser/buildslave/unity/build/Runtime/Export/Scripting/Component.bindings.cs:84) CPU.Start () (at Assets/script/CPU.cs:29)
izmktr

2020/02/10 10:08

StartでGetComponentInChildrenを使ってますね 同じように書いてみましょう (というか直すべきは、Startの方で、GetComponent があった行は消すべきですね)
Kageyama_23457

2020/02/10 10:08

izmktr様 とりあえず、「試したこと」として質問ページ内に追記させて頂きました。
Kageyama_23457

2020/02/10 10:12

izmktr様 ちょうど行き違いで追記の報告をしてしまったようです。 すみませんが、 ① Start,kibakoMoveスコープ内両方とも〜InChildrenで書く ② Startだけこのまま残して、kibakoMoveスコープの方は行ごと消す どちらでしょうか?
Kageyama_23457

2020/02/15 02:26

izmktr様 すみません、結局上記の通り自己解決致しました。ご教授ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問