본문

[Unity] SerializeField와 HideInInspector

[Unity] SerializeField와 HideInInspector 


유니티의 가장 강력한 기능이 무엇이냐 물어본다면

여러가지 이유를 말 할 수있지만 나는 그 중에서 유니티의 에디트 기능을 말하고 싶다.


유니티의 에디트의 기능은 놀랍다.

그 이유는 실행 중에 변수의 값을 변경하여 사용자가 이것 저것 테스트를 해볼 수 있다는 점이다.


cocos2d-x의 예를 들면 적의 이동 속도를 조절 하기 위해 변수의 값을 변경하고 

다시 컴파일을 해야 한다. 이것이 한두번 이면 용납 가능하지만 수십번의 테스트를 하려면

수십번의 컴파일이 필요하고 컴파일의 대한 시간도 같이 들어 간다.


유니티에서는 이 부분을 변수를 Public으로 선언하여 에디터에서 컴파일을 하지 않고 

런타임 중에 변수의 값을 변경하여 테스트를 해볼 수 있다는 것이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Car : MonoBehaviour {
 
    // 에디터에 노출되어 수정 가능 합니다 
    public float velocity = 1.0f;
 
    // 에디터에 노출되지 않아 수정 불가능 합니다 
    private int level = 1;
 
    // Use this for initialization
    void Start () {
        
    }
    
    // Update is called once per frame
    void Update () {
        
    }
}
 
cs


위와 같이 velocity 변수는 런타임 중에 에디터에서 수정 가능하지만

level 변수는 에디터에 노출이 되지 않기 때문에 수정이 불가능 한 것이다.


보이는 것과 같이 velocity는 수정가능 하도록 노출이되고 level은 노출이 되지 않는다.


그럼 모두 public로 선언하면 되지!! 라고 말 할 수 있다. 

그러나 모든 변수를 Public으로 선언 한다면? 어떠한 문제가 발생할 것인가

에디터에서 접근 뿐만 아니라 다른 클래스에서도 어디에서도 모두 접근이 가능하다.

이렇게 된다면 많은 인원이 참여하는 프로젝트에서 어떠한 문제가 발생할지 모른다.


그래서 유니티에서 만들어 놓은 것이 SerializeField 이다

SerializeField 사용하여 private 선언하고 다른 곳에선 접근을 막고 에디터에서만 접근이 가능하도록 할 수 있다.


1
2
3
4
    // SerializeField사용 하여 에디터에 노출 되도록 한다 
    [SerializeField]
    private int level = 1;
 
cs


SerializeField 만 선언하였을 뿐인데 아래와 같이 에디터에 모두 노출 된다.

private하게 사용하면서 에디터에선 접근 가능하도록 하는 좋은 기능인 것이다.

(주의할 점은 변수 하나하나 마다 SerializeField를 사용 해주어야 한다.)


반대로 HideInInspector는 public 하게 사용 하면서 에디터에서 수정 불가능 하도록 할 때 사용한다.


1
2
3
    // public 이지만 에디터에 노출 되지 않습니다 
    [HideInInspector]
    public float velocity = 1.0f;
cs


HideInInspector를 사용하면 아래와 같이 public 이지만 에디터에 노출이 되지 않는다.


이렇게 규칙을 정하여 코딩을 하면 위험을 줄이고 효율 적으로 테스트하며 개발을 할 수 있다.


알면 편하고 모르면 위험한? 

SerializeField와 HideInInspector 에 대해서 알아 보았다.


댓글