Страница 1 из 1

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

СообщениеДобавлено: 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
Все это попахивает скорейшим выстрелом себе в ногу, это лично мое мнение, слишком жесткая привязка к строкам и нет гибкости передачи параметров, хотя, возможно, в твоем проекте это не имеет смысла (%)