안녕하세요 ~ 솔루션입니다. 오늘은 오브젝트를 활성화, 비활성화 하는 방법을 올리려고 합니다 !
먼저 오브젝트라는 건 아주 쉽고 포괄적으로 이야기 하면 Hierachy창에 있는 모든 것을 말합니다. UI, 3D Object, Effect, Light,... 등이 모두 오브젝트 입니다. 확실하게 따지면 다른거지만 활성화, 비활성화를 쉽게 설명하기 위해 저렇게 따질게요. 그러면 Hierachy에 있는 그 어떤 것을 누르던 인스펙터 창에 오브젝트명 좌측에있는 체크박스가 존재합니다. 저 체크박스가 체크되어 있다면 존재하는 활성화 상태이고 체크가 해제되어 있다면 존재하지 않는 비활성화 상태입니다. 만약 저 'Cube'에 체크되어 있는 걸 해제 시킨다면 'Cube'에 들어가 있는 모든 컴포넌트 (스크립트 포함)의 기능이 없는 것으로 인식됩니다. 기본적으로 우리 눈에 씬뷰, 게임뷰에 보이는 모든 오브젝트들은 Material을 가지고 있습니다. 간단하게 말하면 재질같은 것인데 이게 있기 때문에 우리 눈에 보이는 것 입니다. 때문에 저 상태에서 체크박스를 해제하면 포함되어 있는 컴포넌트도 다 없는 것으로 인식되기 때문에 'Material' 컴포넌트도 없는 것으로 인식되어 우리 눈에 보이지 않게 됩니다.
말이 길었지만 아주아주아주 간단하게 정리하자면
활성화는 존재하는 것을 그대로 존재하게 해주는 것
비활성화는 존재하지만 없는 것 처럼 해주는 것
입니다.
생각치 않게 설명이 길었네요. 이번 포스팅에선 그냥 간단하게 보이지 않게하고, 보이게 하는 것을 하려고 합니다. (원래는 Mesh Renderer만 없애도 눈에 보이지 않지만 시각적으로 오브젝트 활성화, 비활성화를 설명하기 위해 가장 편한 '사라진다', '생긴다' 로 설명할게요 !)
원래는 간단하게 원하는 오브젝트를 클릭하고 해당 인스펙터 창에서 체크박스를 누르면 되지만 프로젝트를 진행중인 개발자나 가능하지 실제로 플레이어들은 불가능합니다. 때문에 스크립트를 통해서 변경되도록 할게요.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | using System.Collections; using System.Collections.Generic; using UnityEngine; public class SetActive : MonoBehaviour { private bool state; // Use this for initialization void Start () { state = true; } // Update is called once per frame void Update () { if (Input.GetMouseButtonDown(0)) { print("마우스 입력 받았음"); if (state == true) { gameObject.SetActive(false); print("사라져"); state = false; } else { gameObject.SetActive(true); print("생겨나"); state = true; } } } } | cs |
스크립트 상에서 코딩을 해줍니다.
오브젝트를 활성화, 비활성화 시켜주는 건 'SetActive(true);' 이 아이 입니다.
true는 활성화를 시키라는 거고 false는 비활성화 시키는 거에요 !
저는 마우스 좌클릭을 하면 비활성화 상태일 경우 활성화로, 활성화 상태일 경우 비활성화로 만들꺼에요.
활성화 / 비활성화 하려는 오브젝트에 넣고
클릭하면 오브젝트가 비활성화 되어 사라집니다 ! (저는 보여드리기 위해 콘솔창에 조건문이 발동된다면 로그가 뜨게 만들어놔서 콘솔창에 나오는 겁니다.)
하지만 다시 좌클릭을 하면 스크립트 상에서 '비활성화인 상태일 때 마우스 좌클릭을 한다면 활성화인 상태로 만들어라' 라는 조건문이 실행되어야 하는데 되지 않습니다 . 왜냐하면 앞서 초반부에 설명한 '오브젝트가 비활성화 된다면 오브젝트에 포함되어 있는 모든 컴포넌트(스크립트 포함)도 비활성화 됩니다.' 때문이죠 !
간단하게 말하면 오브젝트 비활성화가 실행되는 순간 '다시 클릭하면 활성화' 하는 스크립트도 비활성화 되버리니 실행이 되지 않는겁니다 !
(이거 때문에 굳이 앞에서 길게 설명하게 된겁니다 .. ㅠ)
때문에 다시 생겨나게 하는 것도 구현하고 싶으면 렌더러 컴포넌트만 비활성화,활성화 시켜서 보이게, 안보이게만 하거나 원하는 오브젝트를 찾거나 받아서 적용되게 해야합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | using System.Collections; using System.Collections.Generic; using UnityEngine; public class SetActive : MonoBehaviour { private bool state; public GameObject Target; // Use this for initialization void Start () { state = true; } // Update is called once per frame void Update () { if (Input.GetMouseButtonDown(0)) { print("마우스 입력 받았음"); if (state == true) { Target.SetActive(false); print("사라져"); state = false; } else { Target.SetActive(true); print("생겨나"); state = true; } } } } | cs |
예를들면 스크립트에서 인스펙터 창에서 편하게 바꿀 수 있도록 public 으로 Gameobject를 선언하고 SetActive를 Target에 대한 명령으로 바꾸면 됩니다.
스크립트를 수정하고 스크립트를 다른 오브젝트에 (저는 Plane 오브젝트에 넣었습니다.) 넣고 타겟에 Cube(명령을 적용시키고 싶은 오브젝트)를 끌어다 넣고 실행시키면
이런식으로 실행됩니다 !
스크립트는 별거아닌 주제였는데 컴포넌트가 사라진다는 걸 설명하려다 보니 쓸떼없이 길어졌네요 ! 조금이나마 도움에 되셨으면 좋겠습니다.
'Unity (C#) > Old' 카테고리의 다른 글
유니티 마우스 이벤트 알아보기 (1) (0) | 2018.08.14 |
---|---|
유니티 오브젝트간 거리 알아내기 (2) | 2018.08.13 |
유니티 캐릭터 움직이기 (0) | 2018.08.07 |
유니티 제한시간/누적시간 만들기 (0) | 2018.08.06 |
유니티 함수 지연 실행하기 (Invoke) (2) | 2018.08.05 |
최근댓글