###前提・実現したいこと
配列を使って、オブジェクトを選択してまとめてスクリプトを実行させたい。
今回の場合だと、イベントフラグのあるコライダーに入った時、まとめてつららが4本落ちてくる。
###発生している問題・エラーメッセージ
今、書いているコードだと以下のエラーが出ます。
'Gameobject[]'に'GetComponents'の定義が含まれておらず、型'Gameobject[]'最初の引数を受け付ける拡張メソッドが見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足していないことを確認してください。
###該当のソースコード
C#で作っております。
【イベントフラグ】
public class EventBall_Turara : MonoBehaviour { [Header("反応時間")] public float t; public GameObject[] refObj; void OnTriggerEnter(Collider Collider) { //プレイヤーが範囲にいる間 if (Collider.gameObject.tag == "Player") { t = 0; } } void OnTriggerStay(Collider Collider) { t += Time.deltaTime; //プレイヤーが範囲にいる間 if (Collider.gameObject.tag == "Player") { AtackTurara a = refObj.GetComponents<AtackTurara>(); if (a != null) { a.TuraraOn(); Debug.Log("ざn"); } } } }
【つらら自身のプログラム】
public class AtackTurara : MonoBehaviour { [Header("Effect")] public GameObject IceHit; //つららが削れるエフェクト public GameObject IceBreak; //つらら爆破 public AudioClip BreakSe; protected GameObject clone; AudioSource aud; Rigidbody rb; GameObject GDirector; [Header("岩の能力")] public int HitPoint; public int HitPointMax = 50; public bool isDead = false; //つららはこわれていないか? public bool isZimen = false; public bool isTuraraOn = false; int damage; [Header("生存時間")] public float liveTime; public float t; [Header("足音")] public AudioClip foot_iwa; //土 public AudioClip foot_water; //水1 public AudioClip foot_sand; //砂 public AudioClip foot_snow1; //雪1 public AudioClip foot_snow2; //雪2 public Quaternion TuraraRote; //Yattackのエフェクトの角度 // Use this for initialization void Start() { rb = GetComponent<Rigidbody>(); this.aud = gameObject.GetComponent<AudioSource>(); GDirector = GameObject.Find("GameDirector"); HitPoint = HitPointMax; rb.isKinematic = true; } void Update() { //体力が0以下になったら消滅する if (HitPoint <= 0) { //死亡判定有効 isDead = true; Destroy(this.gameObject, 0.5f); } if (isTuraraOn ==true) { //重力 rb.AddForce(Vector3.down * 7000); } //clone = Instantiate(IceBreak, transform.position, Rote); } public void TuraraOn() { isTuraraOn = true; rb.isKinematic = false; } private void OnCollisionEnter(Collision collider) { int r = Random.Range(0, 2); //何かに触れたら? if (collider.gameObject.tag == "Zimen_Tuti" || collider.gameObject.tag == "Zimen_Isi" || collider.gameObject.tag == "Zimen_Wood" || collider.gameObject.tag == "Zimen_Kusa" || collider.gameObject.tag == "Zimen_Water"|| collider.gameObject.tag == "Zimen_Sand" || collider.gameObject.tag == "Zimen_Snow" || collider.gameObject.tag == "Player" ) { t = 0; isZimen = true; } //地面に刺さった時関連 if (collider.gameObject.tag == "Zimen_Tuti" || collider.gameObject.tag == "Zimen_Isi" || collider.gameObject.tag == "Zimen_Wood" || collider.gameObject.tag == "Zimen_Kusa" || collider.gameObject.tag == "Player" ) { this.aud.PlayOneShot(foot_iwa, 1F); } else if (collider.gameObject.tag == "Zimen_Water") { this.aud.PlayOneShot(foot_water, 1F); } else if (collider.gameObject.tag == "Zimen_Sand") { this.aud.PlayOneShot(foot_sand, 1F); } else if (collider.gameObject.tag == "Zimen_Snow") { if (r == 0) { // ランダムA this.aud.PlayOneShot(foot_snow1, 1F); } else if (r == 1) { // ランダムB this.aud.PlayOneShot(foot_snow2, 1F); } } //Playerと衝突したら消滅させる if (collider.gameObject.tag == "Player") { Destroy(this.gameObject, 0.5f); } //矢攻撃 if (collider.gameObject.tag == "Arrow" || collider.gameObject.tag == "WayArrow" || collider.gameObject.tag == "WayExArrow") {//矢攻撃の攻撃判定に当たった時 if (collider.gameObject.tag == "Arrow") { //ArrowMoveからダメージの値を取得する damage = collider.gameObject.GetComponent<ArrowMove>().damage; } if (collider.gameObject.tag == "WayArrow") { //ArrowWayMoveからダメージの値を取得する damage = collider.gameObject.GetComponent<ArrowWayMove>().damage; } if (collider.gameObject.tag == "WayExArrow") { //ArrowWayExMoveからダメージの値を取得する damage = collider.gameObject.GetComponent<ArrowWayExMove>().damage; } //判定が触れた所にエフェクト発生 foreach (ContactPoint point in collider.contacts) { //ダメージ量に応じてボイス変更 GameObject effect1 = Instantiate(IceHit) as GameObject; effect1.transform.position = (Vector3)point.point; Destroy(effect1, 1.0f); rb.velocity += ((Vector3)point.point * 5.1f) / rb.mass; } //攻撃判定衝突したらダメージ HitPoint -= damage; } //剣攻撃1 if (collider.gameObject.tag == "Blade_Hit1") { foreach (ContactPoint point in collider.contacts) { GameObject effect1 = Instantiate(IceHit) as GameObject; effect1.transform.position = (Vector3)point.point; Destroy(effect1, 1.0f); rb.velocity += ((Vector3)point.point * 25.1f) / rb.mass; } //ダメージをランダムで変える damage = Random.Range(100, 150); //攻撃判定衝突したらダメージ HitPoint -= damage; } //剣攻撃2 if (collider.gameObject.tag == "Blade_Hit2") { foreach (ContactPoint point in collider.contacts) { GameObject effect1 = Instantiate(IceHit) as GameObject; effect1.transform.position = (Vector3)point.point; Destroy(effect1, 1.0f); rb.velocity += ((Vector3)point.point * 25.1f) / rb.mass; } //ダメージをランダムで変える damage = Random.Range(200, 250); //攻撃判定衝突したらダメージ HitPoint -= damage; } //剣攻撃3 if (collider.gameObject.tag == "Blade_Hit3") { foreach (ContactPoint point in collider.contacts) { GameObject effect1 = Instantiate(IceHit) as GameObject; effect1.transform.position = (Vector3)point.point; Destroy(effect1, 1.0f); rb.velocity += ((Vector3)point.point * 25.1f) / rb.mass; } //ダメージをランダムで変える damage = Random.Range(500, 1000); //攻撃判定衝突したらダメージ HitPoint -= damage; } //バッシュ攻撃 if (collider.gameObject.tag == "Bash") { foreach (ContactPoint point in collider.contacts) { GameObject effect1 = Instantiate(IceHit) as GameObject; effect1.transform.position = (Vector3)point.point; Destroy(effect1, 1.0f); rb.velocity += ((Vector3)point.point * 25.1f) / rb.mass; } //ダメージ与える damage = 150; //プレイヤーの弾と衝突したらダメージ HitPoint -= damage; } } private void OnCollisionStay(Collision collider) { //地面に刺さったら? if (collider.gameObject.tag == "Zimen_Tuti" || collider.gameObject.tag == "Zimen_Isi" || collider.gameObject.tag == "Zimen_Wood" || collider.gameObject.tag == "Zimen_Kusa" || collider.gameObject.tag == "Zimen_Water" || collider.gameObject.tag == "Zimen_Sand" || collider.gameObject.tag == "Zimen_Snow" || collider.gameObject.tag == "Player" ) { t += Time.deltaTime; //地面に刺さってliveTime秒経過したら if (t > liveTime) { //時間とともに消滅 Destroy(this.gameObject); } } } //壊れる時、地面にささるか破壊された場合 void OnDestroy() { //死んでいると if (isDead == true || isZimen == true) { EDead(); } } //破壊時エフェクト表示 void EDead() { if (clone == null) { this.aud.PlayOneShot(this.BreakSe); Vector3 pos = transform.position; pos.y += 3.5f; transform.position = pos; clone = Instantiate(IceBreak, transform.position, TuraraRote) as GameObject; } } }
###試したこと
【1】
手段を選ばなければ【GameObject[] refObj】;を使用せずに【refObj0】、【refObj1】、【refObj2】、【refObj3】を作って、同じスクリプトを4回実行することで動作はしました。
でも、これは違う気がします。
【2】
public int x;
AtackTurara a = refObj[x].GetComponent<AtackTurara>();
で、inspectorで同じ数字を設定したものの、動作せず。
###補足情報(言語/FW/ツール等のバージョンなど)
【制作環境】
Unity5.6.1f1 personal
win10
MicrosoftVisualStudio
つららのコードじゃなく、おそらく、イベントフラグがおかしいと思って入るのですが、つららのコードにリストされるのを許可するコードが必要なのかな?とも考えてみたり・・・。
やり方がわからないので、見当違いな質問をしていたら申し訳ありません。
よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/22 03:02
2017/11/22 03:03
2017/11/24 00:48
2017/11/27 03:09