Всем привет. У меня есть на одной линии машина и три триггера, идущих друг за другом. Второй и третий триггер выключены (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 второго и третьего триггера, т.к. они не активны. Что делать? и может вы предложите иные способы реализации?
Способов, на самом деле, уйма.
Например, создайте новый класс, который будет выражением вашего триггера. У такого класса будет переменная, которая соответствует следующей точке и метод столкновения.
Когда этот метод срабатывает - вы выключаете объект, на котором висит этот экземпляр класса и включаете тот, на который он ссылается как на следующий. Если следующего нет - сообщаете основному игровому классу, что точки закончились и игра окончена (способов это сделать тоже уйма).
Сделав такой класс можете создать префаб точки, наклонировать, как угодно и связать их в правильной последовательности.
Можете, например, в этом классе сделать событие 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!");
}
}
Всё, можете строить дорожки какой угодно длинны и ничего не менять в коде.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Не записывает текст в файл=( Подскажите, пожалуйста, что не так?
У меня есть двумерный массив случайных целых чисел, которые находятся в массиве текстбоксовЯ нашла максимум и вывела его на Label1