Снаряды или дальняя атака
Атака с расстояния обычно включает какого-либо рода снаряды. Снаряды – это
например, пули, но не только. Они могут также представлять из себя атаки
магическими разрядами молнии или огненным шаром. Чтобы спрограммировать
атаку снарядами, вам нужно породить новый объект и применять урон к игроку,
только если снаряд достигает игрока.
Чтобы осуществить базовые пули в UE4, нам следует выполнить происхождение
объекта нового типа. Я выполнил происхождение класса ABullet от класса AActor,
как показано в следующем коде:
UCLASS()
class GOLDENEGG_API ABullet : public AActor
{
GENERATED_UCLASS_BODY()
//
Сколько урона наносит пуля.
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Properties)
float Damage;
//
Видимая сетка – Meshдля компонента, чтобы мы могли
//
стреляющий объект
UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly, Category = Collision)
UStaticMeshComponent* Mesh;
262 |
С т р а н и ц а
//
сфера, с которой вы сталкиваетесь, чтобы нанести урон
UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly, Category = Collision)
USphereComponent* ProxSphere;
UFUNCTION(BlueprintNativeEvent, Category = Collision)
void Prox( AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool
bFromSweep, const FHitResult & SweepResult );
};
Класс ABullet имеет пару важных элементов:
Переменная типа float для урона, который наносит пуля при контакте
Переменная Mesh для тела пули
Переменная ProxSphere, чтобы определять, когда пуля попала во что-то
Функция для запуска, когда Prox замечен рядом с объектом
Конструктор для класса ABullet должен иметь инициализацию переменной Mesh и
переменной ProxSphere. В конструкторе мы устанавливаем, что RootComponent
будет переменная Mesh, а затем добавим переменную ProxSphere к переменной
Mesh. Переменная ProxSphere будет использоваться для проверки столкновения, а
проверка столкновения для переменной Mesh должна быть выключена, как
показано в следующем коде:
ABullet::ABullet(const class FObjectInitializer& PCIP) : Super(PCIP)
{
Mesh = PCIP.CreateDefaultSubobject(this, TEXT("Mesh"));
RootComponent = Mesh;
ProxSphere = PCIP.CreateDefaultSubobject(this, TEXT("ProxSphere"));
ProxSphere->AttachTo( RootComponent );
ProxSphere->OnComponentBeginOverlap.AddDynamic( this, &ABullet::Prox );
Damage = 1;
}
В конструкторе мы присвоили начальное значение 1, переменной Damage (урон).
Но его можно изменять в редакторе UE4, как только мы создадим блупринт класса
ABullet. Далее функция ABullet::Prox_Implementation() должна работать с уроном
актора, получившего удар, если мы сталкиваемся с другим актором от
RootComponent, используя следующий код:
void ABullet::Prox_Implementation( AActor* OtherActor, UPrimitiveComponent* OtherComp, int32
OtherBodyIndex, bool bFromSweep, const FHitResult &SweepResult )
{
if( OtherComp != OtherActor->GetRootComponent() )
{
//
не сталкиваемся ни с чем другим
//
кроме актора root component
return;
}
OtherActor->TakeDamage( Damage, FDamageEvent(), NULL, this );
Destroy();
}
263 |
С т р а н и ц а
Достарыңызбен бөлісу: |