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

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

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

Сообщение twomore 15 апр 2021, 17:28

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

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

Сообщение Alkos26Rus 15 апр 2021, 17:52

twomore писал(а):Были попытки с Raycast, но как я понял это довольно дорогая операция, плюс я так и не смог реализовать универсальную систему указания надписи на UI(типо открыть, использовать, нажать и т.д.).

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

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

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

Вобщем все эти способы рабочие, просто доведи до конца и конкретезируй что именно не получается. Так как если ты получаешь ссылку на возвращаемый объект или на скрипт, то в чем проблема, я не понимаю
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1640
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

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

Сообщение twomore 15 апр 2021, 18:08

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

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

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

Только щас заметил проблему. Я в OnTriggerStay постоянно проверяю нажатие клавиши E, но оно не всегда срабатывает, OnTriggerStay слишком медленный походу.
Трансцендентность не предел!
twomore
UNец
 
Сообщения: 17
Зарегистрирован: 15 апр 2021, 17:16

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

Сообщение Alkos26Rus 15 апр 2021, 18:59

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

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

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

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

В Update проверяй на нажатие кнопки
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1640
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

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

Сообщение twomore 15 апр 2021, 19:16

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

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

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

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

Синтаксис:
Используется csharp
private void OnTriggerStay(Collider other) {
        if(Input.GetKeyDown(KeyCode.E)) {
            other.gameObject.GetComponent<UsingData>().OnUse();
        }
    }
 
Трансцендентность не предел!
twomore
UNец
 
Сообщения: 17
Зарегистрирован: 15 апр 2021, 17:16

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

Сообщение Alkos26Rus 15 апр 2021, 21:28

Здесь на ум тока приходит использовать ссылку на объект. Надо тестить, но так вроде должно работать
Синтаксис:
Используется 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;
}

 
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1640
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

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

Сообщение twomore 16 апр 2021, 09:37

Alkos26Rus писал(а):Здесь на ум тока приходит использовать ссылку на объект. Надо тестить, но так вроде должно работать

Благодарю!
Трансцендентность не предел!
twomore
UNец
 
Сообщения: 17
Зарегистрирован: 15 апр 2021, 17:16


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

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

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