2013-04-21 3 views
0

나는 게임 (2D 플랫폼)을 쓰고 있는데, 플레이어가 respawn 할 때 respawn을 원한다. 레벨이로드 될 때로드되는 객체가 있기 때문에 단순히 레벨을 다시로드 할 수 없으므로 문제가 발생할 수 있습니다. 그 대신 플레이어를 부활시키기 위해 시작 지점으로 돌아 왔습니다 (그리고 잃어버린 삶과 다른 세부 사항들을 처리합니다).Respawn Destroyed GameObject (Enemy)

플레이어는 (플레이어에 OnTriggerEnter에서) 다음과 같이 머리에 타격하여 적을 파괴 : 당신이 볼 수 있듯이

if(otherObject.CompareTag("Minion")) //hit by minion 
    { 
     if(hitFromTop(otherObject.gameObject)) //if player jumped on enemy 
     { 
      otherObject.GetComponent<Minion>().setMoving(false); //stop moving 
      playSound(KillEnemySound); //play killing enemy sound 
      jump(); 
      Destroy(otherObject.gameObject); //kill minion 

     } 
        //else hurt player 
    } 

, 나는 완전히 적 객체를 파괴한다. 어떤 적들이 어디에 있는지를 유지하기 위해, 나는 그들을 생성시에 (별도의 GameObject에 저장된) 목록에 추가합니다. 나는 목록을 이동하여 원래 위치에서 목록에있는 모든 부하를 respawning 함수를 호출하려고 해요

void Start() 
{ 
    enemyList = GameObject.FindGameObjectsWithTag("Minion"); 
    Debug.Log ("Adding all minions to list"); 
} 

다음과 같이 목록은 별도의 적 respawning 객체 생성됩니다. 함수는 다음과 같습니다

public void RespawnAll() 
{ 
    foreach(GameObject minion in enemyList) 
    { 
     Destroy(minion); //make sure to respawn ALL minions 
    } 
    Debug.Log ("Respawning all"); 
    foreach(GameObject minion in enemyList) 
    { 
     Debug.Log ("instantiating minions from list"); 
     Instantiate (minion, minion.GetComponent<Minion>().origPosition, Quaternion.identity); 
    } 
} 

나는 모든 적을 삭제하고 그들 모두를 다시 만들고하는 시간이 가장 최적의 방법은 아니라는 것을 알고,이 논리가 잘못된 경우 또는 당신은 더 좋은 방법을 알고 있다면, I 새로운 아이디어를 열어.

MissingReferenceException: The object of type 'GameObject' has been destroyed but you are still trying to access it. Your script should either check if it is null or you should not destroy the object.

내가 목록이 아닌 사본에 기존의 미니언에 대한 참조를 추가 해요 보인다

이 아이디어에 대한 문제는 내가 오류를 얻을 수있다. 적을 원래 위치에서 올바르게 부활시키는 방법은 무엇입니까?

+1

왜 적/적 구조체로 적의 상태를 저장하고 그 저장된 값을 인스턴스화하는 건지? 위치/방향 이상으로 복원해야하는 경우 객체를 직렬화하거나 파괴하지 말고 게임 객체를 비활성화하고 수준을 다시 시작할 때 다시 활성화하십시오. – Jerdak

+0

상태를 클래스/구조체로 두는 것은 무엇을 의미합니까? 이것이 어떻게 적들을 부활시키는 데 도움이됩니까? respawn 함수에 위치/방향을 전달하고 완전히 새로운 객체를 인스턴스화할까요? (나는 disabling/enabling을 들여다 보겠다. 그러나 첫 문장에서 의미하는 바가 궁금하다.) – muttley91

+0

나는 분명히해야만했다. 제가 지적한 바는 당신의 목표가 시작 지점에서 적을 다시 인스턴스화하는 것입니다. 'enemylist'와 평행하게'enemyposition' 또는 Vector3이나 생명, 자세, 방향 등 시작과 같은 적의 정보를 담고있는 커스텀 클래스를 저장하는 유사한리스트를 가질 수 있습니다. – Jerdak

답변

2

나는 Jerdak의 조언을 받아 적을 파괴하는 대신에 장애물을 사용하지 않도록했다. 이 방법으로, 그들은 여전히 ​​존재했고, 나는 무력화 된 (죽임당한) 모든 적들을 돌고 다시 사용할 수있었습니다.