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

Как реализовать систему взаимодйствия игрока с объектами?

СообщениеДобавлено: 15 апр 2021, 17:28
twomore
Вопрос в том как реализовать нормальную систему, с универсальностью. Что бы можно было лекго настраивать что делает объект при взаимодействии с ним игрока, и какая надпись появляется при наведении. Второе у меня особо вызвало проблемы.
Были попытки с Raycast, но как я понял это довольно дорогая операция, плюс я так и не смог реализовать универсальную систему указания надписи на UI(типо открыть, использовать, нажать и т.д.).
Также пробовал цеплять к камере триггер длинный впереди неё, но он реагирует только на ригидбоди, а также постоянно реагирует на объект игрока, можно как то сделать что бы он игнорировал его? Через слои не получилось.

Re: Как реализовать систему взаимодйствия игрока с объектами?

СообщениеДобавлено: 15 апр 2021, 17:52
Alkos26Rus
twomore писал(а):Были попытки с Raycast, но как я понял это довольно дорогая операция, плюс я так и не смог реализовать универсальную систему указания надписи на UI(типо открыть, использовать, нажать и т.д.).

Можно Raycast в таймер засунуть, не обязательно каждый кадр пускать луч. Если так и не смог реализовать универсальную систему указания надписи на UI, то и сдругими способами не сможешь, так как принцип один и тот же - возвращаемый объект.

twomore писал(а):Также пробовал цеплять к камере триггер длинный впереди неё, но он реагирует только на ригидбоди, а также постоянно реагирует на объект игрока, можно как то сделать что бы он игнорировал его? Через слои не получилось.

Через слои не может не получится, значит что то не так делаешь.

Вобщем все эти способы рабочие, просто доведи до конца и конкретезируй что именно не получается. Так как если ты получаешь ссылку на возвращаемый объект или на скрипт, то в чем проблема, я не понимаю

Re: Как реализовать систему взаимодйствия игрока с объектами?

СообщениеДобавлено: 15 апр 2021, 18:08
twomore
Через слои не может не получится, значит что то не так делаешь.

Смог исправить вот так: Physics.IgnoreCollision(playerBody.GetComponent<CharacterController>(), usingTrigger);

На текущий момент я придумал такую систему с триггером:
У всех интерактивных объектов скрипт UsingData у которого одно публичное поле label(надпись на UI) и метод OnUse который запускает через SendMessage все OnUse у интерактивного объекта. Ну а триггером я соответственно этот OnUse запускаю.
Не знаю насколько это хорошая система

Только щас заметил проблему. Я в OnTriggerStay постоянно проверяю нажатие клавиши E, но оно не всегда срабатывает, OnTriggerStay слишком медленный походу.

Re: Как реализовать систему взаимодйствия игрока с объектами?

СообщениеДобавлено: 15 апр 2021, 18:59
Alkos26Rus
twomore писал(а):
Через слои не может не получится, значит что то не так делаешь.

Смог исправить вот так: Physics.IgnoreCollision(playerBody.GetComponent<CharacterController>(), usingTrigger);

Доведи до ума слои, и не нужно будет запускать команду Physics.IgnoreCollision

twomore писал(а):Только щас заметил проблему. Я в OnTriggerStay постоянно проверяю нажатие клавиши E, но оно не всегда срабатывает, OnTriggerStay слишком медленный походу.

В Update проверяй на нажатие кнопки

Re: Как реализовать систему взаимодйствия игрока с объектами?

СообщениеДобавлено: 15 апр 2021, 19:16
twomore
Доведи до ума слои, и не нужно будет запускать команду Physics.IgnoreCollision

Щас попробовал ещё раз, вроде работает, благодарю.

В Update проверяй на нажатие кнопки

А тогда каким образом мне получать объект столкновения и запускать у него OnUse?

Синтаксис:
Используется csharp
private void OnTriggerStay(Collider other) {
        if(Input.GetKeyDown(KeyCode.E)) {
            other.gameObject.GetComponent<UsingData>().OnUse();
        }
    }
 

Re: Как реализовать систему взаимодйствия игрока с объектами?

СообщениеДобавлено: 15 апр 2021, 21:28
Alkos26Rus
Здесь на ум тока приходит использовать ссылку на объект. Надо тестить, но так вроде должно работать
Синтаксис:
Используется csharp
public Transform hit_object;

void Update(){
        if(Input.GetKeyDown(KeyCode.E) && hit_object) {
            hit_object.GetComponent<UsingData>().OnUse();
        }
}

void OnTriggerStay(Collider other){
hit_object = other.transform;
}

void OnTriggerExit(Collider other){
if(hit_object == other.transform)hit_object = null;
}

 

Re: Как реализовать систему взаимодйствия игрока с объектами?

СообщениеДобавлено: 16 апр 2021, 09:37
twomore
Alkos26Rus писал(а):Здесь на ум тока приходит использовать ссылку на объект. Надо тестить, но так вроде должно работать

Благодарю!