1
์ธ๋ฆฌ์ผ์์ c++ ํด๋์ค๋ฅผ ์์ฑํ ๋ ํผ๋ธ๋ฆญ์ผ๋ก ๋ง๋ค๋ฉด, ์์ ์ด ์ํ ๋ชจ๋ ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ๋ชจ๋์์๋ ํฌํจ ๋ฐ ์ฌ์ฉ์ด ๊ฐ๋ฅํจ. ํ๋ผ์ด๋น์ผ๋ก ํ๋ฉด, ์์ ์ด ์ํ ๋ชจ๋์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํจ. -> ์ธ๋ถ์๋ ๊ณต๊ฐํ ์ง, ๋ด ํ๋ก์ ํธ์๋ง ์ธ์ง ๊ฒฐ์ ํ ์ ์์.
-
์์ ๋ก๋ฉ ๋ฐฉ๋ฒ ๋๊ธฐํ๋ ๋ก๋ฉ ๋ฐฉ๋ฒ, ๋น๋๊ธฐํ ๋ก๋ฉ ๋ฐฉ๋ฒ. AssetManager ๋ผ๋ ํด๋์ค๊ฐ ์์.
-
๋๊ธฐํ๋ ๋ก๋ฉ๋ฐฉ๋ฒ
- ConstructorHelpers
์์ฑ์์์๋ง ์ฌ์ฉํ ์ ์๋ ์์
๋ก๋ฉ๋ฐฉ์. ์ด์ธ์ ์์น์์ ์ฐ๋ฉด ์๋ฌ ๋ฐ์.
- FObjectFinder : ์ค๋ธ์ ํธ ์์ฒด๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ. ๊ฐ์ ๊ฐ์ฒด ์ฌ๋ฌ๊ฐ ์์ฑํด๋ ๋ฉ์๋ ํ๋ฒ๋ง ๋ก๋ํ๋ฉด ๋๋๊น. ๋ณดํต static ์ ์์ ๋ถ์ฌ์ค. ๊ทธ๋ฆฌ๊ณ ๋ฉ์์ ๊ฒฝ๋ก ๋ณต์ฌ๊ฐ ์๋๋ผ, ๋ ํผ๋ฐ์ค ๋ณต์ฌ๋ฅผ ํด์ผ ํจ.
1 2 3 4 5 6 7 8 9 10 11 12
APlayerCharacter::APlayerCharacter() { // Set this character to call Tick() every frame. You can turn this off to improve performance if you don't need it. PrimaryActorTick.bCanEverTick = true; static ConstructorHelpers::FObjectFinder<USkeletalMesh> meshAsset(TEXT("/Script/Engine.SkeletalMesh'/Game/ParagonKallari/Characters/Heroes/Kallari/Skins/Tough/Meshes/Kallari_Tough.Kallari_Tough'")); if (meshAsset.Succeeded()) { GetMesh()->SetSkeletalMeshAsset(meshAsset.Object); } }
- FClassFinder : ์ธ๋ฆฌ์ผ ํด๋์ค๋ UCLASS ๋ผ๋ ํ์
์ด ์์. ์ด๊ฑด ํด๋์ค ์ ๋ณด๋ฅผ ๊ฐ๊ณ ์๋ ๊ฑฐ์. ์ด๊ฑธ ์ด์ฉํด ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๋๋ฐ,
๊ฐ๋ฅํ ์ด์ ๋, ์ธ๋ฆฌ์ผ ์์ง ์์ํ๋ฉด
CDO
๋ผ๋ ๊ฑธ ๋ฌด์กฐ๊ฑด ์์ฑํจ. CDO๋ Class Default Object์. ์์ง ์์ํ๋ฉด CDO ๋ก ํด๋์ค ๊ฐ์ฒด๋ฅผ ํ๋ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋์. ๊ทธ๋ฆฌ๊ณ ์ด ํด๋์ค์ UCLASS ์ ๋ณด๋ฅผ ๋ง๋ค์ด๋์. ์ด๊ฑธ ๋ณต์ ํด์ ๊ฐ์ฒด ์์ฑ์ด ์ด๋ฃจ์ด์ง.
- ConstructorHelpers
์์ฑ์์์๋ง ์ฌ์ฉํ ์ ์๋ ์์
๋ก๋ฉ๋ฐฉ์. ์ด์ธ์ ์์น์์ ์ฐ๋ฉด ์๋ฌ ๋ฐ์.
// โโโ
์ธ๋ฆฌ์ผ ์ขํ
x๊ฐ ์(์ ๋ฉด), y๊ฐ ์, z๊ฐ ์.
Input Action value type: digital: ํ๋ฒ ๋๋ฅธ ๊ฐ์ผ๋ก ๋์ ๊ฒฐ์ ํ๊ฒ ๋ค๋ ๋ง. axis2d: 2๊ฐ์ง ๊ฐ์ ์ด์ฉํ๊ฒ ๋ค๋ ๋ง. advanced->accumlation ~ : cuma๋จธ์๊ธฐ: ๋์ ์ํจ๋ค๋ ๋ง. ์๋ก ๋ฐ๋๋๋ ๊ฐ (w-s, a-d๋ฅผ ๋์์ ๋๋ฅด๋ฉด, ๋์ ํด์ ์์์์ผ์, ์์ง์ ์๋๋ก.)
์ฝ๋ ์์ฑํ ๋,
TObjectPTr ์ด๋ผ๋ ์ค๋งํธ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋
TObjectPtr
๊ทธ๋ฅ ํฌ์ธํฐ๋ก ํด๋ ๋๊ธด ํจ. UInputMappingContext*
์บ๋ฆญํฐ์ ๋น์๋ ์ปจํธ๋กค๋ฌ๋ฅผ ๊ฐ์ ธ์ฌ ๋ GetController ํจ์๋ Controller ํ์ ์ผ๋ก ๋ฐํํ๊ธฐ ๋๋ฌธ์ APlayerController๋ก ๋ค์ด์บ์คํ ํ์ฌ ์ฌ์ฉํ๋ค. UObject ๋ฅผ ์์๋ฐ์ ๋ง๋ค์ด์ง ๊ฐ์ฒด๋ค์ Cast ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ณํ ํ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
void APlayerCharacter::BeginPlay()
{
Super::BeginPlay();
APlayerController* playerController = Cast<APlayerController>(GetController());
// IsValid: UObject ๊ฐ์ฒด๊ฐ ์ ๋๋ก ๋ ๊ฐ์ฒด์ธ์ง ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํํด์ฃผ๋ ํจ์.
if (IsValid(playerController))
{
// EnhancedInputSystem ๊ฐ์ ธ์ค๊ธฐ
UEnhancedInputLocalPlayerSubsystem* subSystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(playerController->GetLocalPlayer());
// UGameInputData์ CDO๋ฅผ ๊ฐ์ ธ์จ๋ค.
const UGameInputData* inputData = GetDefault<UGameInputData>();
// ์ ์ค๊ณผ ๊ฐ์ ๋์์ ํ๋ ์ฝ๋.
// ๋ชจ๋ UClass ์ ๋ณด๋ CDO๋ฅผ ๊ฐ๊ณ ์์ผ๋ฏ๋ก, StaticCLass๋ฅผ ํตํด UClass ์ ๋ณด๋ฅผ ๊ฐ์ ธ์จ ๋ค, GEtDefaultObject๋ก CDO๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
//const UGameInputData* inputData = Cast<UGameInputData>(UGameInputData::StaticClass()->GetDefaultObject());
// ์์์ ์ป์ด์จ subsystem์ ์ฌ์ฉํ mapping context๋ฅผ ๋ฑ๋กํ๋ค. (์ฐ์ ์์ 0์ผ๋ก ์ค์ )
subSystem->AddMappingContext(inputData->mContext, 0);
}
}
// Called every frame
void APlayerCharacter::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
// Called to bind functionality to input
void APlayerCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
// ํ๋ ์ด์ด ์ปจํธ๋กค๋ฌ์์ ์ด ํจ์๋ฅผ ํธ์ถํด์ฃผ๊ณ ์๋ค.
// PlayerInputComponent๋ ํ๋ ์ด์ด ์ปจํธ๋กค๋ฌ๊ฐ ๊ฐ์ง๊ณ ์๋ ์
๋ ฅ์ ๋ฐ๊ธฐ ์ํ ์ปดํฌ๋ํธ์ด๋ค.
// ์ด ์ปดํฌ๋ํธ๋ฅผ UEnhancedInputCOmponent๋ก ํ๋ณํํ์ฌ ์ฌ์ฉํ๋ค.
UEnhancedInputComponent* input = Cast<UEnhancedInputComponent>(PlayerInputComponent);
if (IsValid(input))
{
const UGameInputData* inputData = GetDefault<UGameInputData>();
// BindAction ํจ์๋, ์
๋ ฅ ์ก์
์์ ์ฌ์ฉ๋๋ ํค๊ฐ ์
๋ ฅ๋์์ ๋ ํธ์ถ๋ ํจ์๋ฅผ ์ง์ ํ๋ค.
input->BindAction(inputData->mMove, ETriggerEvent::Triggered, this, &APlayerCharacter::MoveKey);
}
}
void APlayerCharacter::MoveKey(const FInputActionValue& value)
{
// Input Action์์ Vector๋ก ๋ฐ์์ค๊ธฐ๋ก ํ์ผ๋๊น... FVector
FVector axis = value.Get<FVector>();
// dCharacterMovementComponent๋ฅผ ์ฌ์ฉํด์, ์ด ๋ฐฉํฅ์ผ๋ก ์ด๋ํ๊ฒ๋ ๋ง๋ค์ด์ค.
FVector direction = FVector::Zero();
// GetActorForwardVector : ์บ๋ฆญํฐ์ ์ ๋ฐฉ๋ฐฉํฅ ๋ฒกํฐ ๊ฐ์ ธ์ค๋ ํจ์.
direction = GetActorForwardVector() * axis.X; // ์
๋ ฅ ํค์ ๋ฐ๋ผ ๋ค๋ก ๊ฐ๋์ง, ์ผ์ชฝ์ผ๋ก ๊ฐ๋์ง ํ์ธ.
// -1์ด๋ฉด ์ผ์ชฝ๋ฐฉํฅ, 1์ด๋ฉด ์ค๋ฅธ์ชฝ ๋ฐฉํฅ.
direction += GetActorRightVector() * axis.Y;
direction.Normalize();
AddMovementInput(direction);
}
์๋ํฐ์์ ํด๋์ค ์ค๋ธ์ ํธ ๋ฐฐ์นํ๋ ์๊ฐ ๊ทธ ๊ฐ์ฒด์ ์์ฑ์๋ ์ด๋ฏธ ํธ์ถ๋จ. ๊ทธ๋ฐ๋ฐ ์ด ์ํ์์ ์์ฑ์ ์ฝ๋๋ฅผ ๋ฐ๊พธ๋ฉด, ๋ฐฐ์น๋ ์ ๋ ๋ฐ๊พผ ์์ฑ์์ฝ๋์ ์ํฅ์ ๋ฐ์ง ์์โฆ ์๋ก ๋ฐฐ์นํ๋ฉด ์๋ ๋ฐ๋. ๊ทธ๋์ BeginPlay๊ฐ ์๋ ๊ฒ์.
// โโ-
0529
์๋ํฐ๋ธ ์ ๋๋ฉ์ด์ ๋จ๋ ์ผ๋ก ์ ๋๋ฉ์ด์ ์ฌ์์ด ์๋ฑํ๊ฒ ๋์ด. ์๋ํฐ๋ธ๋ ๋์์ ํ๋ฉด์ ์ถ๊ฐ์ ์ผ๋ก ์ฌ์ํ ์ ์๋ ์ ๋๋ฉ์ด์ ์ด๊ธฐ ๋๋ฌธ์. ๋์ด๋ค ๋ฃ์ด๋ณด๋ฉด ์ด๋ก์์ผ๋ก ๋ํ๋จ. ์ผ๋ฐ ์ ๋๋ฉ์ด์ ์ ๊ฐ์.
State Alias ๋ก์ฝ๋ชจ์ ๋ง๋ค ๋ ํ์ฉํ๋ ๊ฒ AO ์์์คํ์ ? ๋ง๋ค ๋ ์. ์นด๋ฉ๋ผ๋ฅผ ์์ผ๋ก ๋๋ฆฌ๋ฉด, ์บ๋ฆญํฐ๋ฅผ ๊ณ ๊ฐ๋ฅผ ํ์ ์ํฌ ๋. โ์ฐธ์กฐ ๊ธฐ๋ฅโ์ ๋ง๋๋ ๊ฒ. ์ด๋ผ๊ณ ํจ.
NativeInitializeAnimation : ์ด๊ธฐํ ๋จ๊ณ. NativeBeginPlay : ํ๋ ์ด ์์ํ ๋ ๋ค์ด์ด. virtual void NativeUpdateAnimation(float DeltaSeconds);
// โ
์ ํ ์ต๊ณ ์ ์ ๋๋ฌํ์ ๋ ํธ์ถ๋๋ ์ด๋ฒคํธ ํจ์๊ฐ ์์. ๊ทธ๊ฑธ ์ด์ฉํด์ ๋๋ฌํ๋ฉด ๊ณง ๋จ์ด์ง๊ฒ ๋๋๊น ๋จ์ด์ง ์ํ๋ก ๋ฐ๊พธ๋๋ก ํจ.
/./ โ
์ ๋ ๋ ธํฐํ์ด๋ ํจ์ ๋ง๋๋ ๋ฐฉ๋ฒ์ด ๋ฐ๋ก ์์. AnimNotify_(๋ ธํฐํ์ด์ด๋ฆ) ๋ฆฌํ๋ ์ ๋๋๋ก UFUNCTION ๋ถ์ฌ์ฃผ๊ณ .
// โ
์์์คํ์ ์นด๋ฉ๋ผ๋ฅผ ํ์ ํ๋ฉด ๊ทธ ํ์ ๋งํผ ์บ๋ฆญํฐ ๋จธ๋ฆฌ๋ ์์ฒด ๋๋ฆฌ๋ ๊ฒ.
// โ
ํค๋ฉ๋ผ springARm ์ธํ์ก์ ๋ง๋ค์ด์, ๋ง์ฐ์ค ์์ง์์ผ๋ก ์คํ๋ง์ ํ์ ์ํค๊ณ . targetArmLength ๊ฐ์ ์์ ํ์ฌ ์นด๋ฉ๋ผ ์ค ๊ตฌํ ๊ฐ๋ฅ.
// โ
์ ๋๋ฉ์ด์ ๋ชฝํ์ฃผ ๊ธฐ์กด ์ ๋๋ฉ์ด์ ๊ฐ๋ค๊ฐ ์ฌ์์์ผ ์ฃผ๋ ๊ฑด ๋ง์ฐฌ๊ฐ์ง์ธ๋ฐ, ์ข ๋ค๋ฅธ ์ ์ ์น์ ์ A, B, C ์ฌ์ด๋ง๋ค ์์ฑํด์ ๋ฃ์ด์ค ์ ์์ ๊ทธ๋์ ์ด ์น์ ์ ์ฌ์์ํจ๋คโฆ?
์ฌ๋ฌ๊ฐ๋ฅผ ๋ฃ์ด๋๊ณ , ์ฌ๋ฌ ๋ชจ์ ์ ๊ด๋ฆฌํ๋ฉด์ ์ํ๋ ๋ชจ์ ์ ์ฌ์์ํค๋ ์์คํ . ์ฝ๋์ปจํธ๋กค ํด์ผ ํ๋ ์์ ์ด๋ผ, ๋ธ๋ฃจํ๋ฆฐํธ ๋ฐฐ์น์๋จ.
๋ชฝํ์ฃผ์ ์ฅ์ .
๋ชฝํ์ฃผ ์ฐฝ ์ด์ด์, Anim Slot Manager ์ฐฝ ์ด์ด์ฃผ์โฆ
DefaultSlot ๋ชฝํ์ฃผ ์ ๋๊ฐ ๋ค์ด์ค๋ฉด ๋ชฝํ์ฃผ ์ฌ์ ์๋๋ฉด ๊ทธ๋ฅ ์ฌ์.
// โ OnMontageEnded
AnimMontage์ ๋ธ๋ฆฌ๊ฒ์ดํธ๋ฅผ ์ถ๊ฐํ ์ ์์. DYNAMIC ํค์๋๊ฐ ๋ถ์ด์๋๋- ์๋๋๋, -> ์ด๊ฒ ๋ถ์ด์ผ ๋ธ๋ฃจํ๋ฆฐํธ์ ํด๋น ๋ณ์๋ฅผ ์ด๋ฒคํธ๋ก ์คํํด์, ๋ธ๋ฃจํ๋ฆฐํธ์ ํจ์๋ฅผ ์ง์ ํด์ ์ธ ์ ์์. MULTICAST ํค์๋๊ฐ ๋ถ์๋-์๋ถ์๋ ์ฐจ์ด๊ฐ ์์. -> ํจ์ ์ฌ๋ฌ๊ฐ๋ฅผ ๋ฑ๋กํ๊ณ ํธ์ถํ ์ ์์. ์๋ถ์ด์์ผ๋ฉด ํจ์ ํ๋๋ง ์ง์ ๊ฐ๋ฅ.
๋ ์ด์ด๋ ์ ๋๋ฉ์ด์ (Layered blend per bone) ๋ด๊ฐ ์ํ๋ ํน์ ๋ณธ์ผ๋ก ์ ๋๋ฉ์ด์ ์ ๋ถ๋ฆฌ์์ผ์ ์ฌ์์์ผ์ค, ์์ฒด์ ๊ณต๊ฒฉ๋ชจ์ , ํ์ฒด์ ๋ฌ๋ฆฌ๋ ๋ชจ์ ์ ์ ์ฉํ๋ค๋ฉด ๋ฌ๋ ค๊ฐ๋ฉด์ ๊ณต๊ฒฉํ๋ ๋ชจ์ ์ด ๋์ฌ ๊ฒ. Blend Depth : ์ด๋๊น์ง ๋ธ๋ ๋ ํ ๊ฑด์ง. 1์ ๋ฃ์ผ๋ฉด, Bone NAme์ ํ์1์ฐจ๊น์ง๋ง ๋ธ๋ ๋ ๋จ. -1์ ๋ฃ์ผ๋ฉด ํ์ ๋ชจ๋.
ik : ์ญ๋ฐฉํฅ ์ด๋. ์๋ฐ๋ฅ์ ์ฑ ์์ ๋๊ณ ๋ฐ๋ฉด, ์๋ฐ๋ฅ์ ํด์ง๋ฉฐ ๋ด๋ ค๊ฐ์ง๋ง, ์ด๊นจ ๊ฐ์ ๋ถ๋ถ์ ์ฌ๋ผ๊ฐ. ์ด๋ฐ ์ญ์ด๋. fk : ์ ๋ฐฉํฅ ์ด๋.
// โโโ
5/30
๊ณต์ฉ ์ ๋๋ฉ์ด์ ๋ฐ์ดํฐ ๋ง๋ค์ด์ ์ฌ์ฉํ๊ธฐ,.
Data Table <- ์์ ์ด๋ ์ฐ๋๋๋ ์์ . ๋ฐ์ดํฐํ ์ด๋ธ ๋ง๋ค ๋ ์ ์ฉ ๊ตฌ์กฐ์ฒด๊ฐ ํ์ํจ.
์ ๋์ธ์คํด์ค ๋ธ๋ฃจํ๋ฆฐํธ๋ฅผ ๋ง๋ค ๋ ํ ํ๋ฆฟ์ผ๋ก ๋ง๋ค๋๊ฐ link ๋ก ๋ง๋ค๋๊ฐ. (Linked Animation)
์ ๋๋ฉ์ด์ ๋ ์ด์ด๋ ์ด์ฉํด์, ๋ ์ด์ด ์์ ์ ๋ง๋ค์ด์ ์ง์ด๋ฃ์ ์ ์์,
ํ์ฅ์ฑ์ด ์ ค ๋์ ๊ฑด Linked Anim Graph.
ํ ํ๋ฆฟ์ ๋ฏธ๋ฆฌ ๋ชจ๋ ์์๋ฅผ ๋ง๋ค์ด๋์ผ. ๊ทธ๊ฑธ ์ด์ฉํ ์ ์์ด์ ํ์ฅ์ฑ์ด ์กฐ๊ธ ์์ฌ์ ๊ทธ์น๋ง Link๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋์๋ ๋์ด์ฌ ์ ์์ด์ ์ข์. ๊ทธ๋ฌ๋๊น linked anim graph ์ฐ๋๊ฒ ๋ซ๊ธด ํจ.
GENERATED_BODY ๋ฅผ ์ฐ๋ฉด ์ธ๋ฆฌ์ผ ํค๋ํด์ ์ด ์ฝ๋๋ฅผ ๋ถ์ํด์ ์ด๊ฒ ๋ค์ด์๋ ํค๋์ ๋ด์ฉ๋ค์ ํ์ธํ๊ณ , ํค๋์ด๋ฆ.generated.h <- ์ด๊ฑฐ ๋ง๋ฆ. #include โGameInfo.generated.hโ <- ๊ทธ๋์ ์ง์ ํฌํจ์ํค๊ธฐ ์ํด ์ด๊ฑฐ ์์ฑํด์ค์ผ ํจ.
// โ
ํ ํ๋ฆฟ์ผ๋ก ๋ง๋ค๋ฉด,,, ๋ชฝํ์ฃผ ์ฌ์ฉํ ๋ ๋ชฝํ์ฃผ์ ์ฌ๋กฏ์ ๊ทธ๋ฃน ์ง์ ์ด ์ ๋จ;;; ๋ฌด์กฐ๊ฑด Default๊ทธ๋ฃน ๋ฐ์ ์ฌ์ฉ ๋ชป ํจ ใ ์ด๊ฒ ๋ฌธ์ ์โฆโฆ
postinitproperties ๋ณ์ ์์ฑ ๋ง๋ฌด๋ฆฌ ์ง๊ณ ๋ค์ด์ค๊ฒ ๋จ. beginplay๋ณด๋ค ๋นจ๋ฆฌ ๋ค์ด์ค๊ฒ ๋จ.
FName์ IsNone ์ด๋ฆ์ด ์์ผ๋ฉด true ์ด๋ฆ์ด ์์ผ๋ฉด false ๋ฐํ
// โ
0604 ์์์ผ
SetCollisionEnabled ์ค์ ํ ๋,
PhysicsOnly ๋ฌผ๋ฆฌ ์๋ฎฌ๋ ์ด์ . ๋ฌผ๋ฆฌ์ชฝ๋ง ์ฒ๋ฆฌํ๊ฒ ๋ค-
Query ๋ ธํฐํ์ด์ฒ๋ผ, ์ถฉ๋ ์์ ์ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์์ผ์ค ๋ ์ฌ์ฉํจ. ๋ฌผ๋ฆฌํจ๊ณผ ํ์์๊ณ , ํจ์๋ง ํธ์ถํ๊ณ ์ํ๋ฉด ์ด๊ฑฐ.
๋ ๋ค ํ์ํ๋ฉด QueryAndPhysics.
Probe๋ ์นด๋ฉ๋ผ ์ชฝ์ ์ฃผ๋ก ์ฌ์ฉํจ. ์นด๋ฉ๋ผ์ ํ๋ ์ด์ด ์ฌ์ด์ ๋ค๋ฅธ ๋ฌผ์ฒด๊ฐ ์๋ค๋ฉด ์ด ์ถฉ๋์ ์ด์ฉํด ์ด ๋ฌผ์ฒด์ ์์ผ๋ก ์ด๋ํจ. ์๋ก CameraFog.
// โ WeaponOverlap ์ถฉ๋ ์ฒ๋ฆฌ ํจ์์์ (๋ด๊ฐ ๋ง๋ ํด๋์ค) FHitResult ํด๋์ค๋ฅด ๋ค์ด๊ฐ๋ณด๋ฉด,
ImpactPoint : ๋ถ๋ชํ ์์น ๋ฐํ. ๊ทธ๋ฐ๋ฐ, Overlap์ HitResult๊ฐ ์๋ง๋ค์ด์งโฆ!
bool bFromSweep ์์ true์ฌ์ผ๋ง FResult๊ฐ ๋ง๋ค์ด์ง. (๊ทธ๋์ FHitResult์ ์ธ์ ์ด๋ฆ๋ SweepResult์ธ ๊ฒ..)
์ด๋ด ๊ฒฝ์ฐ Hit ํจ์๋ฅผ ์ปค์คํ ์ผ๋ก ๋ง๋ค์ด์ฃผ๊ณ (์ถฉ๋์ปดํฌ๋ํธ->OnComponentHit ํจ์ ์ค๋ฒ๋ผ์ด๋ ํด์) AddDynamic์ผ๋ก ์ถ๊ฐํด์ค. SetNOrifyRigidBOdyCollision์ true๋ก ํด์ผ ํจ.
OnComponentOverlap ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด, ImpactPoint๋ฅผ ์ฌ์ฉํ๋ฉด ์ ๋๋ก ์ขํ๊ฐ ์๋์ด. ๋ฌด์กฐ๊ฑด OnComponentHit๋ฅผ ์จ์ผ ํจ.
// โ
Single, Multi์ ์ฐจ์ด๋. Single์ ์ถฉ๋๋๋ ๊ฐ์ฅ ์ฒซ๋ฒ์งธ ๊ฒ.
FCollisionQueryParams ์ถฉ๋์ ์งํํ๋ฉด์ ์ด๋ค ๋์ด๋ ์ด๋ค ์์ผ๋ก ์ถฉ๋ํ ๊ฑด์ง, ๋ณตํฉ ์ถฉ๋ ํ ๊ฑด์ง, ์๊ธฐ ์์ ์ ์ถฉ๋ํ ๊ฑด์ง, ํ์์๋ ์ ๋ ingnore๋ชฉ๋ก์ ์ง์ ํด์ค ์ ์๋ ๋ฑ ์ญํ ํจ.
// โ DrawDebugBox ๋๋ฒ๊น ์ฉ ๋ ๋๋ง ๊ธฐ๋ฅ.
// โ
ํ๋ฒ ์ฌ์์ํค๊ณ ๋ง ํํฐํด์ด๋ผ๋ฉด, UGamePlayStatics์์ ์ง์ํด ์ค. ์ ํด๋์ค์ SpawnEmitterAtLocation ํจ์๋ฅผ ์ฌ์ฉ. (์ฌ์ด๋ ๊ฐ์ ๊ฒฝ์ฐ์๋ ์ด๋ฐ Spawn์ ์ง์ํ์ฌ , ํ๋ฒ ์ฌ์์ํค๊ณ ๋ง๋ ๊ธฐ๋ฅ์ ์ง์ํด ์ค.)
๊ทธ ์ธ ํํฐํด ์์คํ cascade ํํฐํด, : ํํฐํด์์คํ ์ปดํฌ๋ํธ๋ฅผ ์ด์ฉํด ํํฐํด์ ์ถ๊ฐํด์, ์ฌ์์ํด. ๋์ด์๊ฐ๋ผ ํํฐํด : ๋์ด์๊ฐ๋ผ ์ปดํฌ๋ํธ๋ฅผ ์ด์ฉํด ์ฌ์
(* ImpactNormal : ์ถฉ๋ํ์ ๋, ์ถฉ๋๋์ด ํ๊ธฐ๋ ๋ฐฉํฅ์ ๋ฒกํฐ๋ฅผ ๋ฐํํด์ฃผ๋ ๋ฉค๋ฒ.) ๊ณต๊ฒฉ ์ ํํฐํด ์ฌ์ํ ๋ ์ด๊ฑฐ๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ์์ฐ์ค๋ฌ์ด ์ดํํธ ์ฌ์ ๊ฐ๋ฅ.
/ โ
TakeDamage ์ฌ์ฉํ ๋, FPointDamageEvent ๋ผ๋ ํ์ ์ฌ์ฉํ ์ ์์. Engine/DamageEvents.h ๋ผ๋ ํค๋ ํฌํจํด์ผ ํจ.
๋๊ธ๋จ๊ธฐ๊ธฐ