Получить GameObject, если он не активен

190
16 ноября 2021, 20:40

Всем привет. У меня есть на одной линии машина и три триггера, идущих друг за другом. Второй и третий триггер выключены (SetActive(false)). Я хочу, чтобы при достижении первого триггера он исчезал и появлялся второй и так далее.

using System.Collections.Generic;
using UnityEngine;
public class NewScript : MonoBehaviour
{
    public GameObject NextPoint;
    public GameObject LastPoint;
    public int i;
    public string Mark;
    // Start is called before the first frame update
    void Start()
    {
        i = 1;
        Mark = $"Point {i}";
    }
    void OnTriggerEnter(Collider col)
        {
            if (col.tag == "Point")
                {
                    i++;
                    Mark = $"Point {i}";
                    NextPoint = GameObject.Find(Mark);
                    NextPoint.SetActive(true);
                }
        }
    }

Код не может получить GameObject второго и третьего триггера, т.к. они не активны. Что делать? и может вы предложите иные способы реализации?

Answer 1

Способов, на самом деле, уйма.

Например, создайте новый класс, который будет выражением вашего триггера. У такого класса будет переменная, которая соответствует следующей точке и метод столкновения.

Когда этот метод срабатывает - вы выключаете объект, на котором висит этот экземпляр класса и включаете тот, на который он ссылается как на следующий. Если следующего нет - сообщаете основному игровому классу, что точки закончились и игра окончена (способов это сделать тоже уйма).

Сделав такой класс можете создать префаб точки, наклонировать, как угодно и связать их в правильной последовательности.

Можете, например, в этом классе сделать событие OnRoadEndEvent. Сделать общий игровой класс, в который повесить ссылку на первую точку. При старте игры пройтись через всю цепочку выключая объекты (вы же помните, что каждая точка ссылается на следующую), когда точки заканчиваются - подписываетесь на OnRoadEndEvent последней, и включайте первую.

Итоговый класс точки будет выглядеть как-то так

public class TriggerPoint : MonoBehaviour
{
    public event Action OnRoadEndEvent = delegate { };
    public TriggerPoint NextTrigger;
    void OnTriggerEnter(Collider col)
    {
        gameObject.SetActive(false);
        if (NextTrigger != null)
            NextTrigger.gameObject.SetActive(true);
        else OnRoadEndEvent();
    }
}

А общий класс как-то так

public class GameMaster : MonoBehaviour
{
    [SerializeField]
    TriggerPoint _firstPoint;
    TriggerPoint _endPoint;
    void Start()
    {
        _endPoint = _firstPoint;
        if (_endPoint!= null)
        {
            while (_endPoint.NextTrigger != null)
            {
                _endPoint = _endPoint.NextTrigger;
                _endPoint.gameObject.SetActive(false);
            }
            _endPoint.OnRoadEndEvent += OnRoadEnd;
            _firstPoint.gameObject.SetActive(true);
        }
    }
    void OnRoadEnd()
    {
        _endPoint.OnRoadEndEvent -= OnRoadEnd;
        print("Win!");
    }
}

Всё, можете строить дорожки какой угодно длинны и ничего не менять в коде.

READ ALSO
Не получается записать текст в файл С#

Не получается записать текст в файл С#

Не записывает текст в файл=( Подскажите, пожалуйста, что не так?

138
Вид ячеек DataGridView C#

Вид ячеек DataGridView C#

Есть код:

121
Как закрасить ячейку со значением максимума двумерного массива c#?

Как закрасить ячейку со значением максимума двумерного массива c#?

У меня есть двумерный массив случайных целых чисел, которые находятся в массиве текстбоксовЯ нашла максимум и вывела его на Label1

271
Получение ресурсов в Release

Получение ресурсов в Release

Всем приветСтолкнулся с проблемой

174