208 |
С т р а н и ц а
Базовый класс PickupItem
Мы должны определить, как подбор предметов будет выглядеть в коде. Каждый
подбираемый предмет будет происходить от общего базового класса. Давайте
сейчас сконструируем базовый класс для класса PickupItem (подбор предметов).
Базовый класс PickupItem должен наследоваться от класса AActor. Подобно тому,
как мы создали множество схем (blueprint) NPC от базового класса NPC, мы можем
создать и множество схем (blueprint) PickupItem от единственного базового класса
PickpItem, как показано на следующем скриншоте:
Как только
вы создадите класс PickupItem, откройте его код в Visual Studio.
Классу APickupItem понадобится несколько элементов:
Переменная FString для имени подбираемого
предмета
Переменная int32 для количества подбираемого предмета
Переменная USphereComponent для сферы которой вы будете сталкиваться,
чтобы подобрать
предмет
Переменная UStaticMeshComponent, чтобы содержать сетку
Переменная UTexture2D для значка, который представляет предмет
Указатель для HUD (который мы инициализируем позже)
Вот как выглядит код в APickupItem.h:
UCLASS()
class GOLDENEGG_API APickupItem : public AActor
{
GENERATED_UCLASS_BODY()
//
Имя предмета, который вы заполучаете
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Item)
FString Name;
//
Как
много вы заполучаете
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Item)
int32 Quantity;
//
сфера, с которой вы сталкиваетесь, что подобрать предмет
UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly, Category = Item)
TSubobjectPtr
ProxSphere;
209 |
С т р а н и ц а
//
Сетка предмета
UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly, Category = Item)
TSubobjectPtr
Mesh;
//
Значок, который представляет объект в интерфейсе пользователя/на поверхности
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Item)
UTexture2D* Icon;
//
Когда что-то попадает в ProxSphere, эта функция запускается
UFUNCTION(BlueprintNativeEvent, Category = Collision)
void Prox( AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool
bFromSweep, const FHitResult & SweepResult );
};
Суть всех этих объявлений UPROPERTY(), в том чтобы сделать APickupItem
полностью конфигурируемым посредством схем (blueprint). Например, предметы в
категории Pickup, в редакторе blueprint будут отображены следующим образом:
В файле PickupItem.cpp, мы завершаем конструктор для класса APickupItem, как
показано в следующем коде:
APickupItem::APickupItem(const class FPostConstructInitializeProperties&
PCIP) : Super(PCIP)
{
Name = "UNKNOWN ITEM"; .//
“НЕИЗВЕСТНЫЙ ПРЕДМЕТ”
Quantity = 0;
// Задаём объект Unreal
ProxSphere = PCIP.CreateDefaultSubobject(this, TEXT("ProxSphere"));
Mesh = PCIP.CreateDefaultSubobject(this, TEXT("Mesh"));
//
делаем корневым объектом Mesh
RootComponent = Mesh;
Mesh->SetSimulatePhysics(true);
//
Пишем код для запуска APickupItem::Prox(), когда эта
//
сфера близости объекта пересекается с другим актором.
ProxSphere->OnComponentBeginOverlap.AddDynamic(this,
&APickupItem::Prox);
ProxSphere->AttachTo( Mesh ); //
очень важно!
}
210 |
С т р а н и ц а
На первых двух строках мы выполняем установку значений имени (Name) и
количества (Quantity), которые должны предстать перед разработчиком игры как
изначально заданные. Я использовал заглавные буквы, чтобы разработчик мог
видеть, что до этого переменная ещё не устанавливалась.
Затем, мы присваиваем начальные значения компонентам ProxSphere и Mesh
используя PCIP.CreateDefaultSubobject. Недавно инициализированные объекты
могут иметь некоторые из своих начально заданных значений, но Mesh (сетка)
будет стартовать пустой. Вам понадобится загрузить саму сетку позже, в
блупринтах.
Сетку мы устанавливаем, чтобы симулировать реалистичную физику, так что если
предметы бросать или двигать, то они будут отскакивать и катиться или
переворачиваться. Обратите особое внимание на строку ProxSphere->AttachTo(
Mesh ). Это трока говорит вам убедиться, что компонент подбираемого предмета
ProxSphere прикреплён к корневому компоненту Mesh. Это означает, что когда
сетка двигается в уровне, то ProxSphere следует за ней. Если вы забудете этот шаг
(или если вы сделали его как то по другому), то ProxSphere не будет следовать за
сеткой, когда она подпрыгивает.
Достарыңызбен бөлісу: