01 Destroy (Component);
✅ Destroy();
: 오브젝트 삭제 함수로 매개변수에 입력되어 있는 오브젝트 혹은 컴포넌트를 삭제한다.
💡 Tip
게임을 진행하는 도중 플레이어의 공격을 받아 사망하는 적 오브젝트, 플레이어와 부딪혀 플레이어가 획득하게 되는 아이템 오브젝트와 같이 게임에서 영구적으로 사라져야 할 때 Destroy() 함수를 이용해 삭제하게 된다.
📌 예제 코드
▶ 컴포넌트도 삭제가 가능하다는 것을 보여주기 위해 Destroy(Component);를 예제에서 사용하고 있지만 playerObject.GetComponent<PlayerController>().enabled = false; 와 같이 컴포넌트를 삭제하지 않고 꺼두는 것을 더 권장한다.using UnityEngine; public class DestroySample : MonoBehaviour { [SerializeField] private GameObject playerObject; private void Awake() { Destroy(playerObject.GetComponent<PlayerController>()); } }
해당 코드를 실행시키기 위해 빈 오브젝트를 하나 생성하고 'DestroySample'이라고 이름을 변경한 후에 스크립트 코드를 컴포넌트로 설정해준다. 또한 해당 컴포넌트의 'Player Object' 부분에 'Player' 게임 오브젝트를 삽입하여 준다.
▶ Hierarchy View의 "Player" 게임 오브젝트를 PlayerObject 변수에 등록하였기 때문에 DestroySample 클래스 내부의 PlayerObject는 "Player" 게임 오브젝트를 뜻한다.
이후 게임을 실행시켜보면 Player 오브젝트의 Player Controller 컴포넌트가 사라진 것을 확인할 수 있다.
02 Destroy(GameObject);
게임 오브젝트를 삭제하고자 아래 예제코드와 같이 매개변수에 삭제하고 싶은 오브젝트 명을 작성해주면 해당하는 게임 오브젝트를 삭제할 수 있다.
📌 예제 코드
using UnityEngine; public class DestroySample : MonoBehaviour { [SerializeField] private GameObject playerObject; private void Awake() { Destroy(playerObject); } }
이후 게임을 실행하면 Player 오브젝트 자체가 사라진 것을 볼 수 있었다.
03 Destroy(GameObject, time);
✅ Destroy(GameObject, time);
: 게임 오브젝트를 time 시간만큼 흐른 뒤에 삭제한다.
📌 예제 코드
using UnityEngine; public class DestroySample : MonoBehaviour { [SerializeField] private GameObject playerObject; private void Awake() { Destroy(playerObject, 2.0f); } }
예제 코드 작성 후, 게임을 실행시켜 보니 아래와 같이 Player 오브젝트가 바로 삭제되는 것이 아닌 2초 후에 삭제되는 것을 확인할 수 있다.
04 위치 기반 오브젝트 삭제
📌 예제 코드
using UnityEngine; public class PositionAutoDestroy : MonoBehaviour { private Vector2 limitMin = new Vector2(-7.5f, -4.5f); private Vector2 limitMax = new Vector2(7.5f, 4.5f); private void Update() { if (transform.position.x < limitMin.x || transform.position.x > limitMax.x || transform.position.y < limitMin.y || transform.position.y > limitMax.y) { Destroy(gameObject); } } }
코드를 작성하고 각각 Box, Circle, Triangle 오브젝트에 PositionAutoDestroy 코드를 컴포넌트로 설정해주고 우선 DestroySample 오브젝트는 잠깐 꺼둔 후 게임을 실행해보자.
게임 실행 결과, 화면 밖으로 나가는 오브젝트들은 하나씩 삭제되는 것을 볼 수 있다.
05 충돌 기반 오브젝트 삭제
충돌 기반 오브젝트 삭제 실습을 위해 아래와 같이 충돌할 벽 오브젝트를 하나 생성한다.
해당 오브젝트의 위치와 크기를 적절하게 설정해주고 충돌하기 때문에 'Rigidbody 2D' 컴포넌트를 설정해두고 Gravity Scale은 0으로 바꿀 수 있다.
또한, Box Collider 2D도 추가해주는데 이때, on Trigger Enter 함수를 호출할 수 있도록 'is Trigger' 체크를 해준다. 이후 해당 벽에 플레이어가 총알을 쏠 것이므로 Circle 프리팹에도 'Box Collider 2D'를 추가해준다.
벽에 부딪혔을 때 오브젝트의 변화를 아래 예제 코드와 같이 작성해줄 수 있다.
📌 예제 코드
using System.Collections; using UnityEngine; public class Wall : MonoBehaviour { private SpriteRenderer spriteRenderer; private void Awake() { spriteRenderer = GetComponent<SpriteRenderer>(); } private void OnTriggerEnter2D(Collider2D collision) { Destroy(collision.gameObject); StartCoroutine("HitAnimation"); } private IEnumerator HitAnimation() { spriteRenderer.color = Color.red; yield return new WaitForSeconds(0.1f); spriteRenderer.color = Color.white; } }
작성한 코드를 Wall 오브젝트의 컴포넌트로 넣고 게임을 실행하면, 아래와 같이 총알과 벽이 부딪혔을 때 벽의 색상이 잠시 변경되고, 두 오브젝트가 충돌하는 것을 확인할 수 있다. 이후 벽에 부딪힌 총알 오브젝트는 삭제된다.
출처 : 따라하면서 배우는 고박사의 유니티 기초(https://inf.run/sgcy)
'Study > Unity' 카테고리의 다른 글
[Unity 2D Basic] 2D Sprite / Animation (0) | 2024.05.01 |
---|---|
[Unity 2D Basic] 플랫폼 게임에서의 플레이어 이동, 점프 구현 (0) | 2024.05.01 |
[Unity 2D Basic] Instantiate() 활용 예제 (0) | 2024.04.16 |
[Unity 2D Basic] 게임 오브젝트 생성 함수 (0) | 2024.04.16 |
[Unity 2D Basic] 게임 오브젝트 물리와 충돌 (0) | 2024.04.10 |