前提・実現したいこと
私は今このサイトのように悪路王2020という2Dゲームを作っています。
ですが途中で実行したら障害物(スクショでいうWallです)が流れてきてくれませんでした。
スクリプトもインスペクターの値なども多分間違えているところはないと思います。
一応、全てのスクリーンショットを載せておきます。
※floorのインスペクターを追加(3/9)
該当のソースコード
Wall
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5[RequireComponent(typeof(SpriteRenderer))] 6public class Wall : MonoBehaviour 7{ 8 9 SpriteRenderer spriteRenderer; 10 float speed = 5; //とりあえずデフォルト値を5としておく 11 12 public float Speed 13 { 14 set 15 { 16 speed = value; 17 } 18 } 19 20 void Update() 21 { 22 transform.position = new Vector2(transform.position.x - speed * Time.deltaTime, transform.position.y); 23 } 24 25 //サイズと位置を調整 26 public void SetWall(Vector2 size) 27 { 28 spriteRenderer = GetComponent<SpriteRenderer>(); 29 spriteRenderer.size = size; 30 transform.position = new Vector2(transform.position.x, transform.position.y + size.y / 2); 31 } 32 33 //画面外に出たら破棄(※テストプレイ時にシーンビューに映っていると破棄されないので注意) 34 private void OnBecameInvisible() 35 { 36 Destroy(gameObject); 37 } 38 39}
WallSpawner
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class WallSpawner : MonoBehaviour 6{ 7 8 public bool isActive = false; 9 10 [SerializeField] 11 GameObject wallPrefab = null; 12 [SerializeField, Min(0.1f)] 13 float defaultMinWaitTime = 1; 14 [SerializeField, Min(0.1f)] 15 float defaultMaxWaitTime = 1; 16 [SerializeField] 17 Vector2 defaultMinSize = Vector2.one; 18 [SerializeField] 19 Vector2 defaultMaxSize = Vector2.one; 20 21 bool isSpawning = false; 22 float minWaitTime; 23 float maxWaitTime; 24 Vector2 minSize; 25 Vector2 maxSize; 26 Coroutine timer; 27 28 //外部から値を代入するためのプロパティ 29 public float MinWaitTime 30 { 31 set 32 { 33 //あまりにも小さい値になるとものすごい数の障害物が生成されてしまうので、0.1未満にならないようにする 34 minWaitTime = Mathf.Max(value, 0.1f); 35 } 36 get 37 { 38 return minWaitTime; 39 } 40 } 41 42 public float MaxWaitTime 43 { 44 set 45 { 46 maxWaitTime = Mathf.Max(value, 0.1f); 47 } 48 get 49 { 50 return maxWaitTime; 51 } 52 } 53 54 void Start() 55 { 56 InitSpawner(); 57 } 58 59 void Update() 60 { 61 if (!isActive) 62 { 63 //生成中なら中断する 64 if(timer != null) 65 { 66 StopCoroutine(timer); 67 isSpawning = false; 68 } 69 70 return; 71 } 72 73 //生成中じゃないなら生成開始 74 if (!isSpawning) 75 { 76 timer = StartCoroutine("SpawnTimer"); 77 } 78 } 79 80 //初期化用メソッド 81 public void InitSpawner() 82 { 83 minWaitTime = defaultMinWaitTime; 84 maxWaitTime = defaultMaxWaitTime; 85 minSize = defaultMinSize; 86 maxSize = defaultMaxSize; 87 } 88 89 //生成処理を行うコルーチン 90 IEnumerator SpawnTimer() 91 { 92 isSpawning = true; 93 94 GameObject wallObj = Instantiate(wallPrefab, transform.position, Quaternion.identity); 95 Wall wall = wallObj.GetComponent<Wall>(); 96 97 float sizeX = Random.Range(minSize.x, maxSize.x); 98 float sizeY = Random.Range(minSize.y, maxSize.y); 99 wall.SetWall(new Vector2(sizeX, sizeY)); 100 101 float waitTime = Random.Range(minWaitTime, maxWaitTime); 102 yield return new WaitForSeconds(waitTime); 103 104 isSpawning = false; 105 } 106 107}
よろしくお願い致します
WallのSpeedを5から50とか大きな値に変更したらどうなりますか?
コメントありがとうございます。
50や100に変更してみましたが、しばらく待っても何も変わらず障害物が現れることは無かったです...
floorのアセット(画像)のInspectorの表示も貼り付けてみてください。
GameObject wallObj = Instantiate(wallPrefab, transform.position, Quaternion.identity);
この行にブレークはってオブジェクトが生成されていることを確認して、
表示されないけどオブジェクトの生成はされているのかどうかも調べてみてください