2017-03-18 6 views
0

게임 객체에 스크립트 구성 요소가 있습니다 (여기서는 단순화되었습니다).이 구성 요소는 생성시 비활성화되고 testObject.setActive(false)을 사용합니다. Unity3D - 상태가 해제 된 GameObject 스크립트가 사용되지 않음

는 게임 오브젝트 비활성 의지를 만들기 : 나는 다시 사용 가능 개체를 반환 5.

되면

using UnityEngine; 

public TestObject : MonoBehaviour { 
    public int testValue = 5; 

    void Start() { 
     testValue = 0; 
    } 

    public int GetTestValue() { 
     return testValue; 
    } 
} 

해제하기 전에, GetTestValue의 반환은 유니티 문서는 말할 0입니다 모든 구성 요소 비활성화 ... GameObject에 첨부 한 모든 스크립트는 더 이상 Update()를 호출하지 않습니다 ...

그러나 Compone 스크립트에서 만든 MonoBehaviour가 실제로 '장애'가 아니라 오히려 파괴된다는 사실을 나에게 알립니다. Update()이 호출이 중지 된 경우 어떻게 국가 손실을 설명합니까?

여기있는 기본 질문은 다음과 같습니다. 스크립트를 파괴하지 않고 일시적으로 스크립트를 사용하지 않도록 설정하려면 어떻게해야합니까?

+1

당신이 말하는 것보다 더 많은 것이 있어야합니다.false로 설정하면 모든 Unity 메소드가 엔진 (Update, LateUpdate, Collision, ...)에 의해 호출되지 않지만 public 메소드는 다른 곳에서 호출되어 스크립트의 상태에 영향을 줄 수 있습니다. 예를 들어 GetTestValue가 비활성 인 경우에도 다른 스크립트에서 GetTestValue를 호출 할 수 있습니다. 설정 및 해제는 변수 내용에 영향을주지 않으며 인스턴스를 파괴하지 않습니다. 그래서 여러분은 실제로 다른 곳에서 새로운 객체를 파괴하거나 생성하고 있거나, 다른 객체를보고있는 중이거나 다른 곳에 값을 재설정 중입니다. – Everts

+0

@ Evertts : 당신은 '더'가 있다는 것이 옳았습니다. 나는 인스턴스화 직후에 비활성화가 발생했다는 것을 명시 적으로 밝혀야 만했다. – frog

답변

0

이 문제는 경쟁 조건이었습니다. Start()가 완료되기 전에 TestObject가 비활성화되었으며 이로 인해 개체가 제대로 초기화되지 않았습니다. 초기화 코드를 Awake()로 이동하면 객체가 비활성화되기 전에 상태가 올바르게 설정됩니다.

1

실제로 실제로 Start() 기능은 일생에 한 번만 호출되는 입니다. 그래서 처음에 호출 된 값을 0으로 설정합니다. 그러나 비활성화 한 다음 다시 활성화하면 호출되지 않습니다.

이것은 스크립트를 비활성화하고 다시 활성화 한 후에도 값이 동일해야한다는 사실을 변경하지 않습니다 (주석 섹션에서 알아 낸 바와 같음).

이 작업을 수행하는 한 가지 방법은 OnEnable()을 사용하는 것이며이 스크립트는 스크립트가 setActive 될 때마다 호출됩니다. More info on OnEnable :

이 함수는 객체가 활성화되어 활성화 될 때 호출됩니다.

그래서 스크립트에서, 당신은 것입니다 :

private void OnEnable() 
{ 
    testValue = 0; 
} 

을이 객체가 활성화되고 많은 시간을 비활성화하고 당신이 절대적 일이 일어날 때마다 할 필요가 있다는 것 알고 있다면.

망가 비활성화 및 다시 활성화됩니다 스크립트에 중요한 가치를 유지 : 내 두 번째 점과 내 조언을 나에게 가져다


.

항상 중요한 정보가 항상 비활성화되어 있으므로 반드시 올바른 값을 유지해야합니다. 그렇게하면 항상 올바른 값을 다시 생성 할 필요가 없으며 매번 올바른 값을 얻었을 때마다 확인해야하는 것은 아닙니다.

+1

** ** 객체의 수명 기간 동안 한 번만 호출 ** ** Start()가 한 번만 호출되기 때문에 비활성화시 객체를 파괴해서는 안됩니다. 개체가 내부 상태를 잃는 이유는 여기에 설명되어 있지 않습니다. – frog

+0

@frog 그것의 값을 잃지 않고 단순히'public int testValue = 5;'로 덮어 씁니다. – CNuts

+0

그럴 수는 없습니다. testValue에 5를 지정하면 컴파일러가 이니셜 라이저 구문에서 자동으로 생성하는 객체 생성자에서 수행됩니다. Start()와 같은 생성자는 객체의 수명 내내 한 번만 호출됩니다. 따라서 testValue는 필드 이니셜 라이저에 의해 덮어 쓸 수 없습니다. – frog