유니티 Instantiate 삭제 - yuniti Instantiate sagje

GameObjectObject.Instantiate<GameObject>(GameObject original, Vector3 position, Quaternion rotation)

Instantiate()함수를 사용하면 게임을 실행하는 도중에 게임오브젝트를 생성할 수 있다.

물론 게임이 실행되기 전 미리 만들어놓을 수 있겠지만, 사실상 불가능하다!

만약, RPG 게임이라면 수많은 아이템, 캐릭터, 배경등 모든것들을 어떻게 미리 만들어놓을 수 있을까?

만약, 총을 쏘는 게임이라면 그... 수많은 총알을 어떻게 미리 만들어 놓을 것인가? 

미리 만들어 놓는다는 것은 말도 안된다. 이럴 때는 게임 중에 게임오브젝트를 생성해야 한다.

아니, 생성이 아니라 해당 게임오브젝트의 복제본을 생성한다고 해야 정확할 것이다.

이럴 때 사용하는 함수가 바로 Instantiate() 함수이다. 

ㅇㅣ 함수는 위와 같이 3개의 매개변수를 갖고 있다.

Instantiate(GameObject original ,Vector3 position ,Quaternion rotation)

1. GameObject original

- 생성하고자 하는 게임오브젝트명. 현재 씬에 있는 게임오브젝트나 Prefab으로 선언된 객체를 의미함.

2. Vector3 position

- Vector3으로 생성될 위치를 설정함.

3. Quaternion rotation

- 생성될 게임오브젝트의 회전값을 지정한다. 

- 회전을 굳이 줘야할 상황이 아니라면, 그냥 기본값으로 설정하는 것. --> Quaternion.identity

- 또는 게임오브젝트에서 설정된 회전값. 즉, original.transform.rotation으로 작성해도 됨.

아래와 같이 선언해서 obj라는 게임오브젝트 객체를 동적으로 생성한다.

Instantiate(obj, new Vector3(x,y,z), Quaternion.identity);      // 그냥 회전없음.

또는 

Instantiate(obj, new Vector3(x,y,z), obj.transform.rotation);   // obj의 회전값.

유니티로 돌아와서 실행을 해보면, 해당 게임오브젝트가 복제되고 있음을 볼 수 있다.

어떻게 보냐면, 오브젝트 옆에 괄호로 (clone)이 줄줄이 복제되어 늘어나는 것을 볼 수 있다.

그런데...안 없어진다.

총알을 100번을 날렸다고 가정해보자. 그럼 100개의 총알이 Instantiate에 의해 생성되어 있다는 것이다.

+ 2018/06/08일 내용 추가 & 수정

GameObjectUnityEngine.Object.Instantiate<GameObject>(GameObject original, Transform parent)

즉, position과 rotation 설정하지 않고, 특정 하이어라키 위치에서 생성하기 위해 사용할 수 있다.

넣고 싶은 오브젝트를 두 번째 파라미터인 parent에 적어주면 복제 생성시 하위 자식으로 생성된다.

그렇다면, 반대로 Instantiate로 생성한 오브젝트를 제거.삭제하는 함수는 무엇일까?

바로 Destroy()함수이다. Destroy라는 뜻 자체가 파괴하다, 죽이다. 라는 의미이다.

사용방법은 매우 쉽다.

Destroy(GameObject obj);

괄호안에 게임오브젝트 객체를 넣으면 제거된다. 이렇게 호출하면, 그 객체는 곧바로 사라진다.

바로 사라지지 않고 짧은 시간을 지연시킨 후에 오브젝트를 파괴하는 것도 가능하다.

Destroy(GameObject obj, float time);

두 번째 매개변수로 float형 소수를 적어주면, 그 시간만큰 지연 후 사라지도록 할 수 있다.

유니티 게임에서 오브젝트 만드는 방법

public GameObject enemy;


 Instantiate(enemy);

public으로 게임오브젝트를 넣어주고

생성하면된다.

게임오브젝트 삭제 방법

Destroy(gameObject);

//5초뒤에 삭제
  Destroy(gameObject,5);

학생포트폴리오. 

현재 더조은컴퓨터아카데미 부평지점 근무 국기전략게임유니티 강의중

게임개발 및 포트폴리오 문의

https://www.youtube.com/watch?v=HEpiDD_A1N0&list=PLfhxOHtaxNwwGT6JjmiPNBQkfKGI6BJzV 

유니티 Instantiate 삭제 - yuniti Instantiate sagje

안녕하세요, 매번 친절하게 답변해 주셔서 감사합니다. 강의에서 6분50초 근처 내용입니다.

public class PrefabTest : MonoBehaviour
{
    GameObject prefab;
    GameObject tank;

    void Start()
    {
        prefab = Resources.Load<GameObject>("Prefabs/Tank");
        tank = Instantiate(prefab);
        Destroy(tank, 3.0f);
    }
}

위와 같이 하면 정상적으로 작동하는 점 확인했습니다. 그런데 여기서 게임오브젝트 prefab와 tank가 왜 각각 따로 필요한가요?

public class PrefabTest : MonoBehaviour
{
    GameObject prefab;

    void Start()
    {
        prefab = Resources.Load<GameObject>("Prefabs/Tank");
        Instantiate(prefab);
        Destroy(prefab, 3.0f);
    }
}

이렇게 해보았더니 생성은 되는데 정상적으로 삭제가 안되더라구요. ㅠㅠ 어떤 차이인가요?

=================================

=================================

=================================

출처: https://docs.unity3d.com/kr/530/Manual/CreateDestroyObjects.html

게임 오브젝트 생성 및 삭제
씬에서 오브젝트들이 정해진 수만큼 있기도 하지만, 보통 캐릭터, 아이템 그리고 다른 오브젝트를 게임중 생성 및 삭제하는 경우가 자주 발생합니다. Unity는 게임 개체를 만들 때 Instantiate 함수를 사용하여 기존 오브젝트를 복제합니다:

public GameObject enemy;

void Start() {
    for (int i = 0; i < 5; i++) {
        Instantiate(enemy);
    }
}

복제하는 오브젝트는 장면에 이미 있는 것에 한정됩니다. 에디터에서 프로젝트 패널의 공용 변수에 프리팹을 드래그하는 방법도 자주 사용됩니다. 또한 게임 오브젝트를 인스턴스화하면 원래 컴포넌트를 전부 복제합니다.

또한 [Destroy](ScriptRef : Object.Destroy.html) 함수를 사용하여 오브젝트를 제거합니다. 프레임 업데이트가 완료된 후 제거할 지 또는 옵션에서 일정 시간이 지난 후 제거할 지 선택할 수 있습니다:

void OnCollisionEnter(Collision otherObj) {
    if (otherObj.gameObject.tag == "Missile") {
        Destroy(gameObject,.5f);
    }
}

Destroy 함수는 게임 오브젝트 자체에 영향을 주지 않고 개별 컴포넌트를 제거할 수 있는 점에 유의하십시오. 자주 하는 실수는 다음과 같습니다:

 Destroy(this);
… 이것은 게임오브젝트를 삭제하는 것이 아닌, 호출하는 실제 스크립트 컴포넌트를 삭제하게 됩니다.

=================================

=================================

=================================

출처: https://green4you.tistory.com/17

GameObject 동적으로 삭제 하기

유니티에서 게임실행중에 GameObject 를 제거해야 할때가 있다.

예를 들면 총알이 몬스터에 맞았을 경우 총알을 제거해 줘야 한다. 

또 몬스터의 HP가 0보다 작아지면 몬스터 또한 제거해 줘야 한다.

Destroy (Object obj, t : float time= 0.0F)  함수를 이용하면 쉽게 제거할 수 있다.

obj 는 삭제할 대상 오브젝트 이며, time 은 Destroy 함수 호출후 몇초후에 삭제할지 결정한다.

코드

// 게임 오브젝트를 제거한다.

Destroy (gameObject);

// 게임오브젝트로부터 현재 스크립트를 제거 한다.

Destroy (this);

// 게임오브젝트로부터 강체를 제거합니다.

Destroy (rigidbody);

// 오브젝트 로드 후 5초 안에 게임오브젝트를 죽입니다.Kills the game object in 5 seconds after loading the object

Destroy (gameObject, 5);

// 사용자가 Ctrl키를 누를때, 스크립트를 제거 할것입니다. 

// 게임오브젝트의 FooScript라는 이름의

function Update () {

    if (Input.GetButton ("Fire1") && GetComponent (FooScript))

        Destroy (GetComponent (FooScript));

출처: https://green4you.tistory.com/17 [Green4You]

=================================

=================================

=================================

# 기타관련 링크

- https://purygame.tistory.com/7

- https://cpp11.tistory.com/15

- https://hyunity3d.tistory.com/388

=================================

=================================

=================================