Skip to content

KingOfFlyingFish/UnityLibrary

 
 

Repository files navigation

환영합니다

  • 이 프로젝트는 Unity C# 오픈소스 라이브러리 프로젝트입니다.

  • 이 프로젝트는 게임을 보다 빠르고 편하게 만들기 위한 클래스와 함수를 제공합니다.

  • 이 프로젝트는 유니티 내 어떤 프로젝트에도 종속되지 않습니다.

  • 이 프로젝트는 프로그래머를 대상으로 설명합니다.

  • 하단에 있는 구현 목록외의 사항도 있으나, 정리가 덜 되어 따로 작성하지 않았습니다.

    • 하단에 있는 구현 목록의 경우 비교적 최근에 리펙토링한 결과입니다.
  • 깃허브 링크 : https://github.com/strix13/UnityLibrary

  • 코딩 스탠다드 링크 : https://docs.google.com/document/d/1X8nIU0anstawLqf_pTnylCFLxgAAMJSQILIOZ89hFTs

루트 클래스

ㄴ 이미지를 클릭하시면 확대하실 수 있습니다.

Video Label

ㄴ 이미지를 클릭하시면 유튜브에서 비디오를 시청하실 수 있습니다.

  • 기존 Unity의 MonoBehaviour의 기능을 확장 시킨 루트 클래스입니다.

  • 이 클래스를 상속받은 뒤 Update문을 작성하면, 매니져 클래스 한곳의 코루틴에서 Update를 루프로 돌며, 몇 개가 업데이트 중인지 하이어라키 뷰에서 실시간으로 체크할 수 있습니다.

  • MonoBehaviour가 아닌 클래스도 IUpdateAble을 구현하여 업데이트 매니져에 등록하면 Update처럼 사용할 수 있습니다.

  • 이 클래스는 GetComponentAttribute를 지원합니다.

    • GetComponentAttribute는 GetComponent, GetComponentInParents, GetComponentInChildren이 있습니다.
    • GetComponentInChildren은 자식 중 첫번째를 찾기, 이름으로 찾기, 복수형 자료형을 지원하며, Dictionary도 지원합니다.
    • Dictionary의 경우 string을 키값으로 두면 오브젝트의 이름, Enum으로 두면 오브젝트의 이름을 Enum으로 파싱에 성공한 것들만 저장합니다. - 만약 하나도 못찾을 시 경고 로그를 출력합니다.
  • 그 외 UnityEvent 함수를 가상함수로 지원합니다.

  • 링크 - 유니티 블로그 - 10000번의 Update() 호출

  • 링크 - Unity3D 자동 GetComponent

  • 작성한 코드 링크


UI 클래스 관계도

ㄴ 이미지를 클릭하시면 확대하실 수 있습니다.

  • 구조는 크게 Manager, Panel로 이루어져 있으며 Manager는 Panel을 관리하는 싱글톤 패턴입니다.

  • Manager의 경우 Panel을 Show / Hide 시키며, Panel의 레이어를 관리합니다.

  • Panel을 Show / Hide 시 FadeIn / Out 효과도 지원합니다.

  • Panel의 경우 NGUI로는 NGUIPanel, UGUI로는 Canvas 단위로 된 하나의 Window 단위 입니다.

  • Panel의 경우 하위 UI Element의 이벤트 ( 버튼, DropItem, Input 입력 ) 등을 쉽게 override하여 쉽게 사용할 수 있도록 지원합니다.

  • Panel의 경우 그 외 UI Element를 쉽게 Get할 수 있도록 지원합니다.

  • Panel의 경우 OnShow / OnHide의 이벤트가 있으며, Show / Hide 시 코루틴이 동작합니다. ( 애니메이션을 기다리기 위함, 코루틴 끝날 때 콜백 지원 )

  • UI 베이스 코드 링크

  • UGUI 베이스 코드 링크

  • NGUI 베이스 코드 링크


로컬 라이징 시스템

ㄴ 이미지를 클릭하시면 확대하실 수 있습니다.

Video Label

ㄴ 이미지를 클릭하시면 유튜브에서 비디오를 시청하실 수 있습니다.

  • 로컬라이징의 경우 Key, Value를 가진 임의의 Text파일을 파싱한 데이터를 기반으로 동작합니다.

  • 외부에서 Instance 요청 시 자동으로 생성되서 파일을 파싱 후, 자동으로 로컬라이징이 될 수 있게끔 작업하였습니다.

  • 작성한 Text, Sprite 컴포넌트 외에 이벤트를 받고 싶으면 ILocalizeListner를 구현하고, Manager에 등록하면 됩니다.

  • 코드 링크


사운드 시스템 클래스 관계도

ㄴ 이미지를 클릭하시면 확대하실 수 있습니다.

Video Label

ㄴ 이미지를 클릭하시면 유튜브에서 비디오를 시청하실 수 있습니다.

  • 사운드 시스템의 경우, SoundManager가 SoundSlot 클래스를 관리하는 형태입니다.

  • Instnace 요청 시 없을 경우 Instance를 생성하여 Initialize하여 플레이 할 수 있게끔 적용하였습니다.

  • SoundManager는 외부에서 사운드 플레이 요청 시 AudioClip을 얻고, SoundSlot을 풀링하여 Slot에게 플레이 합니다.

  • MainVolume, 개개별 사운드 Volume, Effect Volume, BGM Volume을 지원합니다.

  • SoundSlot의 경우 AudioClip과 AudioSource를 관리하는 클래스입니다.

  • 사운드가 끝날 때 이벤트 통보를 지원합니다.

  • FadeIn / Out 효과를 지원합니다.

  • SoundPlayer의 경우 임의의 게임오브젝트에 추가하여 쉽게 사운드를 플레이할 수 있는 클래스입니다.

  • 인스펙터에 세팅한 값을 토대로 SoundManager에게 요청하는 형태이기 때문에, SoundManager에서 관리하는 옵션값(MainVolume, 개개별 사운드 Volume, Effect Volume 등) 및 SoundSlot 풀링을 지원합니다.

  • 그 외로 그룹 내 랜덤 사운드 플레이, 사운드가 끝났을 때 이벤트 통보를 지원합니다.

  • 사운드 플레이 조건은 EventTrigger 클래스의 트리거 발동 조건 내에 가능합니다.

  • 트리거 발동 조건 : 유니티 이벤트(OnAwake ~ OnDisable), 물리 이벤트(Triger / Collision Enter), UI 이벤트(Click, Press) 등

  • 코드 링크


이펙트 시스템 클래스 관계도

ㄴ 이미지를 클릭하시면 확대하실 수 있습니다.

Video Label

ㄴ 이미지를 클릭하시면 유튜브에서 비디오를 시청하실 수 있습니다.

  • 이펙트 시스템은 사운드 시스템과 비슷한 설계입니다.

  • Instnace 요청 시 없을 경우 Instance를 생성하여 Initialize하여 플레이 할 수 있게끔 적용하였습니다.

  • EffectManager는 CEffect라는 클래스를 관리합니다.

  • EffectManager에 이펙트를 요청시, 원하는 위치에 이펙트를 실행하며, 풀링합니다.

  • CEffect의 경우 NGUI, Spine, Particle System을 래핑하였습니다.

  • CEffect는 이펙트가 끝날 때 이벤트 통보를 지원합니다.

  • EffectPlayer의 경우 SoundPlayer와 비슷한 기능이므로 생략합니다.

  • 코드 링크


유니티 마크다운 뷰어

ㄴ 이미지를 클릭하시면 확대하실 수 있습니다.


유니티 로그 래핑 클래스

ㄴ 이미지를 클릭하시면 확대하실 수 있습니다.

  • 로그 작성자, 로그 레벨에 따라 로그를 출력하지 않는 필터링 기능을 지원합니다.

  • 로그 발생 시 txt, csv 파일로 출력할 수 있는 기능을 지원합니다.

    • 파일에 로그 발생 시간과 콜스택도 기록합니다.
  • 코드 링크


랜덤 관련 클래스

랜덤 매니져

  • 랜덤 매니져는 IRandomItem 을 구현한 클래스에 대해 랜덤으로 리턴해주는 관리자입니다.

  • IRandomItem의 경우 랜덤확률을 구현하게끔 되어있으며, 랜덤확률에 따라 클래스를 리턴합니다.

  • 랜덤모드로 Peek, Delete 모드를 지원합니다.

    • Peek의 경우 Random Item List에서 아이템을 뽑을 때, List에 지장이 없습니다.
    • Delete의 경우 List에서 아이템을 뽑을 때 해당 아이템은List에서 제거됩니다.

랜덤 2D 섹터

  • 섹터의 경우, 인스펙터에서 몇 바이 몇 섹터인지, 섹터 당 사이즈가 몇인지를 설정합니다.

  • 그 외 주변 섹터 체크옵션으로 주위 4타일(위 아래, 양 옆), 주위 8타일(4타일에서 대각선 4타일 추가)를 지원합니다.

  • 섹터에게 랜덤 포지션을 요청 시, 직전의 섹터가 같은 섹터가 아니고, 주변 섹터도 아닌 섹터 내의 랜덤 위치만 리턴합니다.

  • 이펙트, 몬스터 스폰 등에 쓰입니다. ( 스폰 시 주변에 골고루 나오게 하기 위한 로직 )

  • 코드 링크


한글 파서

ㄴ 이미지를 클릭하시면 확대하실 수 있습니다.


작업 스타일

  • 저는 체계적인 스타일을 좋아합니다. 폴더부터 코드 네이밍, 코드 변수 및 함수 정의 위치까지 다 정하는 편입니다.

    • 이에 대해 항상 부가 설명을 하자면, 프로그래밍은 개발보다 유지보수 비용이 훨씬 크다고 생각합니다.
    • 또한, 담당자에게 물어보지 않고 스스로 예측 가능 하는 것을 최고로 생각하고 있습니다.
      • 부가 설명을 더 하자면, 현실의 방의 예를 듭니다. 아무리 어두운 방이라도, 우리는 항상 문고리가 어느 위치쯤에 있는지, 전등 스위치가 문 주변의 벽에 있다는 점을 누가 알려주지 않아도 스스로 예측합니다.
    • 이런식으로 네이밍을 하면, 어느 클래스의 이름만 보아도 어느 계층의 어느 패턴을 상속받은 클래스라는 점, 어느 함수의 이름만 보아도 어디쯤의 위치에 있는 지를 담당자에게 물어보지 않고 예측 할 수 있습니다.
  • 코드를 작성하기 전에 간단한 설계부터 하는 편입니다.

  • 저의 모토는 올바른 방향으로 고민하여, 실천할 수록 실력이 늘 수밖에 없다.입니다.

    • 고민이 올바른 방향으로 가는지 체크하기 위해 항상 관련 개발 서적을 읽습니다.
  • 또한 깨진 창문을 주의하기 위하여 클린코드의 나중은 오지 않는다(르블랑의 법칙)와, 왔을 때보다 좀 더 깔끔하게보이 스카웃 법칙을 따르도록 노력하는 편입니다.

  • 이에 관련된 SlideShare 링크

폴더 규칙

  • 저의 오픈 소스인 다른 유니티 프로젝트를 보시면, 폴더 규칙이 있는것을 보실 수 있습니다.

  • 최상위 폴더는 항상 숫자를 붙이는 편입니다.

    • Asset을 활용할 경우 최상위 폴더에 없으면 동작 안하는 경우가 있습니다.
    • 이 때문에, 폴더의 위치가 변경될 수 있어서, 위치를 고정하기 위해 숫자를 붙입니다.
  • 그 하위 폴더는 숫자를 붙이지 않습니다.

    • 항상 폴더를 생성하지 않고, 하위 항목이 5개 이상일 경우 폴더를 생성합니다.
    • 코드 폴더나, 프리팹, 리소스 등의 특정 폴더의 경우 예외입니다.

코드

ㄴ 저의 Visual Studio - Unity Item Template 입니다.

  • 제가 작성한 다른 코드를 보시면 주석으로 여기저기 무슨 구간이라 표시되있는 것이 있습니다. 이것은 Visual Studio의 Item Templates를 이용하였습니다.

  • Item Template의 형식도 계속 업데이트 됨에 따라 형식이 제각각입니다.

  • Template에 작성자와 Library 링크를 적은 이유는 코드에 책임감을 부여하기 위해서입니다.

  • 최근에 작성한 코드부터는 Test 코드를 작성하기 시작했습니다.

읽은 책 목록

  • C# 및 유니티 관련

    • 절대강좌 유니티5, 뇌를 자극하는 C# 5.0 프로그래밍, Effective C#, C# 코딩의 기술 실전편
  • 자료구조 및 알고리즘

    • 누워서 읽는 알고리즘, 윤성우의 열혈 자료구조, 뇌를 자극하는 알고리즘
  • 코드 스타일

    • 클린 코드, 리펙토링, 좋은 코딩 나쁜 코딩
  • 아키텍트

    • HeadFirst DesignPattern, 소프트웨어 설계 테크닉, 프로그래밍 패턴
  • 그 외

    • 객체지향의 사실과 오해, 게임TCP/IP 윈도우 소켓 프로그래밍, 뇌를 자극하는 윈도우즈 시스템 프로그래밍, TDD 실천법과 도구, 익스트림 프로그래밍, 소프트웨어 장인, 실용주의 프로그래머

읽어주셔서 감사합니다.

개발자 연락처

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C# 100.0%