AI/Unity

Unity 공용 라이브러리(Common) 개발기 — 1

blacknabis 2026. 2. 10. 01:11

오늘은 유니티 프로젝트에서 자주 사용되는 공용 라이브러리(Common)를 구축하고, 고질적인 Null 참조 오류를 예방하기 위한 확장 메서드들을 구현했습니다. 또한 서브모듈(Submodule)을 활용해 여러 프로젝트에서 코드를 공유할 수 있는 환경을 세팅했습니다.

1. InputSystem 의존성 문제 해결

Common 라이브러리를 새 프로젝트(CommonTest)에 가져왔을 때, UnityEngine.InputSystem 참조 오류가 발생했습니다.

  • 원인: 새 프로젝트의 manifest.json에 InputSystem 패키지가 누락됨.
  • 해결: 패키지 매니저를 통해 com.unity.inputsystem을 추가하여 컴파일 오류를 해결했습니다.2. Git 서브모듈 구조 개선초기에는 Assets/Common 경로에 서브모듈을 두었으나, 프로젝트의 스크립트 구조와 일관성을 맞추기 위해 Assets/Scripts/Common으로 이동했습니다.
  • 메타 파일(.meta)을 함께 관리하여 GUID 충돌을 방지하고 참조 무결성을 유지하도록 설정했습니다.3. 핵심 기능: ObjectExtensions (Safe Null Check)유니티의 GameObject는 C# 객체와 네이티브 객체의 수명이 달라 "Fake Null" 문제가 발생할 수 있습니다. 이를 안전하게 처리하고, 코드를 간결하게 만들기 위해 확장 메서드를 구현했습니다.3.1. 일관된 Null 체크 (IsNull)모든 Null 체크를 IsNull() 확장 메서드로 통일했습니다.
    if (myObject.IsNull()) return;
    // 또는
    if (myObject.IsNotNull()) { ... }
    3.2. 안전한 활성화/비활성화 (SetActiveSafe)객체가 Null인지, 이미 파괴되었는지 확인할 필요 없이 한 줄로 안전하게 상태를 변경할 수 있습니다.
    // GameObject나 Component 모두 사용 가능
    myGameObject.SetActiveSafe(true);
    myComponent.SetActiveSafe(false);
    3.3. 컬렉션(List, Array) 일괄 처리 및 독점 모드리스트나 배열에 있는 객체들을 한 번에 제어하는 기능도 추가했습니다. 특히 UI 탭이나 팝업 관리에 유용한 exclusive 모드를 구현했습니다.
    List<GameObject> tabs = ...;
    // 인덱스 2번 탭만 켜고, 나머지는 모두 끄기 (Exclusive 모드 기본값: true)
    tabs.SetActiveSafe(true, 2); 
    이 기능 덕분에 foreach 문을 매번 작성할 필요가 없어졌습니다.4. 마무리이제 Common 라이브러리 하나만 있으면 어떤 프로젝트를 시작하든 기본적인 안전장치와 유틸리티를 바로 사용할 수 있게 되었습니다.

이전에 Common 삽질을 하고 다시 세팅하여서 CommonTest와 그안에 Common의 2개를 별도로 구축하여 진행.

CommonTest에서 필요한 내용들을 최대한 공용화햇 세팅하고 그뒤에 자동화 할때 빠르게 찍어낼수있도록 최대한 Common 고도화진행 예정. 지금 삽질하고 만들어놔야 추후 찍어낼때 편하고 빠를듯

반응형