Skip to content

LSeungHyun/Code_Convention

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

25 Commits
 
 

Repository files navigation

Unity C# Script Style Guide

Table of Contents

  1. 타입 (Types)
  2. 참조 (References)
  3. 오브젝트 (Objects)
  4. 컬렉션 (Collection)
  5. 함수 (Functions)
  6. 클래스 및 생성자 (Classes & Constructors)
  7. 조건식 및 비교 (Conditionals & Comparisons)
  8. 공백 및 들여쓰기 (Whitespace & Indentation)
  9. 명명 규칙 (Naming Conventions)
  10. 주석 (Comments)
  11. 조건문 및 블록 (Conditionals & Blocks)
  12. 파일 구조 (File Structure)
  13. 오브젝트 생성 및 관리 (Object Creation and Management)
  14. 변수 선언 및 할당 (Variable Declaration and Assignment)
  15. 아트 리소스 기본 설정 (Basic Art Resource Setting)
  16. WebGL 빌드 기본 설정 (WebGL Build Basic Setting)

1. 타입 (Types)

  • 기본형(Primitive Types): Unity C#의 기본형에는 int, float, double, bool, string, char 등이 있으며, 이러한 타입들은 값이 직접적으로 조작됩니다.

    int a = 10;
    int b = a;
    b = 20;
    Debug.Log(a); // 출력: 10
    Debug.Log(b); // 출력: 20
  • 참조형(Reference Types): 참조형 타입은 class, array, object 등이 있으며, 참조를 통해 값을 변경합니다.

    int[] array1 = { 1, 2, 3 };
    int[] array2 = array1;
    array2[0] = 9;
    Debug.Log(array1[0]); // 출력: 9

⬆ back to top

2. 참조 (References)

  • Inspector 사용 권장: Inspector 창에 직접 캐싱할 수 있다면 스크립트를 통한 참조는 지양합니다.

  • Find 및 GetComponent 사용: FindGetComponent 메서드 참조는 Awake에서 호출하며, null 값 확인을 통해 메모리 낭비를 방지합니다.

  • 상수 및 readonly 사용: 재할당을 방지하려면 const 또는 readonly를 사용하며 var는 지양합니다.

    const int MAX_VALUE = 100;
    readonly string NAME = "Unity";
  • 명시적 타입 사용: 가능한 경우 명시적인 타입을 사용하고 var는 타입이 불명확할 때만 사용합니다.


⬆ back to top

3. 오브젝트 (Objects)

  • 객체 생성: 객체는 new 키워드를 사용하여 명시적으로 생성합니다.

    // Bad
    GameObject player;
    
    // Good
    GameObject player = new GameObject("Player");
  • 예약어 사용 금지: 예약어를 변수 이름으로 사용하지 않습니다.

    // Bad
    var class = "Test";
    
    // Good
    var type = "Test";
  • 프리팹: 반복 사용되는 오브젝트 프리팹화 합니다.

  • 위치값 초기화: Prefabs의 Inspector에서 Transform 컴포넌트 값을 초기화합니다.

  • 기본 세팅: 반복되는 오브젝트의 기초 틀 (사용되는 모든 기능)을 미리 세팅 한 후, 독립적인 변경이 필요한 경우 변경 후 Unpack합니다.


⬆ back to top

4. 컬렉션 (Collection) [어레이리스트, 리스트, 큐, 스택, 해시테이블, 해시셋, 딕셔너리]

  • 배열 리터럴 사용: 배열 생성 시 리터럴 구문을 사용하여 가독성을 높입니다.

    // Bad
    int[] numbers = new int[] { 1, 2, 3 };
    
    // Good
    int[] numbers = { 1, 2, 3 };
  • List 사용: 배열의 크기를 동적으로 관리할 때는 List<T>Add 메서드를 사용합니다.

    List<int> numbers = new List<int>();
    numbers.Add(1);
    numbers.Add(2);
  • 타입 명시가 가능한 경우: 직접적인 타입을 명시할 수 있다면 ArrayList 대신 List를, Hashtable 대신 Dictionary를 사용합니다.


⬆ back to top

5. 함수 (Functions)

  • 명시적 함수 선언: 함수는 명시적으로 선언하여 디버깅에 유리하게 작성합니다.

    // Bad
    Action myFunc = () => Debug.Log("Hello");
    
    // Good
    void MyFunc() {
        Debug.Log("Hello");
    }
  • 블록 스코프 내 함수 선언 피하기: 함수는 블록 외부에서 선언하는 것이 일반적입니다.

    // Bad
    if (condition) {
        void TestFunc() { }
    }
    
    // Good
    void TestFunc() {
        if (condition) { }
    }

⬆ back to top

6. 클래스 및 생성자 (Classes & Constructors)

  • 클래스 사용: 명시적으로 클래스를 사용하여 코드를 구조화합니다.

    class Player {
        public string Name { get; set; }
        public int Health { get; set; }
    
        public Player(string name, int health) {
            Name = name;
            Health = health;
        }
    }
  • 상속 구현: :를 사용하여 상속을 구현합니다.

    class Enemy : Player {
        public Enemy(string name, int health){ }
    }

⬆ back to top

7. 조건식 및 비교 (Conditionals & Comparisons)

  • Equals 사용: 객체 비교 시 == 연산자 대신 Equals 메서드를 사용합니다.

    // Bad
    if (a == b) { }
    
    // Good
    if (a.Equals(b)) { }
  • 타입 체크 시 is 사용: var로 받은 변수의 타입을 검사할 때 is 구문을 사용합니다.

    if (fromPoint is string)
      Debug.Log("String 타입");

⬆ back to top

8. 공백 및 들여쓰기 (Whitespace & Indentation)

  • Tab 들여쓰기 사용: 들여쓰기는 Tab을 사용하여 가독성을 유지합니다.

    void MyFunction() {
      if (true) {
          // Tab들여쓰기
      }
    }

⬆ back to top

9. 명명 규칙 (Naming Conventions)

  • camelCase 및 PascalCase 사용: 변수는 camelCase를, 함수나 클래스 이름은 PascalCase를 사용합니다.

    int playerHealth;   // camelCase
    class PlayerCharacter {}   // PascalCase
  • 변수: 지역변수,멤버변수,전역변수의 명칭적 구분이 필요합니다. 지역변수는 'l_', 멤버변수는 'm_', 전역변수는 'g_'

  int l_score = 100; // 지역변수

  private int m_score;    // m_을 붙이는 방식

  public void SetHealth(int score)
  {
      m_score = score; // 멤버변수와 구분 용이
  }

  public static int g_score = 0;     // 접두사 g_로 구분
  • 파일과 폴더명: 한글과 공백 사용 금지. Assets 폴더 아래에는 작업용 폴더를 따로 생성하여 관리하며, 외부에서 설치한 폴더는 수정하지 않고 그대로 유지해야 합니다.
Assets/
  MyProject/            // 작업용 폴더
      Scripts/
      Prefabs/
  ExternalAssets/       // 외부에서 설치된 폴더

⬆ back to top

10. 주석 (Comments)

  • 단일행 주석: 단일 행 주석은 //로 작성하며, 설명이 필요한 경우 주석을 코드 상단에 배치합니다.

    // 플레이어의 체력을 증가시킵니다.
    playerHealth += 10;

⬆ back to top

11. 조건문 및 블록 (Conditionals & Blocks)

  • 중괄호 사용: 모든 조건문 및 반복문의 블록에는 중괄호 {}를 사용하여 명확한 코드 흐름을 유지합니다.

    if (playerHealth > 0) {
      Debug.Log("체력감소");
    }

⬆ back to top

12. 파일 구조 (File Structure)

  • 파일당 하나의 클래스: 각 파일은 하나의 클래스만 포함하며, 파일 이름은 클래스 이름과 동일하게 설정합니다.

    // Player.cs
    public class Player {
      // 클래스 구현
    }
  • 네임스페이스 사용: 클래스의 논리적 그룹화를 위해 네임스페이스를 사용합니다.

    namespace GameNamespace {
      public class Player {
        // 클래스 구현
      }
    }

⬆ back to top

13. 오브젝트 생성 및 관리 (Object Creation and Management)

  • 빈 오브젝트 생성 후 위치 Reset: 모든 빈 오브젝트는 생성 후 위치를 Reset합니다.

  • 오브젝트 이름 영어 사용: 모든 빈 오브젝트의 이름은 영어를 지향하고 한글을 지양합니다.

  • PascalCase 사용: 모든 빈 오브젝트의 이름은 PascalCase를 사용하고 사용 의미에 알맞은 이름을 부여합니다.

    // Bad
    move
    
    // Good
    MovePoint

⬆ back to top

14. 변수 선언 및 할당 (Variable Declaration and Assignment)

  • 변수 선언 순서: 클래스 내부의 맨 위부터 선언합니다.

  • Inspector에서 캐싱 여부에 따라 분류: Inspector에서 직접 캐싱해주는 변수와 그렇지 않은 변수로 분류합니다.

  • 타입별 선언 순서: GameObject, string, int, bool 타입 순서로 선언합니다.

⬆ back to top

15. 아트 리소스 기본 설정 (Basic Art Resource Setting)

  • Image Resource Size: 가로,세로 사이즈는 짝수 최소값으로 설정합니다.

  • 확장자: .png로 설정합니다.

  • 맵의 위치: 각 씬의 알맞은 이미지를 넣은 뒤에 Transform의 값을 Reset하여 (0,0,0) 으로설정합니다.

  • Pixels per unit: 모든 아트 리소스의 pixels per unit값은 1로 통일합니다.

  • Pivot: 모든 아트 리소스의 pivot값은 center로 통일합니다.

  • Import Setting: 다음 설정은 모든 아트 리소스의 Import Setting에 적용됩니다.

    • Max Size: 아트 리소스의 가로, 세로 길이보다 작아지지 않는 선에서 최소값으로 설정합니다.

    • Build 및 압축 형식: ASTC방식 선택 (DXT방식은 선택 x - 손실이 발생하는 압축 형식), 4x4를 선택하여 품질을 최상으로 선택합니다. (12x12는 품질최하, 압축률 최고)

    • Defalut의 compression 기능(Mitchell, Automatic, NormalQuality, Use Crunch)을 사용하면 이미지가 깨짐(Max size 상관없이)

⬆ back to top

16. WebGL 빌드 기본 설정 (WebGL Build Basic Settings)

  • Other Setting - Additional Compiler Arguments

    • Strip Engine Code: [v] / 사용하지 않는 코드 반영 안하는 기능

    • Managed Stripping Level: Minimal 로 설정

  • Publishing Setting

    • Compression Format: Disabled 로 설정

    • Data Caching: [x]

    • Decompression Fallback: [x]

    • Initial Memory Size: 32 / 너무 큰 초기 값은 모바일 구동 X

    • Memory Growth Mode: Geometric 로 설정

    • Maximum Memory Size: 1024 ~ 2048 / 너무 크게 잡으면 모바일 부담

⬆ back to top

Releases

No releases published

Packages

No packages published