For some reason, I can't seem to stop my Ordnance Object colliding with the object it's fired from (causing me to be pushed back/around on firing). The object firing it is a physics enabled object, and the 'Instigator' property is being set correctly. Am I missing something here?
I want it to collide with everything other than it's owner... I'm following ShooterGames' example for Projectiles, but not having any luck :/ The weapon sets the ordnances Instigator before it's spawned in the world.
Ordnance CPP
Edit: Ended up modifying the code to use 'Overlap' on the collision sphere, and just did a check when it overlaps to see if it's the Instigator, same way that Unreal Tournament 4 does it. Perhaps MoveIgnore only works for Overlaps...
I want it to collide with everything other than it's owner... I'm following ShooterGames' example for Projectiles, but not having any luck :/ The weapon sets the ordnances Instigator before it's spawned in the world.
Ordnance CPP
Code:
AShooterProjectile::AShooterProjectile(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { CollisionComp = ObjectInitializer.CreateDefaultSubobject<USphereComponent>(this, TEXT("SphereComp")); CollisionComp->InitSphereRadius(5.0f); CollisionComp->AlwaysLoadOnClient = true; CollisionComp->AlwaysLoadOnServer = true; CollisionComp->bTraceComplexOnMove = true; CollisionComp->SetCollisionEnabled(ECollisionEnabled::QueryOnly); CollisionComp->SetCollisionObjectType(COLLISION_PROJECTILE); CollisionComp->SetCollisionResponseToAllChannels(ECR_Ignore); CollisionComp->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Block); CollisionComp->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Block); CollisionComp->SetCollisionResponseToChannel(ECC_Pawn, ECR_Block); RootComponent = CollisionComp; ParticleComp = ObjectInitializer.CreateDefaultSubobject<UParticleSystemComponent>(this, TEXT("ParticleComp")); ParticleComp->bAutoActivate = false; ParticleComp->bAutoDestroy = false; ParticleComp->AttachParent = RootComponent; MovementComp = ObjectInitializer.CreateDefaultSubobject<UProjectileMovementComponent>(this, TEXT("ProjectileComp")); MovementComp->UpdatedComponent = CollisionComp; MovementComp->InitialSpeed = 2000.0f; MovementComp->MaxSpeed = 2000.0f; MovementComp->bRotationFollowsVelocity = true; MovementComp->ProjectileGravityScale = 0.f; PrimaryActorTick.bCanEverTick = true; PrimaryActorTick.TickGroup = TG_PrePhysics; SetRemoteRoleForBackwardsCompat(ROLE_SimulatedProxy); bReplicates = true; bReplicateInstigator = true; bReplicateMovement = true; } void AShooterProjectile::PostInitializeComponents() { Super::PostInitializeComponents(); MovementComp->OnProjectileStop.AddDynamic(this, &AShooterProjectile::OnImpact); CollisionComp->MoveIgnoreActors.Add(Instigator); AShooterWeapon_Projectile* OwnerWeapon = Cast<AShooterWeapon_Projectile>(GetOwner()); if (OwnerWeapon) { OwnerWeapon->ApplyWeaponConfig(WeaponConfig); } SetLifeSpan( WeaponConfig.ProjectileLife ); MyController = GetInstigatorController(); }
Edit: Ended up modifying the code to use 'Overlap' on the collision sphere, and just did a check when it overlaps to see if it's the Instigator, same way that Unreal Tournament 4 does it. Perhaps MoveIgnore only works for Overlaps...