Взаимодействие с триггером другого объекта

Программирование на Юнити.

Взаимодействие с триггером другого объекта

Сообщение Kakaha_228 25 апр 2023, 16:20

Мне как-то не очень хочется разбивать короткий сюжет игры на десятки скриптов и хочется разедлить его только на этапы (которых выходит всего 4). В нужные мне моменты игрок заходит в зону триггера и тогда запускается кат-сцена или прочий сюжетный элемент. Но как мне указать в методе OnTriggerEnter колайдер стороннего объекта? Просто я уже думал наж мыслью сделать скрипт, который будет висеть на триггере и при входе игрока в него вызывать метод из основного скрипта сюжета, но это как-то не эстетично и можно легко запутаться во всей этой паутине, вот я и хочу в одном скрипте перечить все объекты с коллайдерами и выполять методы в зависимости от входа игрока в конкретный коллайдер. Как мне это сделать?
Да не нужна мне подпись...
Аватара пользователя
Kakaha_228
UNIт
 
Сообщения: 60
Зарегистрирован: 21 фев 2021, 14:12

Re: Взаимодействие с триггером другого объекта

Сообщение 1max1 25 апр 2023, 16:36

Еще раз, что ты хочешь получить? У метода OnTriggerEnter есть параметр коллайдера, который в нег попал https://docs.unity3d.com/ru/530/ScriptR ... Enter.html
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Взаимодействие с триггером другого объекта

Сообщение Kakaha_228 25 апр 2023, 17:08

1max1 писал(а):Еще раз, что ты хочешь получить?

Я хочу в основном скрипте указать объект с бокс коллайдером, который является триггером и использовать OnTriggerEnter этого объекта. Это чтобы не вешать скрипт на объект с триггером.
Да не нужна мне подпись...
Аватара пользователя
Kakaha_228
UNIт
 
Сообщения: 60
Зарегистрирован: 21 фев 2021, 14:12

Re: Взаимодействие с триггером другого объекта

Сообщение Kakaha_228 25 апр 2023, 17:14

Расскажу подробнее: в скрипте я узкаываю объекты Col1, Col2 и Col3. Когда игрок входит в триггер Col1, запускается кат-сцена, когда в Col2 - спанится враг, Col3 - задание выполнено. И всё это я пытаюсь реалищовать в одном скрипте, мне так удобнее, но не хочется разбивать скрипт на несколько и вешить отдельные скрипты на каждый коллайдер
Да не нужна мне подпись...
Аватара пользователя
Kakaha_228
UNIт
 
Сообщения: 60
Зарегистрирован: 21 фев 2021, 14:12

Re: Взаимодействие с триггером другого объекта

Сообщение 1max1 25 апр 2023, 18:45

Вешать скрипт на объект все равно придется, ты не вызовешь колбек ивента без него. Но сам метод обработки можно менять динамически:

Синтаксис:
Используется 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);
    }
}
 
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Взаимодействие с триггером другого объекта

Сообщение Kakaha_228 27 апр 2023, 16:45

Ну, раз уж всё-таки придётся вешать, то вот мой вариант "универсального" триггера:
Синтаксис:
Используется 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);
        }
    }
}
Да не нужна мне подпись...
Аватара пользователя
Kakaha_228
UNIт
 
Сообщения: 60
Зарегистрирован: 21 фев 2021, 14:12

Re: Взаимодействие с триггером другого объекта

Сообщение 1max1 27 апр 2023, 17:20

Все это попахивает скорейшим выстрелом себе в ногу, это лично мое мнение, слишком жесткая привязка к строкам и нет гибкости передачи параметров, хотя, возможно, в твоем проекте это не имеет смысла (%)
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12