Unity (16) 썸네일형 리스트형 [Unity] Coroutine 코루틴 바로알기 Coroutine 코루틴은 1. 특정일을 단계적으로 발생하게 할때 2. 시간의 흐름에 따라 발생하는 루틴을 작성할때 3. 다른 연상이 완료될때까지 기다리는 루틴이 필요할때 사용하면 굉장히 편리하게 사용할수 있다. 만약 단지 몇 초 동안 특정 연산을 지연시키기를 원한다면, Invoke를 사용하는 것을 고려해봐라. 물론 코루틴을 사용할 수는 있지만, 초보자들에게는 Invoke가 더 쉽다. 쓰레드와 코루틴 우선 코루틴은 쓰레드가 아니다... 코루틴은 비동기가 아니다. ( 비동기가 아니라는 말은 쉽게 말해 동시에 발생하지 않는다는 뜻이다. 쓰레드는 프로그램에서 다른 쓰레드와 함께 비동기로 실행될수 있따. 멀티프로세서 기계에서, 쓰레드는 실제 다른 쓰레드와 함께 동시에 코드가 실행수 있다. 이는 쓰레드를 프로그래.. [Unity] 속도 최적화 기법 어느 어플리케이션이나 웹 서비스에서 로딩에 너무 많은 시간이 소모되거나 실행 중에 렉이 걸리는 현상은 그렇게 좋지 못한 사용자 경험일것이다. 게임도 마찬가지로 초기 로딩이 너무 길거나 자주 렉이 발생한다면 아무리 재미있는 게임이라도 "발적화 게임"이라며 놀림당하기 십상이다. 지금부터 게임 제작 프로젝트에서 활용한 유니티 게임 최적화 기법들을 몇가지 소개 한다. ○ foreach 대신 for를 사용하자 일밤 배열을 사용하신다면 foreach 보다는 for를 사용하는것이 더 빠르기 때문에 웬만하면 for를 사용하는것이 좋다. C#을 이용하여 프로그래밍을 하셨던 분들은 아시겠지만 foreach는 for보다 2~5배 가량 느리다고 한다.또한 foreach는 루프 한 번에 24바이트의 쓰레기 메모리를 만들어 내기.. [Unity] 메모리 관리 유니티 문서를 보면 언급되는 Managed Memory란 단서에서 흔히 추측하기로 유니티가 알아서 모든 메모리를 잘 관리하고 있을것 처럼 생각되지만 사실 그렇지 않다. 사실은 유니티 시스템은 메모리를 어떻게 처리할 것인가에 대한 단서를 당신이 만드는 코드내에서 제공해주기를 원한다. 따라서 잘못된 코드는 줄줄 새는 메모리로 당신의 앱을 디바이스에서 뻗어버리게 만들수도 있을것이다. 요즘은 모바일 디바이스에서 조차 64bit 시스템이 올라가고 기본 장착 메모리가 2Gb 이상 되는 등 모바일 앱으로서는 무한한 자원이 있는것 같지만 사실상 아직도 적지 않은 사용자들이 높은 수준의 디바이스를 사용하지 않고 있다는것도 간과해선 안된다. ○ 유니티 어플리케이션이 사용하는 메모리 종류 유니티에서 사용하는 메모리는 3가지.. [Unity] 리소스 최적화 ○ 이미지 가로세로 사이즈는 무조건 2의 제곱 ( Power of Two) 게임에서 사용하는 이미지 가소 세로 가이즈는 무조건 2의 제곱으로 되어야 한다. 컴퓨터에서 이미지를 사용할 때에는 개념적으로 (1) 디스크에서 이미지 불러오기 (2) 이미지 압축 포멧 압축 해제 (3) 1024 X 1024 X 32 비트 메모리 블록에 해당 이미지 할당 의 과정을 거친다. 1024 X 1024 X 32 비트 RGBA 기준으로 이미지를 압축한 png 용량은 313KB에 불과 하다. 하지만 압축을 해제하면 메모리상 이미지는 4MB가 된다. 2048 X 2048 이라면 16MB에 이른다. 이렇게 가로세로 사이즈가 2의 제곱으로 된 이미지가 아닌 경우에는 상당한 메모리 낭비가 일어나게 된다. 예를 들어 900 X 900 .. [Unity] 시간경과의 따른 로직 처리 1. 특정 시간 경과 이후 특정 작업 반복 실행하기 Coroutines으로 작업이 가능하지만 단순한 지연 이벤트를 처리하기는 Coroutines의 처리로직이 다소 복잡할 수 있다. Time.deltaTime을 사용하는 방법 float timeSpan; //경과 시간을 갖는 변수 float checkTime; // 특정 시간을 갖는 변수 void Start() { timeSpan = 0.0f; checkTime = 5.0f; // 특정시간을 5초로 지정 } void Update() { timeSpan += Time.deltaTime; // 경과 시간을 계속 등록 if (timeSpan > checkTime) // 경과 시간이 특정 시간이 보다 커졋을 경우 { /* Action!!! */ timeSpan =.. [Unity]renderer.material 과 renderer.sharedMaterial의 차이점 renderer.material은 renderer에 소속된 재질이다. 특정 렌더러의 전용 재질로 사용된다. sharedMaterial은 여러 renderer들이 공유해서 사용하는 재질이다. 여러 렌더럴들이 공유해서 사용하도록 설계되있다. 이들의 구분을 위해 재질에는 소유자(owner)정보가 들어있으며, 이를 통해 재질이 특정 렌더러에 전용인지, 공유인지 판단한다. renderer.sharedMaterial은 renderer에 할당된 재질의 레퍼런스를 그대로 돌려준다. 하지만 renderer.material은 가져올 재질의 소유자 정보를 먼저 검사하고, 소유자가 renderer가 아니면 원래 할당된 재질의 레퍼런스를 주는것이 아닌 재질을 동일하게 복사해서 생상한 후 돌려준다. 아래와 같은 경우 materi.. [Unity] Rigidbody의 Interpolate 옵션 유니티에서는 렌터링 프레임과 물리 프레임이 서로 다른 주기로 동작한다. 물리 프레임의 기본설정은 0.02초로 되어있다. ( Edit → Project Setting →Time에서 변경가능 하다 ) 물리 엔진 특성상 계산의 편의성을 위해 항상 고정단위로 계산되도록 설계되어있다. 0.02의 의미는 물리 프레임이 초당 50회의 고정 간격으로 돌아간다는 의미이다. 만약 렌더링 프레임이 30fps 정도로 동작한다면 렌더링 프레임보다 더 많은 물리 프레임이 동작하게 될것이다. 물리 계산으로 인해 소비되는 CPU자원을 아끼기 위해 물리 프레임의 속도를 렌더링 프레임보다 더 낮게 생성할 경우 툭툭 끊켜서 보이는 현상이 발생하게 되는데, 이것을 잡아주기 위해 RigidBody 컴포넌트의 Interpolate옵션이다. I.. [Unity] 자주쓰는 함수_(6) LookAt Loot At :~을 자세히 살피다. ~에 대해 생각하다. 이말의 의미와 많이 다르지 않다. 유니티에서도 쓰인다 간단하게 자석과 철가루를 생각해보자 public GameObject magnetic; public int Speed = 20; void Update(){ float distance = Vector3.Distance(magnetic.transform.position, transform.position); //자석의 거리를 재는 코드. if(distance 이전 1 2 다음