2024-04-13
깃허브! |
---|
https://github.com/ChangJin-Lee/ARproject |
★ https://github.com/ChangJin-Lee/ToonTank |
느낀점
우선 UPrimitiveComponent는 해당 컴포넌트의 tick동안에 다른 컴포넌트의 위치를 업데이트한다. 발사체에 대한 아주 자세한 설정이 가능하다. UPrimitiveComponent는 되게 다양한 정보를 가지고 있는데, 특히 collision data와 관련된 geometry 종류들이 아주 많이 들어있다. 그리고 이건 SceneComponents이다. 발사체와 관련된 내용을 배우면서 굉장히 흥미로웠다. tick 마다 좌표값을 더해서 움직을 주는것이 아니라 특정 컴포넌트를 가져다가 사용하는 점이 매우 인상깊었다.
UPROPERTY(VisibleAnywhere, Category = "Movement")
class UProjectileMovementComponent* ProjectileMovement;
// 콜백함수가 작동하려면 UFUNCTION이어야만 함
UFUNCTION()
void OnHit(UPrimitiveComponent* HitComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit);```
// Sets default values
AProjectile::AProjectile()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = false;
ProjectileMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Projectile Mesh"));
RootComponent = ProjectileMesh;
ProjectileMovement = CreateDefaultSubobject<UProjectileMovementComponent>(TEXT("ProjectileMovement"));
ProjectileMovement->InitialSpeed = ProjectileInitialSpeed;
ProjectileMovement->MaxSpeed = ProjectileMaxSpeed;
}
void AProjectile::OnHit(UPrimitiveComponent* HitComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit)
{
auto MyOwner = GetOwner();
if(MyOwner==nullptr) return;
auto MyOwnerInstigator = MyOwner->GetInstigatorController();
auto DamageTypeClass = UDamageType::StaticClass();
// UDamageType을 블루프린트 기반으로 만들거나 별도 데이터를 설정하는게 아니기 때문에
// TSubclassOf 변수는 필요 없다.
if(OtherActor && OtherActor != this && OtherActor != MyOwner)
{
UGameplayStatics::ApplyDamage(OtherActor, Damage, MyOwnerInstigator, this, DamageTypeClass);
Destroy();
}
}