머리말
기본 원칙
1.
가독성을 최우선으로 삼는다. (대부분의 경우 코드는 그 자체가 문서의 역할을 해야 함)
2.
정말 합당한 이유가 있지 않는 한, 통합개발환경(IDE)의 자동 서식을 따른다. (비주얼 스튜디오의 "Ctrl + K + D" 기능)
3.
본 코딩표준을 따라 잘 짜여진 기존의 코드에서 배운다.
I. 메인 코딩 표준
1.
클래스와 구조체의 이름은 파스칼 표기법을 따른다.
class PlayerManager;
struct PlayerData;
C#
복사
2.
지역 변수 그리고 함수의 매개 변수의 이름은 카멜 표기법을 따른다.
public void SomeMethod(int someParameter)
{
int someNumber;
int id;
}
C#
복사
3.
메서드 이름은 기본적으로 동사(명령형)+명사(목적어)의 형태로 짓는다.
public uint GetAge()
{
// 함수 구현부...}
C#
복사
4.
단, 단순히 부울(boolean) 상태를 반환하는 메서드의 동사 부분은 최대한 Is, Can, Has, Should를 사용하되 그러는 것이 부자연스러울 경우에는 상태를 나타내는 다른 3인칭 단수형 동사를 사용한다.
public bool IsAlive(Person person);
public bool HasChild(Person person);
public bool CanAccept(Person person);
public bool ShouldDelete(Person person);
public bool Exists(Person person);
C#
복사
5.
아래에 제시된 예를 제외하곤 모든 메서드의 이름은 파스칼 표기법을 따른다.
public uint GetAge()
{
// 함수 구현부...}
C#
복사
6.
private uint getAge()
{
// 함수 구현부...}
C#
복사
7.
상수의 이름은 모두 대문자로 하되 밑줄로 각 단어를 분리한다.
const int SOME_CONSTANT = 1;
C#
복사
8.
상수로 사용하는 개체형 변수에는 static readonly를 사용한다.
public static readonly MyConstClass MY_CONST_OBJECT = new MyConstClass();
C#
복사
9.
상수로 사용하는 static readonly 변수는 모두 대문자로 하되 밑줄로 각 단어를 분리한다.
10.
초기화 후 값이 변하지 않는 변수는 readonly로 선언한다.
public class Account
{
private readonly string mPassword;
public Account(string password)
{
mPassword = password;
}
}
C#
복사
11.
네임스페이스의 이름은 파스칼 표기법을 따른다.
namespace System.Graphics
C#
복사
12.
부울(boolean) 변수는 앞에 b를 붙인다.
bool bFired;// 지역변수private bool mbFired;// private 멤버변수
C#
복사
13.
부울 프로퍼티는 앞에 Is, Has, Can, Should 중에 하나를 붙인다.
public bool IsFired { get; private set; }
public bool HasChild { get; private set; }
public bool CanModal { get; private set; }
public bool ShouldRedirect { get; private set; }
C#
복사
14.
인터페이스를 선언할 때는 앞에 I를 붙인다.
interface ISomeInterface;
C#
복사
15.
열거형을 선언할 때는 앞에 E를 붙인다
public enum EDirection
{
North,
South
}
C#
복사
16.
구조체를 선언할 때는 앞에 S를 붙인다. 단, readonly struct일 때는 그렇지 아니한다
public struct SUserID;
C#
복사
17.
private 멤버 변수명은 앞에 m을 붙이고 파스칼 표기법을 따른다
public class Employee
{
public int DepartmentID { get; set; }
private int mAge;
}
C#
복사
18.
값을 반환하는 함수의 이름은 무엇을 반환하는지 알 수 있게 짓는다.
public uint GetAge();
C#
복사
19.
단순히 반복문에 사용되는 변수가 아닌 경우엔 i, e 같은 변수명 대신 index, employee 처럼 변수에 저장되는 데이터를 한 눈에 알아볼 수 있는 변수명을 사용한다.
20.
뒤에 추가적인 단어가 오지 않는 경우 줄임말은 모두 대문자로 표기한다.
public int OrderID { get; private set; }
public int HttpCode { get; private set; }
C#
복사
21.
getter와 setter 대신 프로퍼티를 사용한다.
틀린 방식:
public class Employee
{
private string mName;
public string GetName();
public string SetName(string name);
}
C#
복사
올바른 방식:
public class Employee
{
public string Name { get; set; }
}
C#
복사
22.
지역 변수를 선언할 때는 그 지역 변수를 사용하는 코드와 동일한 줄에 선언하는 것을 원칙으로 한다.
23.
double이 반드시 필요한 경우가 아닌 이상 부동 소수점 값에 f를 붙여준다
float f = 0.5F;
C#
복사
24.
switch 문에 언제나 default: 케이스를 넣는다.
switch (number)
{
case 0:
...
break;
default:
break;
}
C#
복사
25.
switch 문에서 default: 케이스가 절대 실행될 일이 없는 경우, default: 안에 Debug.Fail()을 추가한다.
switch (type)
{
case 1:
...
break;
default:
Debug.Fail("unknown type");
break;
}
C#
복사
26.
코드를 작성하면서 세운 모든 가정에 Debug.Assert()를 넣는다.
27.
재귀 함수는 이름 뒤에 Recursive를 붙인다.
public void FibonacciRecursive();
C#
복사
28.
클래스 안에서 멤버 변수와 메서드의 등장 순서는 다음을 따른다.
a.
멤버 변수
b.
프로퍼티 (단, 프로퍼티와 대응하는 private 멤버변수는 프로퍼티 바로 위에 적음)
c.
생성자
d.
메서드 (public -> private 순서로)
29.
클래스 안에서 연관 있는 메서드끼리 그룹을 짓는다. 멤버 변수도 마찬가지이다.
30.
매개변수 자료형이 범용적인 경우, 함수 오버로딩을 피한다.
올바른 방식:
public Anim GetAnimByIndex(int index);
public Anim GetAnimByName(string name);
C#
복사
틀린 방식:
public Anim GetAnim(int index);
public Anim GetAnim(string name);
C#
복사
31.
클래스는 각각 독립된 소스 파일에 있어야 한다. 단, 작은 클래스 몇 개를 한 파일 안에 같이 넣어두는 것이 상식적일 경우 예외를 허용한다.
32.
파일 이름은 대소문자까지 포함해서 반드시 클래스 이름과 일치해야 한다.
public class PlayerAnimation
{
}
C#
복사
PlayerAnimation.cs
Plain Text
복사
33.
여러 파일이 하나의 클래스를 이룰 때(즉, partial 클래스), 파일 이름은 클래스 이름으로 시작하고, 그 뒤에 마침표와 세부 항목 이름을 붙인다.
public partial class Human;
C#
복사
Human.Head.cs
Human.Body.cs
Human.Arm.cs
Plain Text
복사
34.
특정 조건이 반드시 충족되어야 한다고 가정(assertion)하고 짠 코드 모든 곳에 assert를 사용한다. assert는 복구 불가능한 조건이다.(예: 대부분의 함수는 다음과 같은 assert를 가질 수도… Debug.Assert(매개변수의 null 값 검사) )
35.
비트 플래그 열거형은 이름 뒤에 Flags를 붙인다.
[Flags]
public enum EVisibilityFlags
{
None = 0,
Character = 1 << 0,
Terrain = 1 << 1,
Building = 1 << 2,
}
C#
복사
36.
디폴트 매개 변수 대신 함수 오버로딩을 선호한다.
37.
디폴트 매개 변수를 사용하는 경우, null이나 false, 0 같이 비트 패턴이 0인 값을 사용한다.
38.
변수 가리기(variable shadowing)는 허용되지 않는다. 외부 변수가 동일한 이름을 사용중이라면 내부 변수에는 다른 이름을 사용한다.
public class SomeClass
{
public int Count { get; set; }
public void Func(int count)
{
for (int count = 0; count != 10; ++count)
{
// count를 사용}
}
}
C#
복사
39.
언제나 System.Collections에 들어있는 컨테이너 대신에 System.Collections.Generic에 들어있는 컨테이너를 사용한다. 순수 배열을 사용하는 것도 괜찮다.
40.
var 키워드를 사용하지 않는다. 단, 데이터형이 중요하지 않은 경우에는 예외를 허용한다. IEnumerable에 var를 사용하거나 익명 타입(anonymous type)을 사용할 때가 좋은 예이다.
41.
싱글턴 패턴 대신에 정적(static) 클래스를 사용한다.
42.
async void 대신에 async Task를 사용한다. async void가 허용되는 유일한 곳은 이벤트 핸들러이다.
43.
async 메서드명에 Async 접미사를 붙이지 않는다.
44.
외부로부터 들어오는 데이터의 유효성은 외부/내부 경계가 바뀌는 곳에서 검증(validate)하고 문제가 있을 경우 내부 함수로 전달하기 전에 반환해 버린다. 이는 경계를 넘어 내부로 들어온 모든 데이터는 유효하다고 가정한다는 뜻이다.
45.
따라서 내부 함수에서 예외(익셉션)를 던지지 않으려 노력한다. 예외는 경계에서만 처리하는 것을 원칙으로 한다.
46.
위 규칙의 예외: enum 형을 switch 문에서 처리할 때 실수로 처리 안 한 enum 값을 찾기 위해 default: 케이스에서 예외를 던지는 것은 허용.
switch (accountType)
{
case AccountType.Personal:
return something;
case AccountType.Business:
return somethingElse;
default:
throw new NotImplementedException($"unhandled switch case: {accountType}");
}
C#
복사
47.
함수의 매개변수로 null을 허용하지 않는 것을 추구한다. 특히 public 함수일 경우 더욱 그러하다.
48.
null 값을 허용하는 매개변수를 사용할 경우 변수명 뒤에 OrNull를 붙인다
public Anim GetAnim(string nameOrNull)
{
}
C#
복사
49.
함수에서 null을 반환하지 않는 것을 추구한다. 특히 public 함수일 경우 더욱 그러하다. 그러나 때로는 예외를 던지는 것을 방지하기 위해 그래야 할 경우도 있다.
50.
함수에서 null을 반환할 때는 함수 이름 뒤에 OrNull을 붙인다.
public string GetNameOrNull();
C#
복사
51.
인라인 람다는 한 줄짜리 짧은 코드만 담을 수 있다.
52.
개체 초기자(object initializer)를 사용하지 않으려고 노력한다. 단, required 한정자(C# 11.0)와 초기화 전용 setter(C# 9.0)와 같이 사용할 때는 괜찮다.
53.
함수에 전달하는 out 매개변수는 별도의 라인에 선언한다. 즉, 인자 목록 안에서 선언하지 않는다.
54.
null 병합 연산자(C# 7.0)의 사용을 금한다.
55.
using 선언(C# 8.0)의 사용을 금한다. 대신 using 문을 사용한다.
56.
new 키워드 뒤에 반드시 명시적으로 자료형을 적어준다. (즉, C# 9.0의 new() 사용 금지) 단, 함수 내부에서 익명 타입(anonymous type)을 사용하기 위해 그럴 때는 허용한다.
57.
프로퍼티에 private init(C# 9.0)을 최대한 사용한다.
58.
파일 범위 namespace 선언(C# 10.0)을 사용한다
59.
범용적인 자료형을 강타입(strong type)으로 만들 때는readonly record struct(C# 10.0)를 사용한다
II. 소스 코드 포맷팅
1.
탭(tab)은 비주얼 스튜디오 기본값을 사용하며, 비주얼 스튜디오를 사용하지 않을 시 띄어쓰기 4칸을 탭으로 사용한다.
2.
중괄호( { )를 열 때는 언제나 새로운 줄에 연다.
3.
중괄호 안( { } )에 코드가 한 줄만 있더라도 반드시 중괄호를 사용한다.
if (bSomething)
{
return;
}
C#
복사
4.
한 줄에 변수 하나만 선언한다.
틀린 방식:
int counter = 0, index = 0;
C#
복사
올바른 방식:
int counter = 0;
int index = 0;
C#
복사
III. 프로젝트 설정 관련
1.
배포(release) 빌드에서 컴파일러 경고(warning)를 오류(error)로 처리하게 설정한다.
2.
implicit global using(C# 10.0)을 사용하지 않는다
3.
nullable context
IV. 특정 프레임워크/패턴 용 가이드라인
A. 자동 직렬화 (예: System.Text.Json)
1.
자동 직렬화에 사용할 데이터는 class로 정의한다
2.
자동 직렬화 용 class 파일에는 특정 직렬화 라이브러리 전용 attribute를 넣지 않는다
3.
자동 직렬화 용 class의 데이터는 언제나 public 자동 프로퍼티를 사용한다. (프로퍼티와 멤버 필드의 1:1 대칭 관계)
4.
자동 직렬화 용 class에 읽기 전용 프로퍼티가 필요한 경우, 그 대신 public 메서드를 만든다
5.
자동 직렬화 용 class의 public 생성자는 언제나 하나만 두며, 이 생성자는 매개변수를 받지 않는다
6.
자동 직렬화 함수(예: JsonSerializer.Serialize<>())를 직접 호출하지 않는다. 그 대신 wrapper 함수를 만들어 직렬화 함수에 넣을 수 있는 매개변수의 자료형을 통제한다.
B. XAML 컨트롤
1.
컨트롤의 이름(예: x:name)은 정말 필요한 경우에만 만든다..
2.
컨트롤의 변수명 앞에는 x를 붙인다.
xLabelName
C#
복사
3.
컨트롤의 변수명 앞에는 컨트롤 종류도 붙인다.
xLabelName
xButtonAccept
C#
복사
C. ASP .NET Core
1.
REST API의 요청 바디(request body)용으로 DTO(Data Transfer Object, 데이터 전송 개체)를 만들 때, 각 값형 프로퍼티를 nullable로 만들어 모델 유효성 검증(model validation)이 자동으로 이뤄지게 한다.
[Required]
public Guid? ID { get; set; }
C#
복사
2.
컨트롤러 메서드에서 요청에서 처음으로 할 일은 입력값 검증이다. 이 검증을 통과하면 모든 입력값은 유효한 것으로 간주한다. 따라서 [required] 애트리뷰트가 달린 nullable 속성은 그 후 부터는 모두 null이 아니다.
3.
위 원칙과는 달리 [RouteParam] 애트리뷰트가 달린 변수는 ?를 가지지 않는다.
public bool GetUser([RouteParam]Guid userID)
C#
복사
I. Unity 특화 메인 코딩 표준
A. 기본 명명 규칙 (C# 표준 기반)
1.
클래스와 구조체의 이름은 파스칼 표기법을 따른다.
public class PlayerController : MonoBehaviour
public struct WeaponData
C#
복사
2.
MonoBehaviour를 상속하는 클래스는 목적에 따라 접미사를 붙인다.
public class PlayerController : MonoBehaviour // 제어 로직
public class EnemyAI : MonoBehaviour // AI 로직
public class HealthBar : MonoBehaviour // UI 컴포넌트
public class AudioManager : MonoBehaviour // 매니저 클래스
C#
복사
3.
ScriptableObject를 상속하는 클래스는 접미사로 Data 또는 Config를 붙인다.
[CreateAssetMenu(fileName = "New Weapon", menuName = "Game/Weapon Data")]
public class WeaponData : ScriptableObject
[CreateAssetMenu(fileName = "Game Config", menuName = "Game/Config")]
public class GameConfig : ScriptableObject
C#
복사
4.
Unity 이벤트 함수들은 별도의 주석 없이도 알아볼 수 있도록 순서를 지킨다.
B. 변수 및 프로퍼티 명명
1.
SerializeField 속성을 가진 private 필드는 카멜 표기법을 따르며 접두사를 붙이지 않는다.
[SerializeField] private float moveSpeed = 5.0f;
[SerializeField] private GameObject bulletPrefab;
[SerializeField] private AudioClip jumpSound;
C#
복사
2.
Unity 컴포넌트를 참조하는 변수는 컴포넌트 타입을 알 수 있게 명명한다.
private Rigidbody playerRigidbody;
private Animator characterAnimator;
private AudioSource audioSource;
private Transform cameraTransform;
C#
복사
3.
GameObject를 참조하는 변수는 Object 접미사를 붙인다.
[SerializeField] private GameObject bulletObject;
[SerializeField] private GameObject playerObject;
private GameObject currentTargetObject;
C#
복사
4.
UI 요소를 참조하는 변수는 UI 컴포넌트 타입을 포함한다.
[SerializeField] private Button startButton;
[SerializeField] private Slider healthSlider;
[SerializeField] private Text scoreText;
[SerializeField] private Image healthBarImage;
C#
복사
C. Unity 생명주기 메서드 순서
1.
Unity 생명주기 메서드들은 다음 순서로 배치한다.
public class PlayerController : MonoBehaviour
{
// 필드 및 프로퍼티
[SerializeField] private float moveSpeed = 5.0f;
private Rigidbody playerRigidbody;
// Unity 생명주기 메서드 (실행 순서대로)
private void Awake()
{
}
private void Start()
{
}
private void FixedUpdate()
{
}
private void Update()
{
}
private void LateUpdate()
{
}
private void OnDestroy()
{
}
// 커스텀 메서드들
private void Move()
{
}
}
C#
복사
2.
Unity 이벤트 함수들은 virtual로 선언하지 않는다. 오버라이드가 필요한 경우 별도의 메서드를 만든다.
틀린 방식:
protected virtual void Update()
{
}
C#
복사
올바른 방식:
private void Update()
{
UpdateLogic();
}
protected virtual void UpdateLogic()
{
}
C#
복사
D. 성능 관련 규칙
1.
GameObject.Find(), GameObject.FindWithTag() 등의 검색 함수는 초기화 시에만 사용한다.
틀린 방식:
private void Update()
{
GameObject player = GameObject.FindWithTag("Player"); // 매 프레임 검색
}
C#
복사
올바른 방식:
private GameObject playerObject;
private void Start()
{
playerObject = GameObject.FindWithTag("Player"); // 한 번만 검색
}
C#
복사
2.
컴포넌트 참조는 Awake() 또는 Start()에서 캐싱한다.
private Rigidbody cachedRigidbody;
private Transform cachedTransform;
private void Awake()
{
cachedRigidbody = GetComponent<Rigidbody>();
cachedTransform = transform; // transform 프로퍼티도 캐싱
}
C#
복사
3.
Update() 내에서 할당을 최소화한다. 특히 new 키워드 사용을 피한다.
틀린 방식:
private void Update()
{
Vector3 newPosition = new Vector3(x, y, z); // 매 프레임 할당
}
C#
복사
올바른 방식:
private Vector3 tempPosition; // 필드로 선언
private void Update()
{
tempPosition.Set(x, y, z); // 재사용
}
C#
복사
4.
문자열 연결 시 StringBuilder를 사용하거나 string.Format(), $"" 보간을 활용한다.
E. Coroutine 관련 규칙
1.
Coroutine 메서드는 접미사로 Coroutine을 붙인다.
private IEnumerator FadeInCoroutine()
{
yield return null;
}
private IEnumerator MoveToTargetCoroutine(Vector3 target)
{
yield return null;
}
C#
복사
2.
Coroutine 참조를 저장할 때는 null 체크와 함께 정리한다.
private Coroutine moveCoroutine;
private void StartMoving()
{
if (moveCoroutine != null)
{
StopCoroutine(moveCoroutine);
}
moveCoroutine = StartCoroutine(MoveToTargetCoroutine(targetPosition));
}
private void OnDestroy()
{
if (moveCoroutine != null)
{
StopCoroutine(moveCoroutine);
}
}
C#
복사
F. 이벤트 및 액션 관련
1.
Unity Action과 C# Event는 다음과 같이 명명한다.
public static event System.Action<int> OnScoreChanged;
public static event System.Action OnGameOver;
[System.Serializable]
public class PlayerEvent : UnityEvent<Player> { }
[SerializeField] private PlayerEvent onPlayerSpawned;
C#
복사
2.
이벤트 구독/해제는 반드시 쌍을 맞춘다.
private void OnEnable()
{
GameManager.OnGameStart += HandleGameStart;
}
private void OnDisable()
{
GameManager.OnGameStart -= HandleGameStart;
}
C#
복사
G. 에디터 관련
1.
인스펙터에서 수정 가능한 값들은 적절한 범위와 툴팁을 제공한다.
[Header("Movement Settings")]
[SerializeField, Range(1f, 10f), Tooltip("캐릭터의 이동 속도")]
private float moveSpeed = 5.0f;
[SerializeField, Range(0f, 1f)]
private float jumpHeight = 0.5f;
[Space(10)]
[Header("Audio")]
[SerializeField] private AudioClip jumpSound;
C#
복사
2.
에디터 전용 코드는 #if UNITY_EDITOR 블록으로 감싼다.
#if UNITY_EDITOR
[UnityEditor.MenuItem("Tools/Reset Player Position")]
private static void ResetPlayerPosition()
{
// 에디터 전용 기능
}
#endif
C#
복사
II. Unity 특화 소스 코드 포맷팅
1.
SerializeField 속성이 있는 필드들은 관련된 것끼리 그룹화한다.
[Header("Movement")]
[SerializeField] private float moveSpeed = 5.0f;
[SerializeField] private float jumpForce = 10.0f;
[Header("Audio")]
[SerializeField] private AudioClip jumpSound;
[SerializeField] private AudioClip landSound;
C#
복사
2.
컴포넌트 참조와 설정값을 분리해서 배치한다.
// 컴포넌트 참조
private Rigidbody playerRigidbody;
private Animator playerAnimator;
// 설정값
[SerializeField] private float moveSpeed = 5.0f;
[SerializeField] private float jumpForce = 10.0f;
C#
복사
III. Unity 프로젝트 설정 관련
1.
폴더 구조는 다음과 같이 구성한다.
Assets/
├── Scripts/
│ ├── Player/
│ ├── Enemies/
│ ├── Managers/
│ ├── UI/
│ └── Utilities/
├── Art/
│ ├── Models/
│ │ ├── Characters/
│ │ ├── Environment/
│ │ └── Props/
│ ├── Sprites/
│ │ ├── Characters/
│ │ ├── UI/
│ │ └── Environment/
│ ├── Animations/
│ │ ├── Characters/
│ │ └── UI/
│ ├── Materials/
│ ├── Textures/
│ └── Effects/
│ ├── Particles/
│ └── VFX/
├── Audio/
│ ├── Music/
│ ├── SFX/
│ └── Voice/
├── Prefabs/
│ ├── Characters/
│ ├── Environment/
│ ├── UI/
│ └── Weapons/
├── Scenes/
│ ├── Development/
│ └── Production/
├── ScriptableObjects/
│ ├── Characters/
│ ├── Items/
│ └── Settings/
├── Fonts/
├── Shaders/
├── Resources/
├── StreamingAssets/
└── Plugins/
└── ThirdParty/
Plain Text
복사
2.
각 폴더의 용도는 다음과 같다.
Scripts/: 모든 C# 스크립트 파일
•
기능별로 하위 폴더 구분
Art/: 모든 아트 관련 에셋
•
Models/: 3D 메쉬 파일 (.fbx, .obj 등)
•
Sprites/: 2D 이미지 파일 (.png, .jpg 등)
•
Animations/: 애니메이션 클립과 컨트롤러
•
Materials/: 머티리얼 파일
•
Textures/: 텍스처 파일 (알베도, 노말, 메탈릭 등)
•
Effects/: 파티클 시스템, VFX Graph
Audio/: 모든 오디오 파일
•
Music/: 배경음악 (.mp3, .ogg)
•
SFX/: 효과음
•
Voice/: 보이스 오버
Prefabs/: 게임 오브젝트 프리팹
•
카테고리별로 하위 폴더 구분
Scenes/: Unity 씬 파일
•
Development/: 개발용 테스트 씬
•
Production/: 실제 게임 씬
ScriptableObjects/: ScriptableObject 에셋 파일
Fonts/: 폰트 파일 (.ttf, .otf)
Shaders/: 커스텀 셰이더 파일
Resources/: Runtime에 동적 로딩할 에셋
•
꼭 필요한 경우에만 사용 (성능상 불리)
StreamingAssets/: 빌드 시 그대로 복사되는 파일
Plugins/: 외부 라이브러리 및 네이티브 플러그인
3.
Scene 이름은 파스칼 표기법을 따른다.
MainMenu.unity
GamePlay.unity
LoadingScene.unity
Plain Text
복사
4.
Prefab 이름은 용도와 카테고리를 명확히 한다. 언더바(_) 대신 파스칼 표기법을 사용한다.
// 캐릭터
Player.prefab
EnemyGoblin.prefab
NPCMerchant.prefab
// 환경
BuildingHouse.prefab
TerrainMountain.prefab
// UI (접두사로 구분)
UIHealthBar.prefab
UIMainMenu.prefab
UIInventorySlot.prefab
// 아이템
PickupCoin.prefab
WeaponSword.prefab
ConsumableHealthPotion.prefab
// 이펙트
EffectExplosion.prefab
VFXFire.prefab
Plain Text
복사
5.
아트 에셋 명명 규칙: 타입 접두사 + 파스칼 표기법 사용
// 텍스처 (T 접두사)
TCharacterNameAlbedo.png
TCharacterNameNormal.png
TCharacterNameMetallic.png
// 머티리얼 (M 접두사)
MCharacterName.mat
MEnvironmentGrass.mat
// 3D 모델 (SM: Static Mesh, SK: Skeletal Mesh)
SMCharacterName.fbx
SKCharacterName.fbx
// 애니메이션 (A 접두사, AC: Animator Controller)
ACharacterNameIdle.anim
ACharacterNameWalk.anim
ACCharacterName.controller
// 스프라이트 (S 접두사)
SUiButton.png
SCharacterIcon.png
// 오디오 (음성: V, 음악: MU, 효과음: SF)
VPlayerJump.wav
MUMainTheme.ogg
SFExplosion.wav
Plain Text
복사
참조문서
Unity Best Practices Guide
Unity Performance Guidelines
기본 C# 코딩 표준