유니티8 [오류 해결] 역대급 끈기를 요구했던 12시간 디버깅 후기 / 유니티 iOS xCode 빌드 시 libc++abi: terminating due to uncaught exception of type nsexception / terminating due to uncaught exception of type nsexception 물론 12시간이 나의 최장 디버깅 시간은 아니다. 그러나...이번 디버깅은 역대급 끈기를 요구했는데, 그 이유는 무엇이 문제인지 전혀 감이 오지 않았기 때문.결론적으로 모든 커밋을 하나하나 따라가보며 언제 빌드가 망가졌는지 보기로 했다. 문제가 된 커밋은 바로 변경사항이 2700개 정도 되었던, 안드로이드 개발 환경에서 커밋했던 내역이다. 왜이렇게 많은 변경사항을 한꺼번에 커밋하였나? 하.. 원래는 그러지 않으려고 하는데, 이번 업데이트 때 파이어베이스 연동과 언어 현지화를 구현하면서 여러 외부 SDK, UI와 씬 작업 내용까지 섞여서 거대 커밋이 되어버렸다. (안드로이드에서 나눠서 커밋할걸. 그러나 나는 너무 피곤했었다.ㅎ)이걸 iOS에서 열어서 빌드를 하니 문제가 생긴 것이다.디버깅 과정0. Coco.. 2024. 9. 9. 유니티 언어 현지화 회사에서는 별도의 현지화 툴 없이, 전부 스프레드시트와 scriptable object로 해결했었다. 이 경우 (프로그래머 입장에서의) 장점은, 모든 string 값의 할당 로직을 코드에서 관리할 수 있다는 것이다.그러나 이번에 사모사에서는 좀 더 간편한 툴로 현지화를 해결하고 싶었다.조건일단 스프레드시트는 사용하고 싶었다. 왜냐하면 =GOOGLETRANSLATE로 언어간 자동번역이 가능했기 때문. 이 기능 정말 편리하다.무료 솔루션. 귀찮으면 유료 솔루션 구매해서 쓰는 습관이 생기고 있었는데, 이런 단순한 것까지 유료로 하기는 싫었다.안정성.찾아보니 유니티의 공식 Localization 패키지가 있었다. 공식 솔루션인데다가 무료고, 에디터 GUI도 잘 되어 있고, Google Spreadsheets A.. 2024. 9. 9. Sprite 2D Anchor 바꾸는 법 root object에 바로 sprite renderer를 붙이지 않고, 빈 rect transform을 parent로 두고 하위에 스프라이트를 두면 된다.그럼 부모 오브젝트의 앵커를 바꿀 수 있다. 오늘 나가기 전 자투리 시간에 만든 엘리베이터. ㅋㅋ 2024. 8. 31. 코루틴 실행 안 되는 이슈 이것은 너무나 간단한... 그래서 더 오류가 날 줄 몰랐던 부분이다. 디버깅해보니 Timescale 문제는 아니었고,Don't Destroy로 설정한 오브젝트의 Awake에서 등록한 이벤트가 호출되지 않아서 발생한 문제. private void OnEnable(){ GameEvents.OnCoinsChanged += UpdateUI; UpdateUI();}private void OnDisable(){ _disposable?.Dispose(); GameEvents.OnCoinsChanged -= UpdateUI;} OnEnable과 OnDisable로 옮겨주었다! 2024. 8. 6. [오류 해결] XCode Undefined symbol _firautherroruserinfoupdatedcredentialkey 일단 XCode가 익숙하지 않았기 때문에 기본적인 것을 더 알게 되었다. 1. xcodeproj가 아니라 xcworkspace에서 작업해야 한다 Admob, Firebase같은 서비스들을 쓰게 되면 dependency를 관리해주어야 하니, pod 파일이 있는 워크스페이스에서 작업해야 한다. 2. 상세 로그 보기는 Command + 9 해당 키조합을 누르면 오류 목록을 볼 수 있다. 이때 더 자세한 내용이 필요하다면 옆에 목록 표시를 누른다. Undefined symbols라는 오류 자체는 어느 패키지에서나 발생할 수 있는 오류이고, 이 상세 내용을 봐서 어떤 패키지나 파일이 포함이 안 되어 있다는 건지를 알아야 한다. 나의 경우 오류가 나던 부분은 _firautherroruserinfoupdatedcre.. 2024. 2. 27. 사원 모아 사장 개발 일지 (7) 유니티 애셋스토어 활용과 추천 애셋 😶 1인 게임 개발에 필수적인 게 뭔지 알아? 바로 우선순위를 정하는 것이지! 직접 구현해야 하는 것과, 다른 소스로부터 구해서 쓸 것을 구분하는 거야. 👾 시간도 아낄 수 있고, 머리도 덜 아프겠네. 그럼 다 사서 쓰면 되는 거 아니야? 😶 그건 아니야. 바로 이런 이유들 때문이지. 내가 필요한 게 없을 수도 있어. 내가 필요한 기능에 비해 너무 많은 것들이 들어있는 패키지가 있어. 그럼 사실상 불필요한 것들이 내 프로젝트에 많이 들어가게 되는 거야. 나중에 이걸 다 트래킹하는 게 거의 불가능해져. 특히 협업하는 상황이라면 더하겠지? 여러 패키지들 간에 뭔가 호환이 안 되는 상황이 생길 수 있어. 그럼 이 호환성을 해결하기 위해 또 시간을 써야 해. 그리고 주로 이런 문제 해결에 걸리는 시간은 예측하기.. 2024. 1. 8. 사원 모아 사장 개발 일지 (6) AWS S3 스토리지와 어드레서블 해야 한다는 걸 항상 알고 있었으나 굳이 안 했던 것... 바로 Amazon Web Services의 S3 스토리지와 어드레서블을 사용하는 것이다. 어드레서블을 사용하긴 했었다. 그런데 로컬에서만 사용했기 때문에, 사실 그렇게 큰 의미는 없었다. 여기서 말하는 '큰 의미'가 무엇이냐. 바로 '리소스 몇 개 바뀌었다고 빌드를 다시 뽑아야 하는 상황이 생기지 않도록 하는 것'이다. 예를 들어 이미지 하나가 잘못 들어갔다. 윽 ! 다시 빌드해서 플레이스토어에 새 빌드 등록 - 이 아니라, AWS S3 저장소에만 리소스 관련 파일을 올려주면 게임 실행파일에서 알아서 업데이트된 리소스를 받고 메인 게임에 들어가는 것이다. 튜토리얼이 여기 저기 꽤 있었는데, 가장 깔끔하고 유용했던 것은 이 영상이다. https:/.. 2024. 1. 8. 사원 모아 사장 개발 일지 (5) DynamicSequence를 이용한 눈 깜빡임 구현 😶 캐릭터들이 너무 정적이야. 눈이라도 깜빡였으면 좋겠는데, 이 기능을 어떻게 넣으면 좋을까? 👾 이미지를 갈아 끼워야지. 😶 그럼 공통 기능이 될 수 있겠네. 눈을 깜빡이게 하는 기능이 아니라, 지정한 길이에 맞춰 이미지를 루프시키는 기능인 거야. 👾 여러 이미지를 루프시키는 로직은 DynamicSequence 클래스가 처리하자. 얘가 여러 이미지들을 들고 있으면 될까? 😶 생각해보니, 갈아끼우는 대상이 단지 이미지가 아닐 수도 있을 것 같아. 예를 들어 하나의 DynamicSequence가 있는데, 얘가 또 그 하위의 DynamicSequence를 갈아끼울 수도 있는 거잖아. 👾 그게 무슨 소리야? 😶 그러니까, 눈을 깜빡이는 시퀀스가 하나 있어. 그럼 이 시퀀스는 눈을 감은 이미지와 눈을 뜬 이미지.. 2024. 1. 8. 이전 1 다음