Полезное

Мы Вконтакте

Discord канал

#
Модератор: Di-Crash
Аватара пользователя
Пользователь
Сообщения: 2
Использую карту из стандартного примера, за исключением того, что удалил все классы и стал писать свою с нуля
Вот сфера 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();
   }
}
Аватара пользователя
Тех. администратор
Сообщения: 367
У вас галочка Generate Overlap Events или как её там стоит? В приведённом коде не видно чтобы её выставляли...
Аватара пользователя
Пользователь
Сообщения: 2
Да, стоит.
Сейчас скопировал код из примера стандартного проекта, и настроил BP класс сферы как в том же примере
Код:
#pragma once
#include "GameFramework/Actor.h"
#include "ShellBoom.generated.h"

UCLASS(config = Game)
class INDIGOPROJECT_API AShellBoom: public AActor {
   GENERATED_BODY()

   // Наша сфера
   UPROPERTY(VisibleDefaultsOnly, Category = Projectile)
   class USphereComponent* CollisionComp;

   // Движение
   UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Movement, meta = (AllowPrivateAccess = "true"))
   class UProjectileMovementComponent* ProjectileMovement;

   public:
   // Инициализация
   AShellBoom(const FObjectInitializer& ObjectInitializer);

   // Вызывается, когда снаряд поподает во что-то
   UFUNCTION()
   void OnHit(AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit);

   // Вохвращает CollisionComp
   //FORCEINLINE class USphereComponent* GetCollisionComp() const { return CollisionComp; }

   // Вохвращает ProjectileMovement
   //FORCEINLINE class UProjectileMovementComponent* GetProjectileMovement() const { return ProjectileMovement; }

};


Код:
#include "IndigoProject.h"
#include "ShellBoom.h"
#include "GameFramework/ProjectileMovementComponent.h"
#include "Engine.h"


AShellBoom::AShellBoom(const FObjectInitializer& ObjectInitializer): Super(ObjectInitializer) {
   // Создаем сферу
   CollisionComp = CreateDefaultSubobject<USphereComponent>(TEXT("SphereComp"));
   CollisionComp->BodyInstance.SetCollisionProfileName("Projectile");
   CollisionComp->OnComponentHit.AddDynamic(this, &AShellBoom::OnHit); // Событие при приконсновении

   // Игроки не могут взаимодействовать с ним
   CollisionComp->SetWalkableSlopeOverride(FWalkableSlopeOverride(WalkableSlope_Unwalkable, 0.f));
   CollisionComp->CanCharacterStepUpOn = ECB_No;

   // Установить как Root компонент
   RootComponent = CollisionComp;

   // Настраиваем движение снаряда
   ProjectileMovement = CreateDefaultSubobject<UProjectileMovementComponent>(TEXT("ProjectileComp"));
   ProjectileMovement->UpdatedComponent = CollisionComp;
   ProjectileMovement->InitialSpeed = 3000.f;
   ProjectileMovement->MaxSpeed = 3000.f;
   ProjectileMovement->bRotationFollowsVelocity = true;
   ProjectileMovement->bShouldBounce = true;

   // Удаляем через 3 секунды
   InitialLifeSpan = 3.0f;
}

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();
   }
}


Снаряды теперь отталкиваются от всего, а событие OnHit все так же не вызывается


Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 109

UEngine.ru © 2017
Все права защищены. При копировании материалов с сайта, ссылка на первоисточник обязательна.
Яндекс.Метрика
Главная страница