書き換えました
2月26
回答を頂き、「ゲーム実行前にはヒエラルキに存在していないプレハブを取得する記述」に書き換えました。
しかし結局「スクリプトAのboolでスクリプトBのboolをtrue,falseにする」については、
とりあえずのところstaticで解決するというところに行き着きました。
超初歩的なことで質問ページを立ててしまい大変お恥ずかしいのですが、このまま残しておきます。
###前提
Unity、C#ともに初心者なので至らぬ点あるかと思いますがご容赦ください。
非営利目的の、あるマンガの二次創作ゲームを作っています。障害物競争のようなゲームです。
キャラが13人いて、障害物や加速アイテム、必殺技アイテムなどがあります。
今回は必殺技の発動について質問します。
キャラA:自機スクリプト、Rigidbody2D、コライダ2D持ち。
キャラB~N:いわゆるCPU。CPUスクリプト、Rigidbody2D、コライダ2D持ち。
自機スクリプトをつけかえれば13人の中から好きに自機キャラを選べる状態です。
必殺技アイテム:画像ファイル(2Dスプライト)。スクリプト、Rigidbody2D、コライダ持ち。プレハブ化されており、アイテム生成オブジェクトからランダムに生成され移動します。
13人はそれぞれ違う必殺技を持っており、必殺技アイテムを取るとそれが発動します。
今回はその中の一人、他のキャラを小さくする能力について質問します。
仮にこの能力のキャラをAとします。
必殺技アイテムのスクリプト(プレハブで量産。大元のオブジェクトのスクリプトではなく、プレハブのスクリプトを別スクリプトから参照したい→staticでとりあえず解決)
C#
1public static bool isA=false;//キャラAと接触した際のbool、staticにしておく 2 3 private void OnCollisionEnter2D(Collision2D collision)//衝突判定 4 { 5 if(collision.gameObject.tag ==Atag)//キャラAとの接触判定 6 { 7 StartCoroutine(CI_A());//キャラAと接触した際のコルーチンスタート 8 } 9 } 10 11 IEnumerator CI_A()//キャラAと接触した際のコルーチン 12 { 13 isA = true; 14 anim_CI_Ctrl.SetBool("CI_A", true);//UIイメージでの必殺技アニメーション 15 16 yield return new WaitForSeconds(2); 17 18 isA = false; 19 anim_CI_Ctrl.SetBool("CI_A", false); 20 }
他キャラ(小さくされるキャラたち)のスクリプト
C#
1 private GameObject _ObjectG,_saprefab=null;//ジェネレータとプレハブ変数宣言 2 3void Start() 4{ 5 _ObjectG = GameObject.Find("ObjectGenerator"); 6 _saprefab = _ObjectG.GetComponent<SA>().gameObject;//ここで生成される前にプレハブを取得していますが↓ 7} 8 9void Update() 10{ 11 12 if(SAprefab.isA==true)//staticで解決するので上記プレハブの取得は結果不要でした 13 {Debug.Log("小さくされた!"); 14 StartCoroutine(A());//小さくされるコルーチン開始 コルーチンの方はまた別の不具合が出ているので今回は載せません 15 } 16}
プレハブを生成する空のゲームオブジェクトのスクリプト
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SA : MonoBehaviour { public GameObject SAPrefab;//なんのプレハブを量産するのか private float interval;//何秒ごとに生成するのか private float time = 0f;//経過時間 public List<GameObject> StandAList = new List<GameObject>();//リスト化 これを小さくされるキャラのスクリプトから参照し、生成される前にプレハブを取得 void Start() { interval = 1f;//何秒ごとに生成するのか } void Update() { time += Time.deltaTime; if (time > interval)//経過時間が生成時間になったら(1秒たったら) { GameObject SA = Instantiate(SAPrefab);//必殺技アイテムのプレハブを生成する StandAList.Add(StandA);//生成されたプレハブをリストに追加 float x = Random.Range(-8f, 8f); float y = Random.Range(-4f, -200f); StandA.transform.position = new Vector2(x, y); time = 0f;//経過時間初期化 } } }
補足情報(FW/ツールのバージョンなど)
■作業環境
Mac Sierra10.12.6(4GB)
Unity2019.3.f06
■ここまで出来ていること
・プレイヤーキャラクターの移動(AddForce)及びアニメ遷移
・カメラのプレイヤー追従(y軸のみ)
・加速アイテム実装
・オブジェクトのランダム座標生成、及びランダムな方向への移動
・Gridを使いTileMapで背景を塗りました
・CPUキャラの親オブジェクトと検知用子オブジェクトの連携
・UIイメージを用いての、必殺技CIアニメ実装
ここまで同じゲームで質問させて頂き、解決に至るご教授を頂いておりますので、
そちらのページも貼っておきます。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/25 03:14
2020/02/25 04:45
2020/02/25 05:00 編集
2020/02/26 00:16
2020/02/26 12:30