Как снова активировать объект в единстве - PullRequest
0 голосов
/ 29 января 2019

Я создал точку, следуя за моей мышью в 2D, и я создал объект куба, меняющий положение на x и y.Теперь, когда я указываю моей мыши на куб, она деактивируется, я установил это, и теперь я хочу активировать его снова.Я пытаюсь выйти из триггера, но это не сработало.

public GameObject tapObject;
private float respawnTime = 1f;
public float xMin;
public float xMax;
public float yMin;
public float yMax;

void Start()
{
    StartCoroutine(spawnEnemyTime());
}   

private void RandomSpawnObject()
{
    tapObject.transform.position = new Vector2(Random.Range(xMin, xMax), Random.Range(yMin, yMax));   
}
private void OnTriggerEnter2D(Collider2D collision)
{
    tapObject.SetActive(false);
}

IEnumerator spawnEnemyTime()
{
    while (true)
    {
        yield return new WaitForSeconds(respawnTime);
        RandomSpawnObject(); 
    }        
} 

Ответы [ 5 ]

0 голосов
/ 31 января 2019

Вы можете просто использовать пустой GameObject и получить ссылку на объект, который вы хотите включить / отключить.Если вы получите ссылку до того, как отключите ее, вы сможете снова активировать ее.

альтернатива - сделать то, что сказал TehMightyPotato.Отключить компоненты - это на самом деле лучший способ решить эту проблему, но если у вас много компонентов / субкомпонентов, отключите игровые объекты быстрее.

0 голосов
/ 30 января 2019

Я просто повторю то, что все остальные здесь сказали:

Неактивный объект в Unity действительно неактивен , то есть он не получает никаких обновлений, не может сталкиваться с вещамии все вещи MonoBehaviour, которые обычно вызывают ваш код, тоже не работают.Вы должны вручную повторно активировать объект, используя ссылку, которую вы где-то кэшировали.

Но , вместо того, чтобы просто отключить весь объект, вы можете отключить компоненты , которые вы не хотите быть активными.

Пример:

private void OnTriggerEnter2D(Collider2D collision)
{
    tapObject.GetComponent<Renderer>().enabled = false;
}

private void OnTriggerExit2D(Collider2D collision)
{
    tapObject.GetComponent<Renderer>().enabled = true;
}

Это только деактивирует ваш компонент рендерера, но оставляет все остальное как есть.Таким образом, ваш объект все еще может сталкиваться, и он по-прежнему регистрируется, например, OnTriggerExit.

Имейте в виду, что GetComponent<T>() - это довольно дорогая операция , поэтому кэширование ссылок на компоненты - хорошая идея.Лучшим решением было бы начать со ссылки, создав для нее переменную и назначив ее в инспекторе.

Пример:

//Set in inspector
public Renderer renderer

private void OnTriggerEnter2D(Collider2D collision)
{
    renderer.enabled = false;
}

private void OnTriggerExit2D(Collider2D collision)
{
    renderer.enabled = true;
}
0 голосов
/ 29 января 2019

Когда GameObject не активен в Unity, вы не можете щелкнуть по нему (без рендеринга, без столкновений, ничего)

Но вы можете создатьгорячая клавиша ( новый скрипт или другой скрипт ), который может вернуть его в активное состояние, если он не активен.

0 голосов
/ 30 января 2019

public GameObject GO;

Use GO.setactive (true);тогда как gameobject - это объект, используемый для определения конкретной вещи или объекта, который должен быть активным, а весь код должен быть записан в методе "spawnEnemyTime", чтобы он мог стать активным после определенного периода времени

0 голосов
/ 29 января 2019

После неактивности скрипты для этого объекта больше не выполняются => сообщения типа OnTriggerExit не вызываются / не выполняются.

Одно из решений - просто обернуть целевой объект в родительский объект и присоединить ваш скриптвместо этого, но сделайте так, чтобы он (де) активировал дочерний элемент.

Таким образом, родитель остается активным и получает сообщение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...