ContentExamples или из StrategyGame, чтобы применить их в вашей игре. Чтобы
сделать это, обратитесь к разделу Импортирование ассетов в Главе 10. Система
инвентаризации и подбор предметов. Когда вы закончите с импортом ассетов,
мы сможем перейти к добавлению монстров в ваш мир.
Монстры
Мы начнём программировать монстров таким же способом, как мы
программировали NPC и PickupItem. Во первых, мы напишем базовый класс
(происходящий от персонажа), чтобы представить класс Monster. Затем, мы
выполним происхождение группы схем (blueprint) для каждого типа монстров. У
каждого монстра будет пара свойств общих со всеми, которые определяют их
поведение. Вот общие свойства:
Переменная типа float для скорости.
Переменная типа float для значения HitPoints, обозначающего урон (я
обычно использую тип float для HP, так что мы можем легко сможем
смоделировать эффекты истощающие HP, такие как проходить через поток
лавы).
Переменная int32 для опыта, получаемого при победе над монстрами.
Функция UClass для добычи оставленной монстром.
Переменная типа float для BaseAttackDamage (базовый урон атаки)
выполняемы при каждой атаке.
227 |
С т р а н и ц а
Переменная типа float для AttackTimeout, что является объёмом времени, на
который монстр прерывается между атаками.
Два объекта USphereComponents: Один из них это SightSphere – как далеко
он может видеть. Другой это AttackRangeSphere – как далеко могут достигать
его атаки. Объект AttackRangeSphere всегда меньше чем SightSphre.
Выполните проиcхождение от класса Character, чтобы создать ваш класс Monster. В
UE4 вы можете сделать это перейдя в File | Add Code To Project… и затем выбрав
опцию Character в меню для вашего базового класса.
Заполните класс Monster базовыми свойствами. Убедитесь, что вы объявляете
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = MonsterProperties), так что
свойства монстров могут быть изменены в блупринтах:
UCLASS()
class GOLDENEGG_API AMonster : public ACharacter
{
GENERATED_UCLASS_BODY()
//
Насколько он быстр
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = MonsterProperties)
float Speed;
//
Единицы здоровья монстра
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = MonsterProperties)
float HitPoints;
//
Опыт получаемый от побед
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = MonsterProperties)
int32 Experience;
// Blueprint
типа предмета обронённого монстром
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = MonsterProperties)
UClass* BPLoot;
//
Объём урона получаемого от атаки
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = MonsterProperties)
float BaseAttackDamage;
//
Объём времени, необходимый монстру для отдыха
//
между атаками
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = MonsterProperties)
float AttackTimeout;
//
Время с последнего удара монстра, читаемое в blueprint
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = MonsterProperties)
float TimeSinceLastStrike;
//
Расстояние на котором он видит
UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly, Category = Collision)
USphereComponent* SightSphere;
//
Дальность его атаки. Визуализируемая в редакторе как сфера
UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly, Category = Collision)
228 |
С т р а н и ц а
USphereComponent* AttackRangeSphere;
};
Вам понадобится минимальный код в вашем конструкторе Monster, чтобы задать
свойства монстра. Используйте следующий код в файле Monster.cpp:
AMonster::AMonster(const class FObjectInitializer& PCIP) : Super(PCIP)
{
Speed = 20; //
Скорость
HitPoints = 20; //
Здоровье
Experience = 0; //
Опыт
BPLoot = NULL; //
Трофеи
BaseAttackDamage = 1; //
Урон базовой атаки
AttackTimeout = 1.5f; //
Длительность атаки
TimeSinceLastStrike = 0;
// Прошло времени с последнего удара
SightSphere = PCIP.CreateDefaultSubobject (this,
TEXT("SightSphere"));
SightSphere->AttachTo( RootComponent );
AttackRangeSphere = PCIP.CreateDefaultSubobject (this,
TEXT("AttackRangeSphere"));
AttackRangeSphere->AttachTo( RootComponent );
}
Компилируйте и запустите код. Отройте Unreal Editor и выполните происхождение
блупринт основанного на вашем классе Monster (назовите его BP_Monster). Теперь
мы можем начать конфигурировать свойства ваших монстров.
Для скелетной сетки мы хотим использовать модель HeroTPP для монстра, потому
что нам нужно, чтобы монстр мог выполнять рукопашную атаку, а HeroTPP не идёт
с рукопашной атакой. Однако некоторые модели в файле Maximo Animation Pack
обладают анимацией рукопашной атаки. Итак, скачайте файл Maximo Animation
Достарыңызбен бөлісу: |