Camera System - osy9611/ProjectPT GitHub Wiki
๋ผ์ด๋ผ์ ์นด๋ฉ๋ผ ์์คํ ์ ๋ํ ๋ถ์์ ํ ํ ProjectPT์ ์ ์ฉ์ ํ๋ค. ์ฒ์์๋ SpringArm์ผ๋ก ๊ตฌํ์ ์งํํ์ผ๋ ๋ค์ํ ์นด๋ฉ๋ผ ๋ชจ๋๋ฅผ ์ค์ ํ๊ณ ์ถ์ด์ ๋ถ์์ ์งํํ์

- ๊ธฐ๋ณธ์ ์ธ ์นด๋ฉ๋ผ๋ฅผ ๋ถ๋๋ฝ๊ฒ ๋ฐ๋ผ๊ฐ๊ฑฐ๋ ์ฅ์ ๋ฌผ ์ถฉ๋์ ์ฒ๋ฆฌํ๋๋ฐ ์ ์ฉํ ๊ธฐ๋ฅ
- ์ฃผ์ ์ฅ์
- ์นด๋ฉ๋ผ์ ํ๊ฒฝ ๊ฐ์ ์ถฉ๋์ ์๋์ผ๋ก ์ฒ๋ฆฌํจ
- ์บ๋ฆญํฐ ์์น๋ฅผ ์ค์ฌ์ผ๋ก ๊ตฌํ ๊ถค๋ ๊ตฌํ์ด ํธํจ
๋ผ์ด๋ผ๋ Spring Arm์ ์ฌ์ฉํ์ง ์๊ณ ์์ฒด์ ์ธ ์์คํ ์ ๊ตฌํํจ
- Spring Arm์ ํ๊ณ์
- ํน์ ๊ฒ์ ํ๋ ์ด ์ํฉ์์๋ ์ธ๋ถ์ ์ธ ์ ์ด๊ฐ ํ์ํจ ex) 1์ธ์นญ/ 3์ธ์นญ ํผํฉ ๊ฒ์์์๋ ๋์ ์ผ๋ก ์นด๋ฉ๋ผ๋ฅผ ์ ํํด์ผํ ๋
- ๋ค์ํ ๊ฒ์ ๋ชจ๋๊ฐ ์๋ค๋ฉด SpringArm์ ๊ฐ๊ฐ ๊ตฌํํ๊ฑฐ๋ SpringArm์ ์ฌ๋ฌ๊ฐ ์ค์นํ๋ ๋ฐฉํฅ์ผ๋ก ๊ฐ๋ฐ์ ํด์ผํ๋๋ฐ ๊ฒ์์ ๊ฐ๋ฐํ ๋ ์๋นํ ๊น๋ค๋ก์ด ๋ฌธ์ ์ด๋ค.
- ์ ์ฒด์ ์ธ ๋ก์ง
- CameraMode
- ์นด๋ฉ๋ผ์ ๋์์ ๊ด๋ฆฌํ๋ฉฐ, ์นด๋ฉ๋ผ ๋ทฐ, ๋ธ๋๋ฉ ๋ฐ ํ๊ฒ ์ํฐ์์ ์ํธ์์ฉ์ ๋ค๋ฃธ
- UpdateCameraMode
- ๋งค ํ๋ ์๋ง๋ค ์นด๋ฉ๋ผ ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๋ค.(UpdateView, UpdateBlending ๋งค์๋๋ฅผ ํตํด ์ฒ๋ฆฌํจ)
- UpdateView
- ์นด๋ฉ๋ผ์ ์์น, ํ์ ๋ฐ FOV๋ฅผ ์ ๋ฐ์ดํธํ๋ค.
- UpdateBlending
- ์นด๋ฉ๋ผ ์ ํ ์ ๋ธ๋๋ฉ ํจ๊ณผ๋ฅผ ์ฒ๋ฆฌํ๋ค.
- CameraModeStack
- ์นด๋ฉ๋ผ ๋ชจ๋๋ฅผ ์คํ์ผ๋ก ๊ด๋ฆฌํ๊ณ , ๊ฐ ๋ชจ๋์ ๋ธ๋๋ฉ์ ์ฒ๋ฆฌํ๋ ์ญํ ์ ๋ด๋น
- PushCameraMode
- ์๋ก์ด ์นด๋ฉ๋ผ ๋ชจ๋๋ฅผ ์คํ์ ์ถ๊ฐํ๋ค.
- BlendWeight๋ฅผ ๊ณ์ฐํ์ฌ ์นด๋ฉ๋ผ ๋ชจ๋ ๊ฐ ๋ธ๋๋ฉ์ ์ค์
- EvaluateStack
- ์คํ์ ์๋ ๋ชจ๋ ์นด๋ฉ๋ผ ๋ชจ๋๋ฅผ ์ ๋ฐ์ดํธํ๊ณ , ๋ธ๋๋ฉ์ ํตํด ์ต์ข ๋ทฐ๋ฅผ ๊ณ์ฐ
- UpdateStack
- ์คํ์ ๋ชจ๋ ์นด๋ฉ๋ผ ๋ชจ๋๋ฅผ ์ ๋ฐ์ดํธ
- BlendWeight๊ฐ 1.0์ด ๋๋ฉด ์คํ์์ ์ ๊ฑฐ
- CameraComponent
- ๊ณ์ฐ๋ ์ต์ข CameraView๋ฅผ ์ ์ฉ
- CameraMode
-
ProjectPT๋ ๋ค์ํ ์นด๋ฉ๋ผ ๋ชจ๋๋ฅผ ์ฌ์ฉํ ์ ์๋ LyraCamera ์์คํ ์ ์ ์ฉํ๋ค.
-
ThirdPerson
-
Blueprint๋ฅผ ์์ฑํด์ CameraMode๋ฅผ ์์ฑํด์ ๊ฐ๊ฐ์ ์นด๋ฉ๋ผ ์ค์ ์ ์งํํ๋๋ก ํ๋ค.

-
๋ฒฝ์ ๋ถ์ด์์ผ๋ฉด ์นด๋ฉ๋ผ Offset์ ์กฐ์ ํ๋ ๋ก์ง ์ถ๊ฐ
void UPTCameraMode_ThirdPerson::UpdatePreventPentration(float DeltaTime) { FVector PivotLocation = GetPivotLocation(); FVector DesiredCameraPosition = View.Location; FVector Direction = DesiredCameraPosition - PivotLocation; FHitResult HitResult; FCollisionQueryParams QueryParams; QueryParams.AddIgnoredActor(GetTargetActor()); float DistBlockedPct = 1.0f; bool bHit = GetWorld()->SweepSingleByChannel( HitResult, PivotLocation, DesiredCameraPosition, FQuat::Identity, ECC_Camera, FCollisionShape::MakeSphere(CameraCollisionRadius), QueryParams ); if (bHit) { FVector AdjustedLocation = HitResult.Location - Direction.GetSafeNormal(); View.Location = AdjustedLocation; } }
-
-
HeroComponent์์ CameraMode๋ฅผ ๋ฑ๋กํ ์ ์๋๋ก ๊ตฌํ์งํ
-
HeroComponent์๋ ๊ธฐ๋ณธ CameraMode์ GAS์ ์ฌ์ฉ๋๋ CameraMode๋ฅผ ์ ์ฅํด ์นด๋ฉ๋ผ ๋ชจ๋๋ฅผ ๋ฑ๋ก
-
์ฃผ์์ฝ๋
TSubclassOf<UPTCameraMode> UPTHeroComponent::DetermineCameraMode() const { if (AbilityCameraMode) return AbilityCameraMode; const APawn* Pawn = GetPawn<APawn>(); if (!Pawn) return nullptr; if (UPTPawnExtensionComponent* PawnExtComp = UPTPawnExtensionComponent::FindPawnExtensionComponent(Pawn)) { if (const UPTPawnData* PawnData = PawnExtComp->GetPawnData<UPTPawnData>()) { return PawnData->DefaultCameraMode; } } return TSubclassOf<UPTCameraMode>(); }
-
GA_FireZoom์์๋ ์ด๋น๋ฆฌํฐ๊ฐ ์์๋๋ฉด ํด๋น ๋ชจ๋๋ฅผ ์ ํํ๋๋ก ์์ ํจ

-