접근제한자
: 변수 선언 시 해당 변수에 대한 접근의 범위를 정하는 키워드이다.
● 종류 및 특징
private
- 클래스 내에서만 접근 가능하다.
- 외부에서는 호출, 수정 모두 불가능하다.
- 접근제한자를 입력하지 않고 선언 시, private으로 설정된다.
protected
- 상속 받은 클래스들만 접근 가능하다.
- 호출은 가능하나, 수정은 불가능하다.
public
- 접근이 자유롭다.
- 호출과 수정 모두 가능하다.
SerializeField
- private이지만, 유니티 에디터에서 접근과 제어가 가능하다.
internal
- 같은 어셈블리(프로젝트) 에서만 접근이 가능하다.
에디터 스크립팅
: 코드를 입력하여 에디터를 만드는 것이다.


에디터 스크립팅을 통해 나만의 커스텀 에디터 창과 컴포넌트를 만들어보자
메뉴바에 커스텀 에디터 생성 방법
① 프로젝트에 'Editor' 폴더를 추가한다.
② 스크립트를 Editor 폴더 안에 생성한다.
③ 스크립트의 MonoBehaviour 상속을 지우고 EditorWindow 상속
④ 다음과 같은 코드 작성
[MenuItem("Window/MyEditor")] // Window/지어낸에디터이름
public static void ShowEditor()
{
Debug.Log(" YEAH MY CUSTOM EDITOR"); // 원하는 기능 입력
}
MenuItem
- 유니티 에디터의 메뉴바에 새로운 에디터를 생성한다.
- 아래에 원하는 기능을 구현하는 함수를 입력하는 그 기능을 가지는 에디터가 생성된다.
⑤ 'Window' 메뉴바를 클릭하면 본인이 추가한 에디터 이름이 있을 것이다.
그 에디터 클릭 후 기능이 구현되면 된다.

'Window' 부분에 본인이 원하는 이름을 넣으면 해당 이름의 메뉴를 만들 수 있다.
[MenuItem("YammiSnack/GameManagerEditor")] // 지어낸메뉴이름/지어낸에디터이름
public static void ShowMe()
{
Debug.Log("YEAH CUSTOM EDITOR OF YammiSnack");
}

유니티는 이제 내꺼다.
커스텀 에디터 창 생성 방법
이번에는 에디터를 클릭하면 새로운 창이 뜨게 해보자.
① 기존의 코드에
GetWindow<현재 스크립트 이름>(창 제목)
을 추가한다.
[MenuItem("YammiSnack/GameManagerEditor")]
public static void ShowMe()
{
Debug.Log("YEAH CUSTOM EDITOR OF YammySnack");
GetWindow<GameManagerEditor>("GameManagerEditor"); // 추가 코드
}

그치만 허전하죠?
기능 하나쯤은 있어야 할 것 같은 창이죠?
그러니 이 안에 GUI를 넣어보자.
② 기존의 코드에 새로운 함수를 추가한다.
③ 함수 안에 원하는 기능을 넣는다.
private void OnGUI()
{
EditorGUILayout.LabelField("Skill");
jumpPower = EditorGUILayout.IntField("Jump Power", jumpPower);
attackPower = EditorGUILayout.FloatField("Attack Power", attackPower);
skillName = EditorGUILayout.TextField("Skill Name", skillName);
EditorGUILayout.BeginVertical();
if (GUILayout.Button("Sword")) //버튼 추가
Debug.Log("Take up Sword.");
if (GUILayout.Button("Gun"))
Debug.Log("Take up Gun.");
if (GUILayout.Button("Magic Wand"))
Debug.Log("Take up Magic Wand.");
EditorGUILayout.EndVertical();
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("Fire"))
Debug.Log("Fire Attack!");
if (GUILayout.Button("Water"))
Debug.Log("Water Attack!");
if (GUILayout.Button("Thunder"))
Debug.Log("Thunder Attack!");
EditorGUILayout.EndHorizontal();
}
EditorGUILayout
: 에디터 창에 GUI를 넣을 수 있도록 하는 메서드들을 가지는 클래스
IntField(string label, int value)
: 인스펙터 창에 정수 입력 필드를 나타내고, 입력값을 반환하는 메서드
LabelField(string label)
: 인스펙터 창에 레이블을 나타내고, 입력값을 반환하는 메서드
FloatField(string label, float value)
: 인스펙터 창에 실수형 입력 필드을 나타내고, 입력값을 반환하는 메서드
TextField(string label, string text)
: 인스펙터 창에 텍스트 입력 필드을 나타내고, 입력값을 반환하는 메서드
BeginHorizontal(), EndHorizontal()
: 수평 레이아웃 그룹을 시작하고 끝내는 메서드
BeginVertical(), EndVertical()
: 수직 레이아웃 그룹을 시작하고 끝내는 메서드
결과

화려한 GUI를 가진 에디터 완성이다.
인스펙터에 추가할 수 있는 컴포넌트 제작 방법
다음은 컴포넌트를 제작해보자.
① 스크립트를 Editor 폴더 안에 하나, 밖에 하나 생성한다.
② Editor 폴더 안 스크립트의 클래스 선언 위에
[CustomEditor(typeof(바깥 스크립트))]
를 입력한다.
[CustomEditor(typeof(CustomScript))]
CustomEditor
: 커스텀된 UI를 제공하여, 스크립트의 속성을 편집할 수 있게 클래스
Editor 안의 스크립트는 컴포넌트로 만들지 못하기 때문에
커스텀 인스펙터를 적용할 대상 클래스로 바깥의 스크립트를 넣는다.
③ 상속 클래스를 Editor로 바꾼다.
④ Editor 클래스의 OnInspectorGUI 메서드를 오버라이드 하여 원하는 기능을 입력한다.
[CustomEditor(typeof(CustomScript))]
public class GameManagerEditor2 : Editor
{
private string AnimationName;
private float SliderValue;
public override void OnInspectorGUI()
{
// 원하는 기능 입력
AnimationName = EditorGUILayout.TextField("Animation Name", AnimationName);
SliderValue = EditorGUILayout.Slider(SliderValue, 0, 1);
CustomScript manager = (CustomScript)target;
Animator animator = manager.GetComponent<Animator>();
animator.Play(AnimationName, 0, SliderValue);
animator.Update(Time.deltaTime);
}
}
OnInspectorGUI
: 커스텀 인스펙터를 작성할 때 사용하는 메서드
⑥ 유니티 에디터가 런타임에 섞이면 빌드를 못하기 때문에,
폴더 밖 스크립트에 런타임 관련 네임스페이스가 있다면 지운다.
using UnityEditor.UIElements; //지우기
결과

'Add Component' 에 스크립트 이름을 검색하면 스크립트임에도 기능을 가지는 컴포넌트가 생성된다.
에디터 스크립팅 재밌다.
유니티는 이제 내꺼다.
사실 이거 어제 배운 내용이다.
오늘 배운 건 내일 쓸 거다.