336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

패키지 파일입니다. 다운받으세요^^

pack.unitypackage


[ 유니티허브 질문 ] 유니티 리소스 로드 하기. (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;

    // 현재까지 만들어진 것 저장. 중복해서 생성하지 않기 위해 만듬.
    List m_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>은 지워주세요.




+ Recent posts