유니티로 게임을 만들다 보면 "필요한 오브젝트를 언제, 어디서, 어떻게 만들어야 할까?"라는 고민을 자주 하게 됩니다.
예를 들어, 총알이 발사될 때 새로운 총알 오브젝트를 만들어야 하고, 적 캐릭터가 쓰러지면 그 캐릭터를 삭제해야 하죠
이때 유니티에서는 Instantiat()함수로 오브젝트를 생성하고 Destroy() 함수로 삭제할 수 있습니다.
이번 글에서는 쉽게 오브젝트 생성과 삭제의 기본 원리를 알아보도록 하겠습니다.
씬을 실행시키고 스페이스 바를 눌렀을 때 큐브가 추가됩니다.
그리고 일정 시간(3초) 후 큐브는 사라집니다.
이건 코드를 만든 다음 빈 오브젝트를 만들고 추가한 상태입니다.
먼저 공유해드린 코드는 빈 오브젝트를 만들고 거기에 추가해 주세요
using UnityEngine;
public class ObjectCreator : MonoBehaviour
{
public GameObject cubePrefab; // 생성할 오브젝트(프리팹)
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
Instantiate(cubePrefab, new Vector3(0, 1, 0), Quaternion.identity);
}
}
}
그리고 아래 코드는 큐브에 컴포넌트를 추가해 주세요
using UnityEngine;
public class ObjectRemover : MonoBehaviour
{
void Start()
{
Destroy(gameObject, 3f); // 3초 뒤 삭제
}
}
그럼 정리해보도록 하겠습니다
Instantiate 함수로 만든 오브젝트는 어디에 저장될까요?
> 지정한 위치(Position)와 회전 값(Rotation)에 생성됩니다.
프리팹이 꼭 있어야 할까요?
> 아니요/ 이미 씬에 있는 오브젝트도 원본으로 사용할 수 있습니다.
Destroy를 쓰면 바로 사라지나요?
> 시간을 지정하지 않으면 즉시 사라집니다.
총알처럼 여러 개 빠르게 생성해도 될까요?
> 생성할 수 있습니다. 하지만 너무 많이 생성하면 성능에 문제가 생길 수 있습니다.
Instantiate로 만든 오브젝트 이름은 바꿀 수 있을까요?
> newObject.name = "새 이름"; 으로 변경할 수 있습니다.
Destroy를 호출해도 삭제가 안 될 때가 있는데 왜일까요?
> 코드에서 다른 객체를 참조하고 있거나, Prefab 자체를 Destroy 하려고 하면 안 됩니다.
Destroy 대신 SetaActive(false)를 쓰면 다른 점이 있을까요?
> Destroy()는 메모리에서 삭제하지만, SetActive(false)는 비활성화만 합니다.
일정 시간마다 오브젝트를 자동 생성하려면 어떻게 해야 할까요?
> InvokeRepeating()이나 코루틴(Coroutine)을 활용하면 됩니다.
삭제된 오브젝트는 다시 살릴 수 있을까요?
> 삭제되면 복구가 불가능합니다. 필요하다면 SetActive(false)로 비활성화를 고려하세요
Instantitate와 Destroy를 너무 자주 쓰면 게임이 느려질까요?
> 최적화를 위해 오브젝트 풀링(Object Pooling)기법을 활용하는 것이 좋습니다.
유니티에서 오브젝트를 생성하는 방법과 삭제하는 방법에 대해서 간략하게 살펴봤습니다.
Instantiate() > 오브젝트 만들기, Destroy() > 오브젝트 지우기
게임 개발에서 가장 자주 쓰이는 기본 기능이므로 꼭 이해하고 연습하는 걸 추천합니다.
특히 총알, 아이템, 적 캐릭터처럼 생겼다가 사라지는 오브젝트에 많이 활용되니 직접 여러 가지 예제를 만들면서 연습하는 걸 추천해 드립니다.
읽어주셔서 감사합니다. 추가로 궁금하신 내용이 있으시다면 하단의 글을 참고해 주세요
[Unity] Unity Rigidbody로 물리 적용하는 방법
[Unity] 유니티 컴포넌트가 뭐야? 초보자도 5분 만에 이해하는 핵심 정리
[Unity] 유니티 완전 초보를 위한 C# 스크립트 가이드