같은 GameObject(Prefab)를 여러개 만들때 관리 방법

유니티를 공부하다가 wall을 여러개 만들고 SetActive()를 사용해서 비활성화 후

시간에 따라 벽을 차례대로 활성화 시키려고 했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    using UnityEngine;
    using System.Collections;
 
    public class MakeWall_Enable : MonoBehaviour {
        // Use this for initialization
        public GameObject prefab;
        void Start () {
            for(int i=0; i<5;i++){
                Instantiate(prefab, new Vector3 (0, Random.Range (-10.0f, 10.0f), 0), Quaternion.identity);
                prefab.SetActive (false);
            }
 
        }
        
        // Update is called once per frame
        void Update () {
        
        }
    }
 
cs



위 코드를 작성하고 나니 각 프리팹을 어찌 컨트롤 할지 고민이라 하나의 리스트를 만들려고 했다.

..사실 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    using UnityEngine;
    using System.Collections;
 
    public class MakeWall_Enable : MonoBehaviour {
        // Use this for initialization
        public GameObject[] prefab = new GameObject[5];

        void Start () {
            for(int i=0; i<5;i++){
                Instantiate(prefab[i], new Vector3 (0, Random.Range (-10.0f, 10.0f), 0), Quaternion.identity);
                prefab[i].SetActive (false);
            }
 
        }
        
        // Update is called once per frame
        void Update () {
        
        }
    }
 
cs


이렇게 작성했더니 

Out of Range 오류를 내뱉어서 황당했다.


stackoverflow에 들어가 검색을 해봤더니 이러한 현상을 가진 분들을 많이 봤다.

해결방법도 많아보였지만 현재 내가 배운 지식으로는 어림도 없을 것 같아서 간단한 방법을 사용했다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
 
    public class MakeWall_Enable : MonoBehaviour {
        // Use this for initialization
        public GameObject prefab;
        List<GameObject> wallList = new List<GameObject>();
        void Start () {
            for(int i=0; i<5;i++){
                Instantiate(prefab, new Vector3 (0, Random.Range (-10.0f, 10.0f), 0), Quaternion.identity);
                wallList.Add (prefab.gameObject);
                prefab.SetActive (false);
            }
 
        }
        
        // Update is called once per frame
        void Update () {
        
        }
    }
 
cs


List를 하나 만들어서 프리팹을 관리하는 법이다.

SetActive를 하면 Fine("")함수로는 찾을 수 없어서 애초에 prefab을 생성하면서 List에 추가 해줬다.

+ Recent posts