[Unity3D] Sprite 동적할당.
※ Sprite를 public으로 인스펙터창에 노출시킨뒤 드래그로 넣는것이 아닌,
폴더안에 존재하는 이미지의 경로를 받아 할당하는 방법이다.
개발하다보면 Sprite를 변수에 동적으로 넘겨줘야 할때가 있다.
게임 시작 시 'Resources'폴더 안에 있는 1이라는 이미지가 public으로 선언된 Sprite변수인 spr에
동적으로 들어가게 된다.
코드는 이렇다.
1 2 3 4 5 6 | public Sprite spr; void Start() { spr = Resources.Load<Sprite>("경로"); } | cs |
※ 주의사항
- 이미지는 Resources폴더에 있어야 한다.
이때 폴더 이름은 정확히 Resources여야 한다.
- 이미지의 Texture Type은 Sprite여야 한다.
한 가지더.
만약 이러한 이미지가 있다고 하자.
이 이미지의 모드는 Multiple로써
많은 자식들의 이미지를 가지고 있다.
이 모든 이미지를 동적으로 받고자 한다.
위의 소스를 조금만 수정하면 된다.
밑에와 같이 수정해주자.
1 2 3 4 5 6 | public Sprite[] spr; void Start() { spr = Resources.LoadAll<Sprite>("경로/이미지 "); } | cs |
※ 필자같은 경우 경로는 Img폴더에 이미지 이름이 Imgs이므로
spr = Resources.LoadAll<Sprite>("Img/Imgs"); 가 된다.
그리고 게임을 수행하면
위와같이 이미지들이 들어가게 된다.
저렇게 하나의 이미지 말고 폴더안에 존재하는 모든 이미지들을 할당 받고 싶다면
경로/이미지이름 에서 이미지이름을 지워주고 이미지가 존재하는 폴더까지만 경로를 써주면
그 폴더안에 존재하는 모든 이미지들을 모두 받아올수 있게 된다.
1 2 3 4 5 6 | public Sprite[] spr; void Start() { spr = Resources.LoadALL<Sprite>("경로"); } | cs |
※ Img폴더 안에 있는 모든 이미지를 받아오게 되었다.
'Unity3D > Tip' 카테고리의 다른 글
[Unity3D] AddExplosionForce(); - 폭발 시 여파 적용. (0) | 2017.04.27 |
---|---|
[Unity3D] 일정 범위내의 존재하는 Collider 객체를 추출. (0) | 2017.04.27 |
[Unity3D] 비균등스케일 (non-uniform scale) (0) | 2017.04.27 |
[Unity3D] 셰이더 및 물리 기반 셰이딩 (0) | 2017.04.25 |
[Unity3D] 배칭 & 드로우콜 (0) | 2017.03.16 |
[STL] 템플릿을 이용해 Stack Calss 만들기.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | #include <iostream> using namespace std; #define MAX 9 template <class T> class Stack{ private: T Data; Stack* pUnder; Stack* pHead; public: Stack() { pHead = NULL;} ~Stack() { Clear(); delete pHead;} // 정보 저장. void push(T Data) { Stack* NewNode = new Stack; NewNode->Data = Data; NewNode->pUnder = NULL; if(pHead != NULL) NewNode->pUnder = pHead; pHead = NewNode; } // 정보 출력. T peek() { if(pHead == NULL) return -1; return pHead->Data; } // 정보 삭제. void pop() { if(pHead == NULL) return; Stack* pRemove = pHead; pHead = pHead->pUnder; delete pRemove; } // 모든 정보를 지운다. void Clear() { while(pHead != NULL) { Stack* pRemove = pHead; pHead = pHead->pUnder; delete pRemove; } pHead = NULL; } }; void main() { Stack<int> s; for(int i = 0; i < MAX; i++) s.push(i); for(int i = 0; i < MAX; i++) { printf("%d ", s.peek()); s.pop(); } } | cs |
자세한 설명은 생략한다.
결과
'C∫C++' 카테고리의 다른 글
[C++] 함수 포인터 (0) | 2017.04.14 |
---|---|
객체지향. (0) | 2017.01.15 |
[C++] 함수 포인터
포인터 변수는 다른변수의 주소를 보관한다.
변수가 메모리에 위치하고, 각 메모리 공간마다 주소를 가지고 있기에 가능한 일이다.
변수를 가리키는 포인터라면 변수에서 값을 읽거나, 값을 쓰는 용도로 사용할 수 있다.
하지만, 함수의 경우는 그런 작업이 불가능하다. 대신 함수의 포인터를 사용해서는 그 함수를 호출할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #include <iostream> using namespace std; void Cat(); void Dog(); void main() { void (*p)(); p = &Dog; (*p)(); p = &Cat; (*p)(); } void Cat() { printf("야옹\n"); } void Dog() { printf("멍멍\n"); } | cs |
결과
함수역시 메모리 어딘가에 보관된다.
하지만 일반적으로 변수들을 보관하는 메모리 공간과 함수들을 보관하는 메모리 공간이 어느 정도 떨어져 있게 된다.
어쨌든, 변수 p에는 Dog()의 시작주소가 들어가게 된다.
변수에 대한 포인터에 경우 그 포인터가 가리킬 수 있는 타입을 따로 지정해주었다.
함수 포인터도 마찬가지다. 포인터가 가리킬 수 있는 함수의 종류를 지정해 주어야 한다.
함수의 종류란 함수의 반환 값과 시그니처를 의미한다.
※시그니처란?
void Point(int a, int b);
이러한 함수가 있다고 하자.
함수의 시그니처란 함수의 원형에서 인자 부분을 의미한다. (int a, int b)
Point함수의 시그니처는 어떻게 되지? 라고 물어본다면, 정수 타입 2개만 받으면 된다.
라고 답변 해주면 된다.
반환 값, 인자가 있는 함수 포인터는 어떻게 쓸까?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <iostream> using namespace std; int Cat(int a, char *b); void main() { char b[] = "야옹"; int (*p)(int,char*); p = &Cat; (*p)(5,b); } int Cat(int a, char *b) { for(int i = 0; i < a; i++) printf("%s\n",b); return a; } | cs |
결과
※ 배열의 이름은 주소를 의미한다.
마찬가지로 함수의 이름은 주소를 의미한다.
그렇기 때문에 p = Dog;도 가능하다.
하지만 이 문장이 Dog의 주소를 얻고있는 것이라고 알아보기 힘들기 때문에 지양하도록 하자.
'C∫C++' 카테고리의 다른 글
[STL] 템플릿을 이용해 Stack Calss 만들기. (0) | 2017.04.15 |
---|---|
객체지향. (0) | 2017.01.15 |