안 쓰던 블로그
유니티 GameObject와 Prefab 차이 본문
//GameManager스크립트에 GetnewImage(int num) 함수가 있음
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Box1Manager : MonoBehaviour
{
public GameManager gm;
// Start is called before the first frame update
void Start()
{
gameObject.GetComponent<Image>().sprite = gm.GetnewImage(1); //오브젝트 찾지 못함 에러
}
public void OnClickBox()
{
gameObject.GetComponent<Image>().sprite = gm.GetnewImage(1); //에러 없음
}
}
너무 당연한 사실인데 뉴비한테는 새로운 사실
start에서 gm.GetnewImage가 실행되지 못하는 이유는 GameManager도 오브젝트고 Box1Manager가 붙어있는 box1Image도 오브젝트이기 때문
왜냐면 오브젝트는 실행이 되고 만들어지는 것이라
위의 Box1Manager에서 Start를 실행하고 있을 때, 동시에 GameManager에서도 GetnewImage를 만들고 있음
그러니까 GetnewImage가 없다고 뜨고 에러가 난다
유니티에서 리소스를 잘 보면 저 위에 1번에 있는 오브젝트는 아이콘은 흰 박스임
저기 오브젝트를 아래로 끌고 오면
이렇게 파란 박스가 되면서 Prefab라는 것이 되는데 무슨 차이냐면,
흰 박스는 게임이 실행된 이후 생성되고, 파란 박스와 Assets안에 있는 리소스들은 이미 생성되어 있음
또, 오브젝트가 Prefab가 되면 재사용이 가능하게 된다
오브젝트 사본을 만들 수 있다는 의미임
슈팅 게임에서 총알이 쁑쁑 나갈 때 '앞으로 간다'동작을 하는 총알을 Prefab으로 만들어두면, 생성된 모든 총알은 전부 '앞으로 간다'동작을 한다
그리고 또 좋은 점이 Prefab자체가 여러 컴포넌트들로 이미 완성되어 있는 오브젝트이기 때문에 Prefab의 속성만 바꿔주면 Prefab으로 생성된 모든 오브젝트의 속성이 바뀐다
서로 다른 GameObject는 하나씩 속성을 바꿔줘야 함
Prefab는 오브젝트 하나일 수도 있고 오브젝트가 부모자식으로 묶인 계층구조 전체일 수도 있음
계층 구조로 Prefab를 만들면 이런 것도 가능함
'앞으로 간다'동작을 하는 총알 5개를 Bullets라는 이름으로 묶고 전체를 Prefab으로 만들면,
Bullets를 생성시켜서 부모자식 관계를 끊으면 총알 5개가 '앞으로 간다'동작을 하는 총알더미가 된다
참고
https://answers.unity.com/questions/46124/what-is-the-difference-between-a-prefab-and-a-game.html
'유니티 > 개발' 카테고리의 다른 글
unity 슈팅게임 총알 5개 한 번에 쏘는 방법(GetComponentsInChildren) (0) | 2020.02.04 |
---|---|
unity 변수/함수/오브젝트 다른 씬에서 접근, 공유하기(DontDestroyOnLoad) (0) | 2020.02.02 |
유니티 코드에서 return이 if문 안에만 있으면 안 되네 (0) | 2020.02.02 |
유니티 오브젝트 이동(transform.position) 이상한 곳으로 갈 때 해결 방법 (2) | 2020.01.30 |
유니티 Resources.LoadAll으로 리소스 파일 전체 불러오기(sprite 불러오기) (0) | 2020.01.19 |