Publish:

์–ธ๋ฆฌ์–ผ์—์„œ 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 ์ •๋ณด๋ฅผ ๋งŒ๋“ค์–ด๋†“์Œ. ์ด๊ฑธ ๋ณต์ œํ•ด์„œ ๊ฐ์ฒด ์ƒ์„ฑ์ด ์ด๋ฃจ์–ด์ง.

// โ€”โ€”โ€“

์–ธ๋ฆฌ์–ผ ์ขŒํ‘œ
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 ๋ผ๋Š” ํ—ค๋” ํฌํ•จํ•ด์•ผ ํ•จ.


์ด์Šˆ ๋ฐ ๊ณต๋ถ€ํ•œ ๊ฒƒ์„ ๊ธฐ๋กํ•ด๋‘๋Š” ๊ฐœ์ธ ๋ธ”๋กœ๊ทธ ์ž…๋‹ˆ๋‹ค. ๋Œ“๊ธ€, ํ”ผ๋“œ๋ฐฑ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค ๐Ÿ™‚

์—…๋ฐ์ดํŠธ:

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ