부트캠프

[멋쟁이사자처럼 유니티 TIL] 접근 제한자 개념, 에디터 스크립팅

맛난과자 2024. 6. 15. 00:22

접근제한자

 

: 변수 선언 시 해당 변수에 대한 접근의 범위를 정하는 키워드이다.

 

 

● 종류 및 특징

 

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' 에 스크립트 이름을 검색하면 스크립트임에도 기능을 가지는 컴포넌트가 생성된다.

 

 

 

 

 


 

 

 

에디터 스크립팅 재밌다.

유니티는 이제 내꺼다.

 

사실 이거 어제 배운 내용이다.

오늘 배운 건 내일 쓸 거다.