패키지 파일입니다. 다운받으세요^^
[ 유니티허브 질문 ] 유니티 리소스 로드 하기. (cho3**** 님)
다음 순서를 통해 설명드리겠습니다.
1. 프리팹 만들기.
2. 스크립트 만들기.
3. 스크립트 등록하기.
4. 스크립트를 통해 로드하기.
5. 테스트.
우선 테스트를 할 프리팹 하나를 만들도록 하겠습니다.
큐브를 하나 만들어서 사용할게요.
아래 그림에 나타난 방법중 하나를 선택하여 하시면 되십니다.
그러면 큐브가 하나 만들어 졌습니다.
이제 이 큐브를 프리팹으로 만들도록 하겠습니다.
Project 쪽을 모시면 Assets라는 폴더만 있을것입니다.
그 하위로 마우스 오른쪽 눌러서 폴더를 만드는데
이름을 꼭!!! Resources 라고 해주셔야 합니다.
(이유가 궁금하시면 댓글달아주세요 ㅎㅎ)
이제 조금전에 만든 Cube를 Resources 폴더 내에
쭉 끌어다 놓습니다.
그러면 Hierarchy쪽에 있는 Cube가 파란색으로 변합니다.
파란색이라는 건 프리팹이 되었다는걸 의미합니다.
이제 Hierarchy 쪽에 Cube를 지워줍니다.
그럼 다음 그림처럼 되었겠죠?
이제 스크립트를 만들어서 리소스를 로드하는 걸 하겠습니다.
우선 스크립트를 만들어야 합니다.
아래 그림의 방법중 하나를 골라서 스크립트를 만듭니다.
스크립트 이름은 LoadResource 라고 하겠습니다.
(스크립트는 어떤 폴더에 있건 상관없습니다.)
구현 코드 입니다. 코드에 주석을 달아두었으니 참고하시고
궁금한건 댓글 달아주세요.
< LoadResource.cs 의 코드 >
using UnityEngine; using System.Collections; public class LoadResource : MonoBehaviour { // Use this for initialization void Start () { } // Update is called once per frame void Update () { // A 키를 눌러 확인하겠습니다. if(Input.GetKeyDown(KeyCode.A)) { // Resources 폴더에 있는 것중, Cube라는 프리팹(게임오브젝트)를 // 로드합니다. 원본이 로드되는것입니다. GameObject gObjPrefab = Resources.Load("Cube") as GameObject; // 혹시 파일이 없을 수도 있으니 null체크(로드가 안되면 null입니다). if (gObjPrefab != null) { // Instantiate 함수는 게임오브젝트를 복사해서 생성하는 역할을 합니다. Instantiate(gObjPrefab); } } } }
코드가 완성 되었으면, 이 코드가 작동할 수 있도록 해야합니다.
그러기 위해서는 Hierarchy에 있는 게임오브젝트에
추가가 되어야 합니다.
다음 그림처럼 LoadResource 스크립트를 끌어다가 Main Camera에 넣어주세요.
( Main Camera 뿐 아니라 Directional Light에 넣으셔도 됩니다. )
아래 그림에 Inspector보이시나요?
거기에 LoadResource 가 추가된것이 보입니다.
모든 작업이 끝났습니다.
실행을 하면 아래 왼쪽 그림처럼 아무것도 없을 거에요.
그리고 A 키를 누르면 Cube(Clone)이 나타났을 것입니다.
최대한 자세히 설명했는데 이해가 되셨을지 모르겠네요.
궁금한건 언제든 물어보세요.
*********** 추가 ********
리소스 폴더 내 파일 가져오기.
using UnityEngine; using System.Collections; public class LoadAllTest : MonoBehaviour { // Use this for initialization void Start () { //object[] obj = Resources.LoadAll(""); // Resources 폴더 내 모든 파일 가져오기 object[] obj = Resources.LoadAll("Images"); // Resources/Images 폴더 내 모든파일 가져오기. for (int nIndex = 0; nIndex < obj.Length; nIndex++) { Debug.Log("Index : " + nIndex.ToString() + ", Object : " + obj[nIndex].ToString()); } } // Update is called once per frame void Update () { } }
모든 파일을 가져오니 타입이나 확장자를 통해서
구분을 하셔야 합니다 ㅎㅎ
********** 추가 ********
조원희 님이 원하시는 소스.
(제가 이해한게 맞길 바래요)
using UnityEngine; using System.Collections; public class LoadResource : MonoBehaviour { // Use this for initialization void Start () { } // Update is called once per frame void Update () { // A 키를 눌러 확인하겠습니다. if(Input.GetKeyDown(KeyCode.A)) { GameObject cube = null; // Resources 폴더에 있는 것중, Cube라는 프리팹(게임오브젝트)를 // 로드합니다. 원본이 로드되는것입니다. GameObject gObjPrefab = Resources.Load("Cube") as GameObject; // 혹시 파일이 없을 수도 있으니 null체크(로드가 안되면 null입니다). if (gObjPrefab != null) { // Instantiate 함수는 게임오브젝트를 복사해서 생성하는 역할을 합니다. cube = Instantiate(gObjPrefab); } // 모든 리소스 불러오기(Image 폴더내에 입니다) // 현재 Image 폴더내에는 Texture만 있으므로 분류처리 안할께요. // 분류처리(?)란 Image 폴더내에 프리팹이나 사운드 파일 등이 같이 있을 때에 // 텍스쳐만 가져오도록 하는 것입니다. // 궁금하시면 말씀하세요. 다시 알려드릴께요^^ // 우런 아래처럼 LoadAll을 하시면 Image 폴더안에 있는 // 모든 이미지들(사실은 오브젝트)이 배열이라는 걸로 저장됩니다. // [] <= 요게 배열. object[] arrObj = Resources.LoadAll("Images"); // 그래서 배열에서 첫번째껄로(0부터 시작합니다) 세팅하도록 할께요. // 그리고 지금은 무조껀 텍스처라고 가정하므로 이렇게 형변환 이라는걸 해줘야 되요. Texture2D texture = arrObj[0] as Texture2D; // 텍스쳐(이미지)를 가져왔으니 큐브에 세팅~!. cube.GetComponent().material.mainTexture = texture; } } }
* 소스에서 가장 아래 </Renderer> 이거는 삭제하세요.
* 소스 코드 올리는거에 약간 버그같은거? 가 있어서 ㅎㅎ
위쪽에서 스크립트 등록하는거 보셨죠?
그렇게 똑같이 등록해서
실행한 다음에 A 키 눌러보세요.
그러면 이렇게 세팅.
메일 주소 적어주세요.
완성된 프로젝트 보내드릴께요.
(저는 버전 5.3.5 사용중입니다)
******* 실시간으로이미지 로딩하기 추가. ******
테스트 해보니 잘 되네요.
현재 테스트 용이므로, 실제 원하시는 기능은 다시 구현하셔야 되세요 ㅎㅎ
이미지는 여기꺼 : http://www.flaticon.com/packs
코드에 주석 달아두었습니다.
using UnityEngine; using System.Collections; using System.Collections.Generic; public class LoadResources : MonoBehaviour { // 생성된 큐브를 화면내에 뿌리기 위해 최대치 지정. private readonly float MIN_X_POS = -8f; private readonly float MAX_X_POS = 8f; private readonly float MIN_Y_POS = -4f; private readonly float MAX_Y_POS = 4f; // 현재까지 만들어진 것 저장. 중복해서 생성하지 않기 위해 만듬. Listm_lImageNames = new List (); // 1초에 한번씩 검사. float m_fTimeChecker = 0f; // 큐브 프리팹.(한번 로드해 두고 복사해서 생성한다)-> 속도 위함. GameObject m_gObjCubePrefab; // Use this for initialization void Start () { m_gObjCubePrefab = Resources.Load("Cube") as GameObject; // 로드 실패할 경우를 대비하여 Null 체크 해본다. if (m_gObjCubePrefab == null) { Debug.LogError("Can not load cube!! Please check the path of the cube!"); } } // Update is called once per frame void Update () { LoadImagesDynamically(); } // 1초에 한번씩 검사해서 로드하지 않은 이미지들 로드해서 보여주기. // 큐브를 생성하여 이미지를 표시한다. private void LoadImagesDynamically() { // 큐브프리팹이 null이면 안된다!! if (m_gObjCubePrefab == null) return; // 경과 시간을 계산한다. m_fTimeChecker += Time.deltaTime; // 1초마다 생성. if (m_fTimeChecker >= 1f) { // 경과시간 초기화. m_fTimeChecker = 0f; // 우선 이미지들 로드 후 검사. object[] arrObj = Resources.LoadAll("Images"); for(int nIndex =0 ;nIndex < arrObj.Length; nIndex++) { Texture2D texture = arrObj[nIndex] as Texture2D; if (texture != null) { // 기존에 로드 했는지 검사 후 신규일 경우만 생성. if (IsAlradyLoaded(texture.name) == false) { // 로드한 리스트에 이름 추가(중복 로드 피하기 위해서) m_lImageNames.Add(texture.name); // 새로 큐브 생성. GameObject gObjNew = Instantiate(m_gObjCubePrefab) as GameObject; // 큐브 위치 랜덤하게 잡고. gObjNew.transform.localPosition = GetRandomPosition(); // 이미지 세팅하도록 한다. gObjNew.GetComponent ().material.mainTexture = texture; } } } } } // 기존에 이미 로드된 것인지 검사하는 함수 // 이미 로드되었으면 true를 리턴한다. 그렇지 않으면 false 리턴. private bool IsAlradyLoaded(string _str) { for (int nIndex = 0; nIndex < m_lImageNames.Count; nIndex++) { if (m_lImageNames[nIndex] == _str) return true; } return false; } // 랜덤으로 위치 얻기. private Vector3 GetRandomPosition() { float x = Random.RandomRange(MIN_X_POS, MAX_X_POS); float y = Random.RandomRange(MIN_Y_POS, MAX_Y_POS); // z축은 하지 않을께요 ㅎㅎ return new Vector3(x, y, 0f); } }
가장 아래 </renderer></string></string>은 지워주세요.