★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キャラの親オブジェクトと検知用子オブジェクトの連携(当ページ)
ここまで同じゲームで質問させて頂き、解決に至るご教授を頂いておりますので、
そちらのページも貼っておきます。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。