Text Animator for Unity를 이용한 타자기 출력
·
코드 및 공부/UI
유니티 버전 - 6000.0.49f1에셋 버전 - 2.3.1 목차에셋 설명컴포넌트 설정스크립트 에셋 설명https://assetstore.unity.com/packages/tools/gui/text-animator-for-unity-254677?srsltid=AfmBOooCsS2udUlvAMfx7vJf2IoYJKvl0pieJqR4DD0XP7sRG98q-cYp Text Animator for Unity | GUI 도구 | Unity Asset StoreUse the Text Animator for Unity from Febucci Tools on your next project. Find this GUI tool & more on the Unity Asset Store.assetstore.un..
GPT를 이용한 내 코드 작성 경향과 약점 개선하기
·
코드 및 공부/기타
GPT를 이용한 내 코드 작성 경향과 약점 개선하기혼자서 공부하거나 주변에서 피드백 받기가 어려운 경우, GPT에게 질문했던 내용을 바탕으로 코드 작성의 패턴과 약점에 대하여 객관적인 관점에서 평가 받을 수 있습니다 먼저 GPT에게는 다음과 같이 질문 하였습니다 (25.04.20 / o3 모델 이용)지금까지 대화한 모든 내용을 바탕으로 코드 관련 질문에서 내 사고 패턴과 의사결정 방식, 무의식적인 편향, 그리고 반복적으로 드러나는 약점을 상세하게 분석하고 각 항목에 대하여 나에게 필요한 조언을 구체적으로 해줘 그리고 제 결과를 먼저 살펴보자면 좀 충격적이였습니다 1. 최적화에 집착하여 기능 구현을 끝마치지 못함2. 코드의 모든 부분에서 과도한 추상화 및 복잡한 설계3. 동일한 문제에서 끊임없는 리..
async' 한정자는 본문이 있는 메서드에서만 사용할 수 있습니다
·
코드 및 공부/이론
유니티 버전 - 2022.3.59f1 async' 한정자는 본문이 있는 메서드에서만 사용할 수 있습니다인터페이스는 메서드 구현(본문)이 없는 추상적인 선언만을 담으므로, 그 자체에 async 한정자를 사용할 수 없습니다 인터페이스의 async 한정자를 제거하고 해당 인터페이스를 구현하는 클래스에서 추가하여 구현하면 됩니다
async메서드를 위한 AsyncEventManager
·
코드 및 공부/최적화
유니티 버전 - 2022.3.59f1 목차기존 코드AsyncEventManager 기존 코드기존 EvnetManager에 등록된 OnExtendUI는 ShowPopup을 .Forget()하고 최하단에서 비활성화되어있는 슬롯 백그라운드만 활성화 시켜주었기에, 처음 팝업 로드시에 팝업을 불러오는 지연시간이 발생하고, 백그라운드 활성화 후 팝업이 살짝 늦게 로드되어 빈 화면이 보이는 경우가 발생, 팝업 로드를 await한 후 백그라운드를 활성화 하도록 할 예정입니다private void OnExtendUI(object args){ if (!IsUIOpened) { ShowPopup().Forget(); OnExtendUI(IsUIOpened)..
.gitignore를 이용하여 Assets아래의 Api 키 숨기기
·
코드 및 공부/기타
유니티 버전 - 2022.3.59f1     목차코드의 의도.gitignore 설정ApiConfig     코드의 의도에디터에서 사용해야하는 Api 키를 빌드 혹은 git에 올리게 된다면 보안 취약점이 발생하기때문에, 에디터에서 사용하면서도 git에는 올라가지 않도록 하기 위함입니다 구글 시트의 데이터를 가져와 ScriptableObject를 만들기위한 키를 숨기기 위하여 작성하였습니다     .gitignore 설정.gitignore를 텍스트 편집기로 열기   2. 제외하고자하는 파일이 있는 경로를 입력파일이 루트가 아닌 에셋과 같이 하위 폴더에 존재하는 경우 전부 기재해야합니다반드시 파일을 만들기 전에 .gitignore를 작성, 작성전에 만들어진 파일은 git에서 계속해서 추적합니다     ApiC..
Int값을 .ToString() 후 캐싱하여 사용하기
·
코드 및 공부/최적화
유니티 버전 - 2022.3.59f1     목차.ToString()의 메모리 사용량.ToString()을 캐싱하여 사용하기     .ToString()의 메모리 사용량int형의 .ToString()은 내부에서 정수 값을 문자열로 변환하면서 새 문자열 인스턴스를 생성합니다, 이때 문자수에 따라 20~40 바이트 정도의 메모리 할당이 일어납니다, 단일 호출에서는 미미하지만 빈번하게 사용되어야한다면 캐싱하여 사용하는 것도 좋은 방법입니다     .ToString()을 캐싱하여 사용하기아래 코드를 통해 int 값에 대하여 확장 메서드로 이용할 수 있습니다, 해당 int 값을 문자열로 변환한 결과를 캐싱된 값으로 얻을 수 있습니다, 하지만 캐싱된 값은 프로그램이 실행되는동안 회수되지 않으므로, 적절하게 관리해주..
딕셔너리의 GetValueOrDefault()
·
코드 및 공부/최적화
유니티 버전 - 2022.3.59f1     GetValueOrDefault()기존의 메서드에서는 키 값을 이용하여 데이터를 찾고, 존재 여부에 따라 반환하는 값을 다르게 해주었습니다public T GetByID(int id){ if (lookupDictionary.TryGetValue(id, out var entry)) { return entry; } return null;}   개선된 코드에서는 GetValueOrDefault() 메서드를 사용하여, 주어진 키(itemCode)가 등록되어 있으면 그에 매핑된 값을 반환하고, 등록되어 있지 않으면 기본값을 반환합니다 여기서 _itemSoDictionary가 형태이므로, 키가 없을 경우 기본값인 null이 반환됩니다.public Item..
ReferenceEquals()를 이용한 null 비교 수행
·
코드 및 공부/최적화
유니티 버전 - 2022.3.59f1     목차기존 Object != nullReferenceEquals()를 이용한 null 비교어떤상황에서 사용해야할까     기존 Object != null오디오 클립을 딕셔너리에서 찾고 클립이 존재한다면 가져와서 실행시키는 로직입니다null 비교는 단순이 참조가 null인지 여부를 확인하는 것뿐만 아니라, 해당 객체의 네이티브 상태까지 검사합니다, 네이티브 상태를 검사한다는 것은 오브젝트가 내부적으로 연결되어있는 c++기반의 실제 리소스가 아직 유효한지도 함께 검사한다는 것을 의미합니다, 그래서 더 많은 성능을 요구합니다     ReferenceEquals()를 이용한 null 비교object.ReferenceEquals(clip, null)은 .NET의 기본 메..
CommandSceheduler를 이용한 메서드 순차 실행
·
코드 및 공부/최적화
유니티 버전 - 2022.3.59f1     목차기존 코드의 문제점전체적인 구조IMethodCommand와 CommandCommandPriorityComparerCommandQueueCommandScheduler메서드 등록실행 결과와 주의점     기존 코드의 문제점기존 코드입니다, 게임에서 하루가 지나고나서 실행되어야할 메서드들이 MorningRoutine이라는 메서드 아래 묶여있습니다, 코드간 결합도가 높고 확장성이 부족할뿐만 아니라 테스트, 가독성등 여러가지 측면에서 문제가 있습니다, MorningRoutine에서 해주어야하는 동작들이기는하지만, 좋지 못한 구조라고 볼 수 있겠습니다      CommandSceheduler의 전체적인 구조1. CommandSceheduler 에서는 개별 Queue에..
allowSceneActivation = false 를 이용한 씬 미리 로딩(PreLoadScene)
·
코드 및 공부/씬
유니티 버전 - 2022.3.59f1     목차코드와 코드의 의도AsyncOperation과 allowSceneActivation실제 동작 (문제 상황)해결법      코드와 코드의 의도플레이어는 현재 씬에서 다른 씬 (A, B, C) 중 하나를 선택하여 이동가능합니다   하지만 개별 씬의 크기가 커짐에 따라 로딩시간이 증가하고, 플레이어 경험을 향상시키기 위하여 개별 씬을 미리 로딩하고 트리거됨과 동시에 해당 씬으로 이동하고자 합니다public async UniTask PreLoadAddScene(SceneName sceneNumber){ if (_preloadSceneDictionary.ContainsKey(sceneNumber)) { return; } AsyncO..