Unreal Engine 4
http://uengine.ru/forum/

Инвентарь на UObject'ах
http://uengine.ru/forum/viewtopic.php?f=19&t=12922
Страница 1 из 3

Автор:  kiteg [ 05 янв 2018, 15:34 ]
Заголовок сообщения:  Инвентарь на UObject'ах

Хочу сделать инвентарь на 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++.

Автор:  Snake [ 05 янв 2018, 19:04 ]
Заголовок сообщения: 

не понятно что хранить нужно и где... ссылку-переменную? на какой обьект? кто должен хранить? и где? чуть точнее сформулировать бы.

Автор:  kiteg [ 05 янв 2018, 19:57 ]
Заголовок сообщения:  Re:

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));).

Автор:  kiteg [ 05 янв 2018, 20:09 ]
Заголовок сообщения: 

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

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

Автор:  Snake [ 05 янв 2018, 20:48 ]
Заголовок сообщения: 

в архитектуру инвентаря мне лень вникать... слишком много вариантов возможных...
я так понимаю загвоздка в настройке, хранении или передачи какой-то конкретной переменной из/в уобжекта с актором?

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

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

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

только тем что для простого хранения данных не нужен весь функционал актора, соответственно они дешевле.

Автор:  kiteg [ 05 янв 2018, 21:02 ]
Заголовок сообщения:  Re:

Если создать переменную через UPROPERTY в actor'e то в блюпринте от этого актора можно поменять значение переменной через редактор. С Uobject такое не получается

Автор:  Snake [ 05 янв 2018, 21:05 ]
Заголовок сообщения: 

ммм... редактировать значения обьекта можно если он инстанс... и уже представлен конкретным екземпляром класса.
мне тоже такое нужно было, щас найду ссылку...

Автор:  Snake [ 05 янв 2018, 21:10 ]
Заголовок сообщения: 

viewtopic.php?f=19&t=7077
...ну и тупые же некоторые я вопросы тогда задавал -__-

Автор:  kiteg [ 05 янв 2018, 21:15 ]
Заголовок сообщения:  Re:

Snake писал(а):
https://uengine.ru/forum/viewtopic.php?f=19&t=7077

О, вроде то что надо, благодарю)

Автор:  kiteg [ 06 янв 2018, 12:18 ]
Заголовок сообщения:  Re:

Snake писал(а):
https://uengine.ru/forum/viewtopic.php?f=19&t=7077

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

Страница 1 из 3 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/