Unity - Scripting API: GameObject.SetActive

A GameObject may be inactive because a parent is not active. In that case, calling SetActive will not activate it, but only set the local state of the GameObject, which you can check using GameObject.activeSelf. Unity can then use this state when all paren

docs.unity3d.com

 

Unity - Scripting API: Behaviour.enabled

Success! Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable. Close

docs.unity3d.com

기능 요약

GameObject.SetActive : 오브젝트를 활성화, 비활성화를 하는 역할을 합니다. 오브젝트를 비활성화 시키면 오브젝트 자체가 씬, 게임뷰에서 사라지고 작동하지 않습니다.

 

Behaviour.enabled : 오브젝트에 추가되어 있는 컴포넌트를 활성화 및 비활성화시킵니다. 특정 기능을 만들 때 지정한 컴포넌트만 비활성화 시켜서 기능을 잠시 정지시키는 용도로 사용가능합니다. 

 

SetActive

SetActive는 주어진 bool값에 따라 게임 오브젝트를 활성화 / 비활성화 합니다.

 

만약 게임오브젝트가 비활성화 되어 있다면 그 게임오브젝트의 부모 게임오브젝트가 비활성화 되어있을 수도 있습니다. 이런 경우에는 SetActive()를 호출하여 활성화시킬 수 없고 GameObject.activeSelf를 사용하여 GameObject의 로컬 상태만 확인할 수 있습니다. Unity에서는 부모가 활성화 될 때 이 SetActive로 상태값을  사용할 수 있습니다.

 

함수 형태

public void SetActive(bool value);

 

사용 형태

GameObject.SetActive(false or true)

 

+@ SetActive / GameObject.activeSelf

public bool activeSelf;

해당하는 GameObject의 local active state입니다. (읽기 전용)

 

activeSelf는 해당하는 게임오브젝트의 local active state를 return합니다. 즉, 현재 Object가 인스펙터창에서 체크가 되어 있는지 안되어 있는지 확인할 수 있습니다. GameObject.activeSelf값은 GameObject.SetActive 함수를 사용하여 값을 설정할 수 있습니다.

<GameObject의 체크박스>

 

activeSelf를 사용한 코드 예시

if (gameObject.activeSelf == true) // 게임오브젝트가 SetActive(true)인 경우

if (gameObject.activeSelf == false) // 게임오브젝트가 SetActive(false)인 경우

 

주의점

 선택한 게임오브젝트의 GameObject.activeSelf가 만약 true를 반환하더라도, 부모 게임오브젝트가 활성화 되어 있지 않으면 게임오브젝트는 비활성화 되어 있습니다.

 

요약

 Gameobject.activeSelf는 bool로 GameObject가 활성화된 상태(true), 비활성화 된 상태(false) 두 개의 값을 가집니다. activeSelf를 통해 값을 변경할 수는 없지만, 이 값을 응용해서 상태에 맞는 코드를 수행할 수 있습니다. 

 

+@ SetActive / GameObject.activeInHierarchy

 게임 오브젝트가 씬에서 활성화되어 있는지 여부를 정의합니다.

 

이를 통해 GameObject가 게임에서 활성화되었는지 여부를 알 수 있습니다. GameObject.activeSelf 프로퍼티와 모든 부모 프로퍼티가 활성화 된 경우입니다.

 

사용 예제

 

왼쪽 : 처음 게임플레이를 시작했을 때 환경.

오른쪽 : 마우스 왼쪽버튼을 클릭했을 때 SetActive(false)가 실행되어 사라진 모습.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
    private GameObject cube;

    void Start()
    {
        cube = GameObject.Find("Cube");
    }

    void Update()
    {
        if(Input.GetMouseButtonDown(0)) // 마우스 왼쪽 클릭
        {
            cube.SetActive(false);
        }
        if(Input.GetMouseButtonDown(1)) // 마우스 오른쪽 클릭
        {
            cube.SetActive(true);
        }
    }
}

주의점

 왼쪽버튼을 클릭하여, Cube게임오브젝트를 SetActive(false)했을 때, 마우스 오른쪽 클릭을 하면 게임오브젝트가 활성화 되지 않습니다. 즉, 게임오브젝트가 비활성화 상태일 때 다시 활성화를 시키려면 다른 방법으로 해결해야합니다.

 

이에 대한 방법은 다음 링크에 있습니다.

https://artiper.tistory.com/114


 

Behaviour.enabled

Object

-> Component

 -> Behaviour //여기

  -> MonoBehaviour

 

 위와 같은 상속구조중 Behaviour 클래스에 있는 속성값입니다. enabled된 Behaviours는 업데이트되고, disabled되있는 Behaviours는 업데이트 되지 않습니다. enable된 상태인지 아닌지는 behaviour의 인스펙터에서 작은 체크박스를 보면 알 수 있습니다. (컴포넌트가 활성화 된지, 안된지를 의미하는 것)

 

<컴포넌트의 체크박스>

사용예제

 

public class NewBehaviourScript : MonoBehaviour
{
    private BoxCollider boxTest;

    void Start()
    {
        boxTest = FindObjectOfType<BoxCollider>();
    }

    void Update()
    {
        if(Input.GetMouseButtonDown(0)) // 마우스 왼쪽 클릭
        {
            boxTest.enabled = false;
        }
        if(Input.GetMouseButtonDown(1)) // 마우스 오른쪽 클릭
        {
            boxTest.enabled = true;
        }
    }
}

 해당 스크립트 파일을 Cube 게임오브젝트에 넣었으며, 큐브 게임오브젝트는 Rigidbody와 Box Collider컴포넌트를 가지고 있습니다. 위 코드는 Cube게임오브젝트의 Box Collider컴포넌트에 대한 참조를 가져오고, 마우스 왼쪽 버튼을 클릭했을 때 Box Collider가 비활성화 되도록 만든 기능입니다. 오른쪽 버튼을 클릭하면 다시 enabled가 true가 되어 Box Collider가 활성화됩니다.

 

왼쪽 : 큐브가 플레인위에 가만히 있는 모습.

오른쪽 : 마우스 클릭으로 인해 큐브의 Box Collider가 꺼지자, 아래로 떨어지는 모습.
(아래로 떨어지는 것은 Rigidbody 컴포넌트의 영향을 받아서 그렇습니다.)

 

떨어지는 중간에 마우스 우클릭을 하여 다시 큐브의 Box Collider를 활성화 시킨 모습.

 

즉, Behaviour.enabled의 속성은 컴포넌트를 on, off할 때 사용할 수 있습니다.