unityでアイテム(下の画像で選択されているオブジェクト)がバー(アイテムの真下にある棒状のオブジェクト)に当たったら現在のボールの数を倍に増やすようなコードを書いています。
BallManager.csというファイルで、まずヒエラルキーに最初からあるFirstBallというGamaObjectを取得してGameObject型のList(ballと定義)に追加しています。
この時点では当たり前ですがball.Count=1です。しかしこれをItemManager.csという別のファイルからball.Countを含む関数(DoubleBall)を呼び出した時なぜかball.Count=0とコンソールに表示されてしまいます。
どのようにしたらballの要素数をItemManager.csから参照できるのでしょうか。
以下BallManagerとItemManagerのファイルで、BallManagerはBallのPrefabとFirstBallに、ItemManagerはヒエラルキーのItemにそれぞれアタッチしています。
作業環境はUnity 2019.4.10f
VS 2019
Win 10
です。
BallManager
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class BallManager : MonoBehaviour 6{ 7 8 // Start is called before the first frame update 9 //ボールを格納するリスト 10 11 public List<GameObject> ball = new List<GameObject>(); 12 public GameObject instanceBall; 13 14 15 List<Rigidbody> rb = new List<Rigidbody>(); 16 17 Vector3 ballInitSpeed; 18 19 void Start() 20 { 21 //最初のボール 22 GameObject firstBall = GameObject.Find("FirstBall"); 23 ball.Add(firstBall); 24 Debug.Log("最初の"+ball.Count); 25 26 //最初のボールの初速 27 ballInitSpeed = new Vector3(100, 300, 0); 28 29 rb.Insert(0, firstBall.GetComponent<Rigidbody>()); 30 rb[0].AddForce(ballInitSpeed); 31 32 instanceBall= Resources.Load("Ball") as GameObject; 33 34 // ballCount = 1; 35 36 37 } 38 39 // Update is called once per frame 40 void Update() 41 { 42 43 44 // Debug.Log("ballCount" + ball.Count); 45 46 47 } 48 49 50 public void DoubleBall() 51 { 52 Debug.Log("呼び出された後のカウント"+ball.Count); 53 54 //増える分のボールをballに格納 55 foreach (var item in ball) 56 { 57 // Debug.Log("呼び出された"); 58 59 //ボールを現在存在するボールのそれぞれから分裂させる 60 Instantiate(instanceBall,item.transform.position,Quaternion.identity); 61 62 //ballリストのインデックスを倍にする 63 ball.Add(instanceBall); 64 65 66 } 67 68 //分裂したボールに初速度を与える 69 for (int i = ball.Count/2; i < ball.Count-1; i++) 70 { 71 rb.Insert(i, instanceBall.GetComponent<Rigidbody>()); 72 73 ballInitSpeed = new Vector3(Random.Range(-1000, 1000), Random.Range(-1000, 1000), 0); 74 rb[i].AddForce(ballInitSpeed); 75 } 76 77 78 } 79 80 81} 82
ItemManager
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class ItemManager : MonoBehaviour 6{ 7 public GameObject item; 8 // public GameObject[] balls; 9 10 BallManager ballManager; 11 Vector3 itemPos; 12 13 public GameObject ball; 14 15 16 // Start is called before the first frame update 17 void Start() 18 { 19 itemPos = new Vector3(-0.15f,2.2f,0); 20 21 // Instantiate(item,itemPos,Quaternion.identity); 22 23 } 24 25 // Update is called once per frame 26 void Update() 27 { 28 29 30} 31 32 //バーにアイテムがぶつかったら 33 public void OnCollisionEnter(Collision other) 34 { 35 Debug.Log("aaaa"); 36 if (other.gameObject.tag=="Bar") 37 { 38 ballManager = ball.GetComponent<BallManager>(); 39 //ボールを増やす 40 ballManager.DoubleBall(); 41 42 43 Destroy(gameObject); 44 45 46 47 } 48 } 49 50} 51
また当方unityもc#も初心者であるため、もっといい,ボールを2倍にする実装方法などあればご教授いただきたいです。
よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー