제목 그대로.
번들 다운로드 시스템을 변경한 후 테스트 도중 아이폰에서만 파일을 찾지 못하는 현상이 발생.
윈도우 유니티 에디터, 맥 유니티 에디터, 안드로이드 기기에서는 문제가 없었음
매니페스트 파일명을 대문자로 넣었더니 아이폰에서만 파일을 찾지 못해서 소문자로 수정했더니 문자 해결.
약 3/4일 걸림
2018년 11월 28일 수요일
2018년 10월 18일 목요일
WorldToScreenPos in UGUI
개발 중인 게임의 UGUI 캔버스 모드가 Screen Space - Overlay 에서 Screen Space - Camera 로 변경되게 되었다.
별 일 없을줄 알았는데, 월드 좌표를 UI 좌표로 바꿨을때 이생해져서 열심히 구글링을 한 결과, Render Mode에 따라 변환하는 방식이 다르다는것을 알게되었다.
Overlay 모드에서는 단순히
rectTransform.position = RectTransformUtility.WorldToScreenPoint (Camera.main, target.position);
로 해결되었지만 Camera모드에서는 좀더 복잡한 계산이 필요하다
var pos = Vector2.zero; var uiCamera = Camera.main; var worldCamera = Camera.main; var canvasRect = canvas.GetComponent<RectTransform> (); var screenPos = RectTransformUtility.WorldToScreenPoint (worldCamera, target.position); RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasRect, screenPos, uiCamera, out pos); rectTransform.localPosition = pos;
참고 링크
일본 개발자들이 정리를 참 깔끔하게 하는것 같다. 번역도 편하고.
2018년 10월 15일 월요일
Sprite 를 Texture2D로 변환하던 중 발생한 문제
Atlas 의 Sprite 를 Texture2D로 변환하여 잘 활용하던 중, 2017.1에서 2018.3 b5로 유니티 버전업을 하게 되었다.
발생하던 모든 Error 를 다 처리하고 테스트 하는 도중 Sprite 에서 변환한 Texture2D가 나
오지 않는 걸 확인하고 여러가지 방법(텍스쳐 포멧 바꿔 보기 등)으로 수정하려고 노력해 보았지만 소용이 없었다.
원인은 Sprite.textureRect 의 모든 값이 0으로 반환되는 것이었는데 2018에 해당 내용이 Obsolated 된 것도 아니었다.
마지막이라는 심정으로 해당 아틀라스의 옵션을 확인하니, 2017.1 에서 설정했던 내용이 바뀌어 있었다. Allow Rotation 과 Tight Packing 옵션이 켜져 있었다. 그 중 Tight Packing 옵션을 끄니 Sprite.textureRect 값이 정상적으로 반환되었다.
발생하던 모든 Error 를 다 처리하고 테스트 하는 도중 Sprite 에서 변환한 Texture2D가 나
오지 않는 걸 확인하고 여러가지 방법(텍스쳐 포멧 바꿔 보기 등)으로 수정하려고 노력해 보았지만 소용이 없었다.
원인은 Sprite.textureRect 의 모든 값이 0으로 반환되는 것이었는데 2018에 해당 내용이 Obsolated 된 것도 아니었다.
마지막이라는 심정으로 해당 아틀라스의 옵션을 확인하니, 2017.1 에서 설정했던 내용이 바뀌어 있었다. Allow Rotation 과 Tight Packing 옵션이 켜져 있었다. 그 중 Tight Packing 옵션을 끄니 Sprite.textureRect 값이 정상적으로 반환되었다.
2018년 9월 11일 화요일
Cinemachine 에서 카메라 두 개 쓰기
각각의 카메라에 Cinemachine Brain 을 붙이고 CullingMask 를 겹치지 않게 셋팅해야 함.
https://forum.unity.com/threads/can-i-use-2-camera-with-cinemachine-brain.483241/#post-3150079
https://forum.unity.com/threads/any-word-on-splitscreen-multiple-cinemachine-brain-support.512108/#post-3350922
https://forum.unity.com/threads/can-i-use-2-camera-with-cinemachine-brain.483241/#post-3150079
https://forum.unity.com/threads/any-word-on-splitscreen-multiple-cinemachine-brain-support.512108/#post-3350922
2018년 9월 4일 화요일
GetAllScenePathsFromAssetBundle crash
- 백그라운드로 번들을 다운받고 캐싱하는 코드를 만들고 있는 중
- 번들 파일을 받고 UnityWebRequest.GetAssetBundle 을 사용하여 캐싱을 하면 에디터에서 100% 크래쉬가 발생(2017.2.1p1)
- Editor 로그를 확인하니까 마지막 콜스텍이 GetAllScenePathsFromAssetBundle
- 구글링 해 보니 나같은 현상이 발생한다는 애들이 있었음
issuetracker - We noticed that this bug was related to using WebRequest to cache bundles in background and not accessing the DownloadHandler.assetBundle property before the UnityWebRequest dispose.
- UnityWebRequest 를 쓸 때는 꼭 using 을 사용하자 유니티 메뉴얼
2018년 7월 3일 화요일
소소한 최적화
생각날 때마다 업데이트.
- transform.position = p; transform.rotation = r; 대신 transform.SetPositionAndRotation(p,r)
- null 조건 연산자를 사용하라
public class EventSource { private EventHandler<int> Update; private int counter; public void RaisUpdates() { counter++; if (Update != null) Update(this, counter); } }
대신
Effective c# 8장 참고. Atomic 하다고 함.
public void RaisUpdates() { counter++; Update?.Invoke(this, counter); }
- Enum 을 문자열로 바꿀 때 nameof(MyEnum.EnumValue);
- c# 7.2 에서 추가된 in 키워드를 최대한 활용하자. 링크 구조체를 파라매터로 넘길 때 속도가 10.1배 정도 차이가 난다
- 만들 갯수가 예측되는 프리팹은 동적으로 만들지 말고 미리 만들어 놓자.
2018년 6월 28일 목요일
Unity Assert on Device
using System.Collections.Generic; private readonly Dictionary<TYPE, IValue> _values = new Dictionary<TYPE, IValue>(); private void SetTable(TYPE type, IValue origin) { Assert.IsFalse(_values.ContainsKey(type), type.ToString()); _values.Add(type, origin); } public ITable GetTable(TYPE type) { IValue value = null; Assert.IsTrue(_values.TryGetValue(type, out value)); return value; }
유니티에서 위의 코드를 사용하고 있었는데 지속적으로 핸드폰에서만 문제가 발생했다.
에디터에서는 재현이 되지 않아 로그를 추가하여 APK를 빌드하고 기기에 설치하여 Logcat 으로 로그를 확인해 보았다.
_values 에는 분명 값이 있고 _values.TryGetValue 를 사용하면 정상적인 값을 얻을 수 있었지만, GetTable 함수를 사용하면 null 만 반환되는 문제였다.
몇 줄 되지 않는 코드라 대체 어떤것이 문제인지 도통 감을 잡을수가 없었다.
마지막이라는 심정으로 GetTable 함수의 Assert 를 제거하고 다시 APK를 빌드하여 핸드폰에서 실행하자 거짓말처럼 GetTable 함수가 정상적인 값을 반환했다.
대체 이해가 불가하여 옆자리 동료에게 물어보니 이유를 들을 수 있었다.
Assert 함수들의 소스 코드를 보면
[Conditional("UNITY_ASSERTIONS")] public static void IsTrue(bool condition) { Assert.IsTrue(condition, (string) null); }
[Conditional("UNITY_ASSERTIONS")] 가 붙어있음을 확인 할 수 있다.
에디터에서 Assert 함수들이 잘 동작하는 이유는 유니티가 C# 프로젝트 파일을 만들때
속성에 위 스크린샷 처럼 UNITY_ASSERTIONS 속성을 강제로 넣어주기 때문이다.
APK에서는 UNITY_ASSERTIONS 속성이 정의되어 있지 않고, Assert 함수들은 동작하지 않게 된다.
게다가 GetTable 함수의 Assert 코드 위에 IValue value = null; 로 초기화까지 해 버렸다.(C++ 쓰던 습관으로)
아마 IValue value; 로 했었으면 APK 빌드 도중 컴파일 에러가 나서 더 빨리 문제를 찾을수 있었을 지도.
APK에서도 Assert 함수들을 사용하고 싶으면 UNITY_ASSERTIONS 디파인을
Player Settings -> Other Settings -> Scripting Define Symbols 에 추가하면 된다.
피드 구독하기:
글 (Atom)