Полезное

Мы Вконтакте

Discord канал

#
Пред.
Аватара пользователя
Пользователь
Сообщения: 21
Хочу сделать инвентарь на object'ах в c++ проекте. Почитал информацию отсюда http://shootertutorial.com/2015/12/15/c ... -tutorial/ и хочу сделать нечто подобное.
То что изложено в этой статье понял не очень хорошо ибо знание блюпринтов и английского языка у меня на низком уровне.
Из того что понял:
- нужно создать c++ класс наследуемый от ActorComponent, который будет представлять из себя хранилище предметов (инвентарь), иметь внутри себя массив из objet'ов, некоторую логику по взаимодействию с ними (использовать, съесть, выбросить и т.п.);
- подбираемые предметы будут реализовываться двумя классами: object и actor. Object для хранения данных о предмете и добавления предмета в массив при подборе в инвентарь, и Actor для отображения предмета на сцене при его выбрасывания из инвентаря;
- класс предмета Object хранит в себе ссылку на блюпринт наследуемый от класса actora для добавления предмета на сцену, а также иконку для отображения в инвентаре;
- класс предмета Actor хранит в себе помимо меша для отображения на сцене ссылку на Object класс для операции подбора в инвентарь;
- при подборе предмета в инвентарь Object класс по ссылке из Actor'а добавляется в массив в ActorComponent, а сам Actor полностью удаляется;
- при выбросе предмета из инвентаря по ссылке из Object на блюпринт от Actor'a создаётся новый объект на сцене.
Проблема у меня возникает в том как хранить ссылку на блюпринт от Actor'a в Object'e. Можно прописать путь блюпринт, но мне бы этого не хотелось т.к. дизайнеру в код лазать для того чтобы внести какие-либо изменения(переименовать блюпринт например) не понравится, да и неудобно это. UPROPERY ситуацию не решает ибо редактировать параметр через макросы можно только в блюпринтах от Actor'a(насколько мне известно) в книге "Unreal Engine 4 Scripting with C++ Cookbook" предлагают реализовывать Object'ы путём добавления UPROPERTY параметров (с ссылкой на нужный блюпринт) на глобально доступные элементы (GameMode например) и в момент создания объекта на сцене получать его так:

AChapter2GameMode *gm = Cast<AChapter2GameMode>(GetWorld()->GetAuthGameMode() );
if( gm )
{
UUserProfile* object = ConstructObject<UUserProfile>(
gm->UPBlueprintClassName );
}

Если я допустил какие-либо ошибки - прошу меня поправить. Есть ли другие способы указать ссылку на блюпринт от Actor'а в Object'e? Данный способ создания инвентаря оправдывает себя? Буду рад любым вашим мыслям по поводу реализации инвентаря на c++.
Аватара пользователя
Пользователь
Сообщения: 2319
не понятно что хранить нужно и где... ссылку-переменную? на какой обьект? кто должен хранить? и где? чуть точнее сформулировать бы.
_________________
we need to go deeper
Аватара пользователя
Пользователь
Сообщения: 21
Snake писал(а):
не понятно что хранить нужно и где... ссылку-переменную? на какой обьект? кто должен хранить? и где? чуть точнее сформулировать бы.

Создаётся c++ класс наследуемый от ActorComponent, в нём будет лежать массив хранящий в себе Object'ы. Любой предмет в игре будет представляться 2-мя классами: Object - для записи в массив(хранения в инвентаре) и Actor - для отображения на сцене. Соответственно если предмет находится на сцене, то в Actor'е должна лежать ссылка на Object класс этого предмета, чтобы была возможность его подбирать. Если предмет находится в инвентаре (и представляет из себя Object класс записанный в массиве в ActorComponent), то для добавления его в мир(выбрасывания из инвентаря) нужно хранить в Object'e ссылку на блюпринт наследуемый от Actor класса(добавление происходит через команду GetWorld()->SpawnActor<AActor>(BlueprintClass, FVector(0, 0, 0), FRotator(0, 0, 0));).
Аватара пользователя
Пользователь
Сообщения: 21
Иначе говоря мне нужно хранить ссылку на блюпринт класс наследуемый от Actor'a в Object'e, причём так чтобы эту ссылку можно было менять в эдиторе. С Actor классами подобных проблем нет ибо это можно сделать через UPROPERTY, с Object классами такое не получается.
Во многих источниках предлагают реализовывать Object'ы путём добавления UPROPERTY параметров (с ссылкой на нужный блюпринт) на глобально доступные элементы (GameMode например). Мне это кажется тоже не очень удобно ибо эту ссылку приходится получать через вызов этого глобально доступного элемента.

Может я чего неправильно понимаю и горожу огород на пустом месте. Есть возможность делать инвентарь через Actor'ы, но говорят что через Object'ы лучше. Возможно я неправильно понял методику создания инвентаря через Object'ы, собственно потому и написал сюда - может кто меня поправит или информации какой даст.
Аватара пользователя
Пользователь
Сообщения: 2319
в архитектуру инвентаря мне лень вникать... слишком много вариантов возможных...
я так понимаю загвоздка в настройке, хранении или передачи какой-то конкретной переменной из/в уобжекта с актором?

Цитата:
Иначе говоря мне нужно хранить ссылку на блюпринт класс наследуемый от Actor'a в Object'e, причём так чтобы эту ссылку можно было менять в эдиторе. С Actor классами подобных проблем нет ибо это можно сделать через UPROPERTY, с Object классами такое не получается.

обычная же переменная, что конкретно нельзя с делать с UPROPERTY в UObject из того что можно сделать в акторе с такой же переменной?

Цитата:
но говорят что через Object'ы лучше.

только тем что для простого хранения данных не нужен весь функционал актора, соответственно они дешевле.
_________________
we need to go deeper
Последний раз редактировалось Snake 05 янв 2018, 21:03, всего редактировалось 1 раз.
Аватара пользователя
Пользователь
Сообщения: 21
Если создать переменную через UPROPERTY в actor'e то в блюпринте от этого актора можно поменять значение переменной через редактор. С Uobject такое не получается
Аватара пользователя
Пользователь
Сообщения: 2319
ммм... редактировать значения обьекта можно если он инстанс... и уже представлен конкретным екземпляром класса.
мне тоже такое нужно было, щас найду ссылку...
_________________
we need to go deeper
Аватара пользователя
Пользователь
Сообщения: 2319
viewtopic.php?f=19&t=7077
...ну и тупые же некоторые я вопросы тогда задавал -__-
_________________
we need to go deeper
Последний раз редактировалось Snake 05 янв 2018, 21:30, всего редактировалось 2 раз(а).
Аватара пользователя
Пользователь
Сообщения: 21
Snake писал(а):
https://uengine.ru/forum/viewtopic.php?f=19&t=7077

О, вроде то что надо, благодарю)
Аватара пользователя
Пользователь
Сообщения: 21
Snake писал(а):
https://uengine.ru/forum/viewtopic.php?f=19&t=7077

Как я понял создаётся абстрактный класс конфига наследуемый от Object. В нём создаются через UPROPERTY переменные, которые нам нужны. Далее в нужном нам классе создаётся через UPROPERTY массив хранящий в себе конфиг. Конфиг в массиве в результате всего можно указывать через эдитор и менять значения заданных в конфиге переменных. А как эти переменные использовать в коде? Не могу понять как обратиться к этим переменным в коде.


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

UEngine.ru © 2017
Все права защищены. При копировании материалов с сайта, ссылка на первоисточник обязательна.
Яндекс.Метрика
Главная страница