목록Unity (9)
Coding Memo
UnityWebRequest.Post()를 사용하여 웹 서버에 응답을 요청했을 때, 다음과 같은 에러가 나타날 수도 있다.(나타나지 않을 때도 있어서 이유를 찾는데 오래 걸렸다...) A Native Collection has not been disposed, resulting in a memory leak. Enable Full StackTraces to get more details. 에러에 나와있듯이, stack traces를 full로 설정하고 editor log나 player log를 확인을 했지만, 아래 에러 이상의 내용이 전혀 나타나지 않았다.(...)또한, 어떤 컬렉션이 누수를 발생시키고 있는지도 알 수가 없었다.... 이 문제를 해결하면서 살펴본 코드는 다음 포스트에 있다.https:/..
이 글은 해당 에러를 확인하면서, 정리한 글이다. 먼저 내가 사용했던 코드를 다시 한번 살펴보자.public IEnumerator PostCo(string url, T data, Action callback){ string json = Newtonsoft.Json.JsonConvert.SerializeObject(data); using (UnityWebRequest request = UnityWebRequest.Post(url, json)) { byte[] bodyRaw = System.Text.Encoding.UTF8.GetBytes(json); request.uploadHandler = new UploadHandlerRaw(bodyRaw); req..
Unity에서 UnityWebRequest를 통해, Https 연결을 요청할 때, 다음과 같은 에러가 발생 할 수 있다.Curl error 60: Cert verify failed. Certificate Common Name(CN) does not match with the expected CN. UnityTls error code: 7 이 에러는 말그대로 Https 연결 시, 인증 문제로 나타나는 에러이다.단순히 말해서, SSL 인증서 문제이다. 때때로, 이 에러는 자신의 컴퓨터의 루프백 주소(127.0.0.1)을 이용할 때 나타나기도 한다. 간단히 자신의 컴퓨터로 테스트를 해보고 싶은데 해당 에러가 뜬 다면, 다음 2가지 방법으로 해결 할 수 있다. 1. 루프백 주소(127.0.0.1) 대신, "lo..
- Unity에서의 비동기 작업은 주로 Unity의 메인스레드에 처리 Addressable에서 여러개의 비동기 작업을 실행 후, 완료를 확인하고 싶을 때 Interlocked등의 atomic하게 연산을 할 필요가 없다. Thread-safe 이다. - 외부 라이브러리의 스레드에서는 UnityObject를 컨트롤 할 수 없을 뿐더러, Coroutine도 실행 시킬 수 없음 예를 들어 Socket에서 데이터를 받고 이를 바로 해당 스레드에서 처리하려고 하여, UnityObject를 건드린다면 어떠한 동작도 실행하지 않거나 오류가 날 것이다. 또한 Coroutine도 마찬가지이다. - Addressables.LoadResourceLocationsAsync() 의 첫번째 인자로, Addressable에 등록되어..
Summary Coroutine은 반드시 Unity 메인 스레드에서만 실행되어야 한다. (다른 스레드에서 StartCoroutine을 호출해도 소용없다!) 외부 스레드에서 Unity 오브젝트 접근을 막아 놓은 것과 동일한 맥락으로 생각하면 될 것 같다. 내가 겪었던 문제는 다음과 같다. Situation Client가 Server에 연결이 되고 연결이 되었을 때의 callback으로 서버에 ping 패킷을 보내는 Coroutine을 호출하고 있었다. tcp 연결은 내가 간단하게 만든 라이브러리에서 실행이 된다. 코드를 간단하게 나타내면 다음과 같다. StartCoroutineEx는 static이고 MonoBehaviour를 상속하고 있는 CoroutineManager에 있는 static함수로, IEnum..
Addressable Asset을 사용하고 있는 프로젝트를 빌드 시 발생하는 에러 해결방법 스크립트가 정상적으로 컴파일 되는지 확인 (디버그 창에 SBP ErrorError 이후 좀 더 내려보면 어떤 오류가 있는지 추가적으로 나올 때도 있으니 확인하고 그것부터 해결하면 된다.) 에디터에서 실행했을 때는 잘 실행 되었는데 빌드 시 오류? => 스크립트 내에 프로그램 실행 시에 사용하지 않는 namespace나 참조 등이 있는지 확인 => 예를 들어 UnityEditor.Editor 등의 네임스페이스는 말그대로 에디터에서만 사용가능하고 빌드 시에는 참조할 수 없는 네임스페이스다. 만약 Editor 등의 클래스를 사용하였다면, 사용한 코드에 대해서 조건부 컴파일을 지정해주어야 한다. #if UNITY_EDIT..
Unity에서 GameObject에 Component(MonoBehaviour)를 추가 하면 ‘Inspector’에 관련 내용이 표시가 된다. 위 이미지에서는 Transform과 SpriteRenderer가 Component로 붙어있고, 각 컴포넌트에 에디터에서 직접 편집하고 수정할 수 있는 값들이 나타나 있다. 이 값들은 흔히 우리가 MonoBehaviour에서 [SerializeField]태그가 붙거나 public으로 선언한 필드가 있으면 자동으로 Inspector에 나타나게 된다. 이 값들을 (태그에서 알 수 있듯이) SerializedProperty라고 하고 이것을 가지고 있는 객체를 SerializedObject라고 한다. 말 그대로 직렬화 되어서 우리가 유니티 에디터에서 다루기 쉽도록 바꾼 것..
Canvas 아래 몇백개의 오브젝트가 있을 경우 렉이 걸릴 위험이 크다! (당연하지만) UI의 transform 변경, UI에 대한 animation 적용, hierachy에 추가 및 수정 등의 레이아웃이 변동되는 Dynamic UI Component에 대해서는 Canvas를 따로 분리하는 것이 성능 향상에 도움이 된다. Canvas에서 UI 요소가 추가/삭제되거나 transform에 변경이 일어날 때, Canvas에 있는 모든 UI 요소에 대해 재배치가 일어나게 된다. 즉, Canvas에 많은 UI 요소가 있을 경우 모두 재배치가 빈번하게 일어날 수 있고 이는 성능 저하를 유발할 수 있다. 이에 대해 Canvas를 따로 분리하는 방법이 있다. 따라서 다음과 같은 경우에 Canvas를 분리하여 사용하자...