반응형
반응형

Plane에다가 스크립트를 추가하여, 하위로 여러개의 객체를 추가하는 스크립트를 구현하여 사용중이었고, 해당 객체들을 Button으로 제어하려다보니, Canvas를 별도로 하나 두게 되었다.


추가한 Canvas에서 스크립트를 추가하여, 각 Button을 제어하는 리스너를 등록해서 사용하던 중 문제가 하나 생겼다.


Plane 스크립트에서 추가한 객체들을 FindGameObjectsWithTag 함수를 이용해 배열형태로 들고와서, Canvas 스크립트의 Start() 구문에서 사용하려고 하니, 배열 개수가 계속 0이 찍히는 이슈였다.


아무래도 Plane 스크립트의 Start 함수에서 객체를 로딩하는 데 걸리는 시간이, Canvas 스크립트의 Start 함수를 실행하는 시간보다 오래걸리는 것으로 보였다.


해결 방법이 없나 찾아보던 중, Awake라는 함수를 Unity 매뉴얼에서 찾게 되었다. (https://docs.unity3d.com/Manual/ExecutionOrder.html)


첫번째 Scene에서는 Start대신 Awake 함수를 사용하라는 거였고, 이건 Scene이 아닌 단순히 Object 지만, Start 함수를 Awake로 바꾸어 주었더니, 해결이 됨.


Awake 함수를 사용하는 스크립트에서 최대한 많은 리소스를 로드한 후, 그 이후 스크립트에서 가져다 쓰는 방식으로해야 할 것 같다.

반응형

'개발 > Unity' 카테고리의 다른 글

[Unity5] Random unique index from array  (0) 2017.10.24
[Unity 5] Resources.LoadAll를 이용한 Sprite 가져오기  (0) 2017.10.23
[Unity 5] Resources Path  (0) 2017.10.23
,
반응형

GameObject 배열을 섞어서 렌더링해줘야 할 일이 생겼다. Java를 주로 해왔기에 대충 잘 짜여진 함수들만 찾아봤고, Arrays.shuffle같이 편리하게 만들어진 함수가 있을 줄 알았는데, 저렇게 바로 되진 않았고, 일단 array를 List로 바꾸는 것부터 시작하였다.

// GameObject타입의 objArr라는 배열이 있다고 가정하자.
List<GameObject> objs = new List<GameObject>(objArr);

기본적으로 생성자에 Array를 넣어줬는데 바로 List로 변한다는 점은 Java와 비슷하게 편리하다.


이제 List로 만들었으니, 섞어야하는데.. Random함수를 사용하면 왠지 해당 범위내에서 Random값만 출력해줄 것 같고, Unique처리는 안될줄 알았는데, 신기하게도 UnityEngine에서 제공하는 Random 클래스는 Unique 처리까지 지원을 해주었다. (다만, 컬렉션 크기가 클 경우 메모리 사용량이 많을듯..)

GameObject o = Random.Range(0, objs.Count);


위와 같은 간단한 코드만으로, objs 리스트에 있는 엘리먼트 하나를 반환해주고, 반복문등을 통해 처리해도 해당 함수 내에서는 항상 유니크한 엘리먼트를 반환해주므로 매우 편리하다.

반응형

'개발 > Unity' 카테고리의 다른 글

[Unity5] Start vs Awake  (0) 2017.10.30
[Unity 5] Resources.LoadAll를 이용한 Sprite 가져오기  (0) 2017.10.23
[Unity 5] Resources Path  (0) 2017.10.23
,
반응형

Sprite를 여러개 생성한 뒤, 객체를 동적으로 생성해서 입혀야 할 일이 생겼다.


Sprite Editor를 이용해서, 통 이미지를 split해서 Sprite까지는 생성했는데, 실제 폴더 경로에서는 파일들이 보이지 않고 Unity Editor상에서만 확인이 가능하지만, 아래와 같은 코드를 이용하면 Sprite를 배열형태로 가져와서 활용이 가능하다.

private Sprite[] sprites;

void Start() {
    sprites = Resources.LoadAll<Sprite>("Sprite가 위치한 폴더명");
}


이전 포스팅(http://hakurei.tistory.com/264)에서 언급했던 것과 마찬가지로, Resources의 함수를 사용하기 때문에, Resources 폴더 밑에 위치해야 하며, 폴더명만 적어주면 Sprite 형태의 객체들을 배열형태로 잘 가져와준다.

반응형

'개발 > Unity' 카테고리의 다른 글

[Unity5] Start vs Awake  (0) 2017.10.30
[Unity5] Random unique index from array  (0) 2017.10.24
[Unity 5] Resources Path  (0) 2017.10.23
,
반응형

Unity 프로젝트를 생성하면 기본적으로 아래와 같은 폴더 구조를 하고 있다.


  • 프로젝트명
    • Assets
    • Library
    • ProjectSettings
    • Temp

Unity Editor에서 뭔가 리소스를 추가하고 편집하면, Assets 폴더에 들어가게 끔 되어있는데, 스크립트 단에서 Assets 폴더에 들어있는 항목들을 가져와야 될 때가 있다.


이런 경우 Assets 폴더 밑에 Resources라는 폴더를 하나 만들어두고, 스크립트에서 가져올 항목들을 넣어두면, 아래와 같은 코드로 손쉽게 접근이 가능하다.
GameObject o = Resources.Load("abc") as GameObject;


Resources.Load를 사용하게 되면, 기본적으로 프로젝트명\Assets\Resources 경로를 참조하기 때문이며, Resources밑에 세부경로가 있는 경우 / 기호를 통해 세부경로를 명시 후 리소스명을 작성해주면 된다. (Windows에서는 \\를 써야할 것 같지만, / 로 해주어야 한다.)

반응형

'개발 > Unity' 카테고리의 다른 글

[Unity5] Start vs Awake  (0) 2017.10.30
[Unity5] Random unique index from array  (0) 2017.10.24
[Unity 5] Resources.LoadAll를 이용한 Sprite 가져오기  (0) 2017.10.23
,
반응형