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

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

ただいまの
回答率

89.65%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 122

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

前提

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

構造

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

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

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CPU : MonoBehaviour
{
public GameObject Kenchi_Object;//インスペクタで各CPUキャラ専用の子オブジェクトを取得
public float Speed;//インスペクタで各CPUキャラの通常時の移動速度を入力

    void Start()
    {}
    void Update()
    {
        Kenchi kenchi=Kenchi_Object.GetComponent<Kenchi>();//子オブジェクトのスクリプトを取得
                isKIBAKO=kenchi.IsKIBAKO();//子スクリプト内のboolを取得
    }
}


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

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Kenchi : MonoBehaviour
{
    private GameObject Kenchi_Object;
    public Rigidbody2D chara;//インスペクタで各親キャラを取得
        public float Speed;//インスペクタで各親キャラの通常時の移動速度を入力(親スクリプトのものと同じにする)

    private string kibakoTag = "kibako";//木箱(障害物)タグ
    public bool hakken_kibako_E,hakken_kibako_S,hakken_kibako_X;//障害物タグとの当たり判定のbool

    void Start()
    {
        Kenchi_Object = GetComponent<GameObject>();//自身のインスタンスを取得
        CPU CPUScript=chara.GetComponent<CPU>();//現在は使用していませんが、とりあえず各親キャラのスクリプトを取得
    }

    public bool IsKIBAKO()
    {
        if(hakken_kibako_E||hakken_kibako_S)
        {
            isKIBAKO = true;
            chara.velocity = new Vector2(1 * Speed,0);//親オブジェクトにx速度を与える。これでは不十分なので、ここの挙動は模索中です。
        }
        else if(hakken_kibako_X)
        {
            isKIBAKO = false;
            chara.velocity = new Vector2(Speed, -1 * Speed);//通常に戻って走行
        }

        hakken_kibako_E = false;
        hakken_kibako_S = false;
        hakken_kibako_X = false;
        return isKIBAKO;
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.tag == "kibako")
        {
            hakken_kibako_E = true;
        }
    }

    public void OnTriggerStay2D(Collider2D collision)
    {
        if (collision.gameObject.tag == "kibako")
        {
            hakken_kibako_S = true;
        }
    }

    public void OnTrrigerExit2D(Collider2D collision)
    {
        if (collision.gameObject.tag == "kibako")
        {
            hakken_kibako_X = true;
        }
    }
}

参考サイト様

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

実現したいこと

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

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

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

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/02/10 19:08

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

    キャンセル

  • 2020/02/10 19:12

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

    キャンセル

  • 2020/02/15 11:26

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

    キャンセル

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

  • ただいまの回答率 89.65%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる