Взаимодействие с триггером другого объекта
Добавлено:
25 апр 2023, 16:20
Kakaha_228
Мне как-то не очень хочется разбивать короткий сюжет игры на десятки скриптов и хочется разедлить его только на этапы (которых выходит всего 4). В нужные мне моменты игрок заходит в зону триггера и тогда запускается кат-сцена или прочий сюжетный элемент. Но как мне указать в методе OnTriggerEnter колайдер стороннего объекта? Просто я уже думал наж мыслью сделать скрипт, который будет висеть на триггере и при входе игрока в него вызывать метод из основного скрипта сюжета, но это как-то не эстетично и можно легко запутаться во всей этой паутине, вот я и хочу в одном скрипте перечить все объекты с коллайдерами и выполять методы в зависимости от входа игрока в конкретный коллайдер. Как мне это сделать?
Re: Взаимодействие с триггером другого объекта
Добавлено:
25 апр 2023, 16:36
1max1
Еще раз, что ты хочешь получить? У метода OnTriggerEnter есть параметр коллайдера, который в нег попал
https://docs.unity3d.com/ru/530/ScriptR ... Enter.html
Re: Взаимодействие с триггером другого объекта
Добавлено:
25 апр 2023, 17:08
Kakaha_228
1max1 писал(а):Еще раз, что ты хочешь получить?
Я хочу в основном скрипте указать объект с бокс коллайдером, который является триггером и использовать OnTriggerEnter этого объекта. Это чтобы не вешать скрипт на объект с триггером.
Re: Взаимодействие с триггером другого объекта
Добавлено:
25 апр 2023, 17:14
Kakaha_228
Расскажу подробнее: в скрипте я узкаываю объекты Col1, Col2 и Col3. Когда игрок входит в триггер Col1, запускается кат-сцена, когда в Col2 - спанится враг, Col3 - задание выполнено. И всё это я пытаюсь реалищовать в одном скрипте, мне так удобнее, но не хочется разбивать скрипт на несколько и вешить отдельные скрипты на каждый коллайдер
Re: Взаимодействие с триггером другого объекта
Добавлено:
25 апр 2023, 18:45
1max1
Вешать скрипт на объект все равно придется, ты не вызовешь колбек ивента без него. Но сам метод обработки можно менять динамически:
Используется csharp
// главный скрипт
public class Main : MonoBehaviour
{
public UniversalTrigger[] triggers;
void Start()
{
triggers[0].act = Act1; // теперь триггер 0 будет вызывать обработчик Act1
triggers[0].act = Act2; // теперь триггер 0 будет вызывать обработчик Act2
}
void Act1(Collider other)
{
print(other.name + " " + "act1");
}
void Act2(Collider other)
{
print(other.name + " " + "act2");
}
}
// универсальный скрипт с триггерным обработчиком
public class UniversalTrigger : MonoBehaviour
{
public Action<Collider> act;
void OnTriggerEnter(Collider other)
{
act?.Invoke(other);
}
}
Re: Взаимодействие с триггером другого объекта
Добавлено:
27 апр 2023, 16:45
Kakaha_228
Ну, раз уж всё-таки придётся вешать, то вот мой вариант "универсального" триггера:
Используется csharp
public class Trigger : MonoBehaviour
{
public GameObject etapObj;
public string etapScriptName = "Etap Script";
public string etapVoidName1 = "Etap Void Name";
public string etapVoidName2 = "Etap Void Name";
public bool hasExit = false;
void OnTriggerEnter(Collider other)
{
if(other.tag == "Player")
{
etapObj.GetComponent(etapScriptName)?.GetType().GetMethod(etapVoidName1)?.Invoke(etapObj.GetComponent(etapScriptName), null);
}
}
void OnTriggerExit(Collider other)
{
if(hasExit && other.tag == "Player")
{
etapObj.GetComponent(etapScriptName)?.GetType().GetMethod(etapVoidName2)?.Invoke(etapObj.GetComponent(etapScriptName), null);
}
}
}
Re: Взаимодействие с триггером другого объекта
Добавлено:
27 апр 2023, 17:20
1max1
Все это попахивает скорейшим выстрелом себе в ногу, это лично мое мнение, слишком жесткая привязка к строкам и нет гибкости передачи параметров, хотя, возможно, в твоем проекте это не имеет смысла