유 니 티 전환 장면 에서 물체 문 제 를 소각 하지 않 는 해결

유 니 티 로 게임 개발 을 할 때 우 리 는 장면 전환 시 소각 되 지 않 아 도 되 는 물체 가 필요 할 때 가 있다.이때 우 리 는 공식 적 으로 준 Dont Destroy OnLoad()방법 으로
이 방법 은 우리 로 하여 금 장면 전환 시 장면 을 소각 하지 않 게 할 수 있다.그러나 만약 당신 이 다시 이 장면 으로 돌아간다 면(물 체 를 소각 할 수 없 는 장면 을 만 들 때)이 물체 두 개가 있 는 것 을 발견 할 수 있 을 것 이다.
이 문 제 는 비교적 간단 한 해결 방법 이 있다.
물체 의 Awake()또는 Star()방법 에 이 코드 를 추가 합 니 다.자신 과 같은 이름 을 찾 았 지만 자신의 물체 가 아니라면 자신 을 없 애 버 리 면 이 문 제 를 해결 할 수 있다.다른 곳 은 몰라 도 내 프로젝트 는 쓸 수 있어.

if (GameObject.Find("Players").gameObject != this.gameObject)
            Destroy(this.gameObject);
보충:유 니 티 로 딩 장면,타이머,로 딩 시 물 체 를 소각 하지 않 습 니 다.
비동기 로 필드 를 불 러 옵 니 다.SceneManager.LoadSceneAsync(SceneName);UnityEngine.CeneManagement 를 사용 하여 참조 해 야 합 니 다.네 임 스페이스,
application.LoadLevel 이 방법 은 더 이상 적용 되 지 않 습 니 다.
협동 프로그램 으로 간단 한 타 이 머 를 만 들 수 있 습 니 다.코드 참조;
DontDestroyOnLoad (this.gameObject);방법 은 장면 을 불 러 올 때 지정 한 물 체 를 소각 하지 않 을 수 있다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class Base : MonoBehaviour {    
    public virtual void ScenesLoad(string SceneName,int AfterSomeMinutesToLoad)
    {
       StartCoroutine (Calculagraph(SceneName,AfterSomeMinutesToLoad));
   }
   IEnumerator Calculagraph(string SceneName,int AfterSomeMinutesToLoad)
   {
       yield return new WaitForSeconds (AfterSomeMinutesToLoad*60);
       DontDestroyOnLoad (this.gameObject);
       SceneManager.LoadSceneAsync(SceneName);
   }
}
보충:Unity 팁―게임 오 브 젝 트 폐기 지연
GameObject,Component,asset 를 일정 시간 지연 시 키 기 를 원할 때 아래 함 수 를 이용 하여 실현 할 수 있 습 니 다.
스스로 시간 지연 작업 을 실현 할 필요 가 없다.

Destroy(Object obj, float t = 0.0F);
두 번 째 매개 변수 단 위 는 초 이 고 물 체 는 t 초 후에 소각 된다.

using UnityEngine;
public class ScriptExample : MonoBehaviour
{
    void DestroyGameObject()
    {
        Destroy(gameObject);
    }
    void DestroyScriptInstance()
    {
        //    gameobject      
        Destroy(this);
    }
    void DestroyComponent()
    {
        //  gameobject   rigidbody  
        Destroy(GetComponent<Rigidbody>());
    }
    void DestroyObjectDelayed()
    {
        // 5      gameobject
        Destroy(gameObject, 5);
    }
    //      Ctr  ,   gameobject   boxcollider  
    void Update()
    {
        if (Input.GetButton("Fire1") && GetComponent<BoxCollider>())
        {
            Destroy(GetComponent<BoxCollider>());
        }
    }
}
편집기 확장 개발 을 할 때 실행 되 지 않 을 때 환경 은 Object.Distroy Immediate()만 사용 할 수 있 습 니 다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.만약 잘못 이 있 거나 완전히 고려 하지 않 은 부분 이 있다 면 아낌없이 가르침 을 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기