Elzean
(Elzean)
October 21, 2014, 4:37pm
1
I am having trouble with this part of code which i did while following the Shooter example :
AProjectile class :
#pragma once
#include "GameFramework/Actor.h"
#include "Projectile.generated.h"
/**
*
*/
UCLASS(Abstract, Blueprintable)
class ARENA_API AProjectile : public AActor
{
GENERATED_UCLASS_BODY()
...
}
Line of code in another class :
AProjectile* Projectile = Cast<AProjectile>(UGameplayStatics::BeginSpawningActorFromClass(this, MagicConfig.ProjectileClass, SpawnTM));
Error :
1>E:\Google Drive\UE4\Projects\Arena\Source\Arena\Private\Magics\Magic.cpp(30): error C2275: 'AProjectile' : illegal use of this type as an expression
1> E:\Google Drive\UE4\Projects\Arena\Source\Arena\Classes/Projectiles/Projectile.h(13) : see declaration of 'AProjectile'
It’s very similar to the shooter example but i don’t understand the error
Young_Wolf
(Young_Wolf)
October 21, 2014, 6:39pm
2
Are you sure you are including the AProjectile.h?
Edit: Yes you are including it.
Can you post AProjectile.h?
Elzean
(Elzean)
October 22, 2014, 7:48am
3
Here is the AProjectile.h :
#pragma once
#include "GameFramework/Actor.h"
#include "Projectile.generated.h"
/**
*
*/
UCLASS(Abstract, Blueprintable)
class ARENA_API AProjectile : public AActor
{
GENERATED_UCLASS_BODY()
/** initial setup */
virtual void PostInitializeComponents() override;
/** setup velocity */
void InitVelocity(FVector& ShootDirection);
/** handle hit */
UFUNCTION()
void OnImpact(const FHitResult& HitResult);
protected:
/** movement component */
UPROPERTY(VisibleDefaultsOnly, Category = Projectile)
TSubobjectPtr<UProjectileMovementComponent> MovementComp;
/** collisions */
UPROPERTY(VisibleDefaultsOnly, Category = Projectile)
TSubobjectPtr<USphereComponent> CollisionComp;
UPROPERTY(VisibleDefaultsOnly, Category = Projectile)
TSubobjectPtr<UParticleSystemComponent> ParticleComp;
/** life time */
UPROPERTY(EditDefaultsOnly, Category = ProjectileStat)
float ProjectileLife;
/** damage at impact point */
UPROPERTY(EditDefaultsOnly, Category = ProjectileStat)
int32 ExplosionDamage;
/** radius of damage */
UPROPERTY(EditDefaultsOnly, Category = ProjectileStat)
float ExplosionRadius;
/** type of damage */
UPROPERTY(EditDefaultsOnly, Category = WeaponStat)
TSubclassOf<UDamageType> DamageType;
/** effects for explosion */
//UPROPERTY(EditDefaultsOnly, Category = Effects)
TSubclassOf<class AExplosionEffect> ExplosionTemplate;
/** controller that fired me (cache for damage calculations) */
TWeakObjectPtr<AController> MyController;
/** did it explode? */
UPROPERTY(Transient, ReplicatedUsing = OnRep_Exploded)
bool bExploded;
/** [client] explosion happened */
UFUNCTION()
void OnRep_Exploded();
/** trigger explosion */
void Explode(const FHitResult& Impact);
/** shutdown projectile and prepare for destruction */
void DisableAndDestroy();
/** update velocity on client */
virtual void PostNetReceiveVelocity(const FVector& NewVelocity) override;
};
Elzean
(Elzean)
October 23, 2014, 8:50am
4
I’m still stuck on this
Here is the class where i use the Cast :
#include "Arena.h"
AMagic::AMagic(const class FPostConstructInitializeProperties& PCIP)
: Super(PCIP)
{
}
void AMagic::Cast()
{
}
bool AMagic::ServerCast_Validate(FVector Origin, FVector_NetQuantizeNormal ShootDir)
{
return true;
}
void AMagic::ServerCast_Implementation(FVector Origin, FVector_NetQuantizeNormal ShootDir)
{
FTransform SpawnTM(ShootDir.Rotation(), Origin);
AProjectile* Projectile = Cast<AProjectile>(UGameplayStatics::BeginSpawningActorFromClass(this, MagicConfig.ProjectileClass, SpawnTM));
/*if (Projectile)
{
Projectile->Instigator = Instigator;
Projectile->SetOwner(this);
Projectile->InitVelocity(ShootDir);
UGameplayStatics::FinishSpawningActor(Projectile, SpawnTM);
}*/
}
Alderbit
(Alderbit)
October 23, 2014, 11:36am
5
Are you trying to spawn an instance of AProjectile, or a subclass derived from it? AProjectile is marked as abstract in the UCLASS properties.
Elzean
(Elzean)
October 23, 2014, 11:48am
6
As it is now it would be an Instance of AProjectile. I tried to remove the Abstract but i have the same error.
I simply tried to follow the way it was done in the shooter example :
AShooterProjectile.h :
UCLASS(Abstract, Blueprintable)
class AShooterProjectile : public AActor
and then within ShooterWeapon_Projectile.ccp :
void AShooterWeapon_Projectile::ServerFireProjectile_Implementation(FVector Origin, FVector_NetQuantizeNormal ShootDir)
{
FTransform SpawnTM(ShootDir.Rotation(), Origin);
AShooterProjectile* Projectile = Cast<AShooterProjectile>(UGameplayStatics::BeginSpawningActorFromClass(this, ProjectileConfig.ProjectileClass, SpawnTM));
if (Projectile)
{
Projectile->Instigator = Instigator;
Projectile->SetOwner(this);
Projectile->InitVelocity(ShootDir);
UGameplayStatics::FinishSpawningActor(Projectile, SpawnTM);
}
}
Exelcior
(Exelcior)
October 23, 2014, 12:35pm
7
Where you use the cast (inside the class AMagic) You have also defined void AMagic::Cast(). This is probably where the error is coming from, removing or renaming that method should allow it to compile.
Elzean
(Elzean)
October 23, 2014, 12:46pm
8
Yes! seems like that was it. I didnt even pay attention of that, i guess i will just change the name. Thanks !