Использую карту из стандартного примера, за исключением того, что удалил все классы и стал писать свою с нуля
Вот сфера
https://yadi.sk/i/MvjoQA58fGUVXОна пролетает сквозь пол, но взаимодействует с кубами, причем при столкновении не отталкивается от них, а летит как супермен протаскивая кубы вперед ничуть не теряя кинетической энергии
https://yadi.sk/i/Hc5B1FB-fGUJNЕщё совершенно не вызывается событие OnHit, вот родительский класс блупринта
Код:
#pragma once
#include "GameFramework/Actor.h"
#include "ShellBoom.generated.h"
UCLASS(config = Game)
class INDIGOPROJECT_API AShellBoom: public AActor {
GENERATED_BODY()
public:
// Начальная инициализация
AShellBoom(const FObjectInitializer& ObjectInitializer);
// Сфера
UPROPERTY(VisibleDefaultsOnly, Category = Projectile)
class USphereComponent* CollisionComp;
// Движение
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Movement)
class UProjectileMovementComponent* ProjectileMovement;
// Инициализация вектора снаряда
void InitVelocity(const FVector& ShootDirection);
// Когда мы с чем-то столкнулись
UFUNCTION()
void OnHit(class AActor* OtherActor, class UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit);
};
Код:
#include "IndigoProject.h"
#include "ShellBoom.h"
#include "GameFramework/ProjectileMovementComponent.h"
#include "Engine.h"
AShellBoom::AShellBoom(const FObjectInitializer& ObjectInitializer): Super(ObjectInitializer) {
// Создаем сферу
CollisionComp = ObjectInitializer.CreateDefaultSubobject<USphereComponent>(this, TEXT("SphereComp"));
RootComponent = CollisionComp;
CollisionComp->OnComponentHit.AddDynamic(this, &AShellBoom::OnHit);
// Даем начальную скорость
ProjectileMovement = ObjectInitializer.CreateDefaultSubobject<UProjectileMovementComponent>(this, TEXT("ProjectileComp"));
ProjectileMovement->UpdatedComponent = CollisionComp;
ProjectileMovement->InitialSpeed = 3000.f;
ProjectileMovement->MaxSpeed = 3000.f;
ProjectileMovement->bRotationFollowsVelocity = true;
ProjectileMovement->bShouldBounce = true;
ProjectileMovement->Bounciness = 0.3f;
// Время жизни 3 секунды
InitialLifeSpan = 3.0f;
}
// Запиливаем вектор
void AShellBoom::InitVelocity(const FVector& ShootDirection) {
if(ProjectileMovement) {
// Установка вектора
ProjectileMovement->Velocity = ShootDirection * ProjectileMovement->InitialSpeed;
}
}
// При столкновении
void AShellBoom::OnHit(AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit) {
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Blue, TEXT("Попадание"));
// Если мы попали в физический объект
if((OtherActor != NULL) && (OtherActor != this) && (OtherComp != NULL) && OtherComp->IsSimulatingPhysics()) {
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Blue, TEXT("в физический объект"));
OtherComp->AddImpulseAtLocation(GetVelocity() * 100.0f, GetActorLocation());
Destroy();
}
}