일반 변수의 경우 RootComponent의 Property에 나타난다.
UPROPERTY() 매크로에 넣을 수 있는 옵션들
VisibleAnyWhere : 어디서든 보이지만 편집이 불가능
EditAnywhere : 어디서든 보이고 편집이 가능
VisibleInstanceOnly : 소환된 객체에서만 볼 수 있다.
VisibleDefaultsOnly : BP에서만 볼 수 있다.
EditInstanceOnly : 객체에서만 수정 할 수 있다.
EditDefaultsOnly : BP에서만 수정 할 수 있다.
+
BlueprintReadWrite : 블루프린트로 읽고 씁니다. (Get, Set 노드 생성 가능)
BlueprintReadOnly : 블루프린트 읽기 전용. (Get 노드 생성 가능)
이벤트 그래프에 노출되도록 하는 다른 지정자가 있으며, 이 지정자는 디테일 패널 접근성을 제어하는 지정자와 함께 사용 할 수 있습니다. ( ex) UPROPERTY(VisibleAnyWhere,BlueprintReadWrite) )
컴포넌트 노출
프라이빗 멤버에서 이벤트 그래프 읽기 및 쓰기 액세스를 사용하려면 어떻게 해야 할까요?
meta = (AllowPrivateAccess = "true")를 UPROPERTY인자에 추가해줍니다.
Category를 통해서 변수에 카테고리를 부여할 수 있다.
Category = "Super Duper Variables";
컴포넌트에는 EditAnywhere를 사용하지 않는 것이 좋기 때문에 VisibleAnywhere를 사용하는 것이 좋습니다.
빙의할 폰을 정하지 않으면 기본 폰이 생성된다.
폰을 빙의시키려면 월드 안에서 폰 인스턴스를 선택하고 디테일 패널 안에서 Auto Possess Player 설정을 찾아 보세요
Auto possess player 설정은 기본으로 비활성화돼 있어요, 드롭다운을 클릭하면 플레이어가 0부터 7까지 있습니다.
여러 명이 네트워크상에서 게임하는 상황에서 플레이어 여러명 있는 그런 건 아니고요
게임 하나 안에서 화면이 나뉘어 있고 그 안에서 플레이어 두명이 같은 콘솔이나 컴퓨터에서 게임을 하는 그 차원을 의미합니다.
우리 게임에선 이건 항상 Player 0이 되는 거죠
폰을 빙의 시키기 위해 이 값을 Player 0으로 선택하고 게임이 시작되면 Player 0은 폰에 빙의하게 됩니다.
콜백 함수(callback function)는 프로그래밍에서 흔히 사용되는 개념으로, 한 함수가 다른 함수에 인자로 전달되어, 나중에 특정 사건이 발생했을 때 호출되는 함수를 의미합니다. 콜백 함수는 비동기 프로그래밍, 이벤트 처리, 함수형 프로그래밍 등에서 널리 사용됩니다.
콜백 함수의 기본 개념
- 함수의 인자로 전달: 콜백 함수는 다른 함수의 인자로 전달되며, 이를 '콜백'이라고 부릅니다.
- 이벤트 발생시 호출: 특정 이벤트나 조건이 충족되었을 때, 이 콜백 함수가 호출됩니다. 예를 들어, 사용자의 클릭, 데이터 로딩 완료, 타이머 종료 등의 이벤트가 발생할 때 실행됩니다.
콜백 함수의 사용 예시
- 이벤트 리스너: 사용자 인터페이스에서 버튼 클릭, 키보드 입력 등의 사용자 이벤트에 반응하기 위해 콜백 함수를 사용할 수 있습니다.
- 비동기 프로그래밍: 네트워크 요청, 파일 입출력과 같은 비동기 작업이 완료된 후 실행할 로직을 콜백 함수로 정의할 수 있습니다.
- 고차 함수 (Higher-order Functions): 함수형 프로그래밍에서, 다른 함수를 인자로 받거나 결과로 반환하는 함수를 고차 함수라고 하며, 이때 전달되는 함수가 콜백 함수가 될 수 있습니다.
콜백 함수의 장점과 단점
장점:
- 유연성: 콜백 함수를 사용하면 프로그램의 흐름을 더 유연하게 관리할 수 있습니다.
- 재사용성: 같은 콜백 함수를 다양한 곳에서 재사용할 수 있어, 코드 중복을 줄일 수 있습니다.
단점:
- 콜백 지옥 (Callback Hell): 콜백 함수가 중첩되어 사용될 때, 코드의 가독성과 관리가 어려워질 수 있습니다. 이를 '콜백 지옥'이라고 부릅니다.
- 비동기 흐름 제어의 복잡성: 비동기 프로그래밍에서 콜백 함수의 흐름을 제어하는 것이 복잡할 수 있으며, 이를 해결하기 위해 프로미스(Promises), async/await 등의 개념이 도입되었습니다.
콜백 함수는 프로그래밍에서 중요한 개념으로, 비동기 처리, 이벤트 처리 등 다양한 상황에서 활용됩니다. 그러나 적절하게 관리되지 않으면 코드의 복잡성을 증가시킬 수 있으므로 주의가 필요합니다.
인풋 처리하기(Aixs Mappings)
콜백 함수
// ATank.h
public:
virtual void Setup PlayerInputCompoenent(class UInputComponent* PlayerInputComponent) override;
private:
void Move(float Value);
// ATank.cpp
void ATank::PlayerInputCompoenent(UInputComponenet* PlayerInputComponent)
{
Super::PlayerInputCompoenent(PlayerInputComponent);
PlayerInputComponent->BindAxis(TEXT("MoveForward"), this, &ATank::Move)
}
/*
첫 번째 매개변수에 축 매핑의 이름을 넣어줍니다
두 번째 인자는요 함수를 바인드하는 대상 객체의 포인터입니다, this는 포인터인데요
세 번째 인자는 바인드시키는 함수의 주소입니다. &ATank::Move를 넣어줍니다
이렇게 함수 이름에 클래스 이름을 붙여 주는 것은 중요합니다. 함수 이름 앞에는 주소 연산자를 넣어줘야 하고요
이 내용이 익숙하지 않으신 분들은 함수의 주소를 넣는 거라고 생각하시면 돼요 함수도 변수처럼 주소가 있거든요
주소 연산자를 쓰면 함수에 다른 함수를 전달할 수 있어요, 주소 연산자가 필요한 이유죠
*/
로컬 오프셋
객체를 움직일 때 유의해야 합니다, 언리얼 엔진에는 객체를 이동시키는 함수가 있는데 월드를 위한 것과 로컬을 위한 것이 별도로 있습니다.
언리얼 엔진에서 "로컬 오프셋(Local Offset)"은 주로 3D 모델링 및 게임 개발에서 사용되는 개념입니다. 이는 객체의 위치나 방향을 조정할 때 사용되며, 객체의 로컬 좌표계를 기준으로 이동이나 회전을 적용하는 것을 의미합니다. 로컬 오프셋을 이해하려면 먼저 월드 좌표계(World Coordinates)와 로컬 좌표계(Local Coordinates)의 차이를 이해해야 합니다.
- 월드 좌표계 (World Coordinates):
- 월드 좌표계는 게임 또는 3D 환경 전체에 걸쳐 일관된 기준을 제공합니다. 모든 객체는 이 월드 좌표계 내에서의 위치를 가집니다.
- 예를 들어, 게임 세계의 중심에서 어떤 객체가 특정 거리와 방향에 위치한다면, 그것은 월드 좌표계를 사용하여 표현됩니다.
- 로컬 좌표계 (Local Coordinates):
- 로컬 좌표계는 개별 객체에 특정된 좌표계입니다. 각 객체는 자신만의 로컬 좌표계를 가지며, 이는 객체의 현재 위치와 방향을 기준으로 합니다.
- 예를 들어, 객체가 회전할 때, 그 회전은 객체의 로컬 축을 중심으로 이루어집니다.
로컬 오프셋(Local Offset)의 사용:
- 로컬 오프셋을 사용하면 객체를 그것의 로컬 축에 따라 이동하거나 회전시킬 수 있습니다. 이는 객체가 월드 공간에서 어떤 방향을 향하고 있든 관계없이, 그 객체의 전방, 상방, 우측 등을 기준으로 동작을 적용할 수 있음을 의미합니다.
- 예를 들어, 자동차 게임에서 자동차가 전진하도록 하려면, 자동차의 전방을 향해 로컬 오프셋을 적용하여 이동시키면 됩니다.
언리얼 엔진에서의 적용:
- 언리얼 엔진에서는 로컬 오프셋을 적용하기 위해 다양한 함수와 도구들을 제공합니다. 예를 들어, AddLocalOffset, AddLocalRotation 함수들은 각각 객체를 로컬 축을 따라 이동시키고 회전시키는 데 사용됩니다.
- 이러한 기능을 사용하여 복잡한 애니메이션, 동적인 환경 상호작용, 리얼타임 물리 효과 등을 구현할 수 있습니다.
로컬 오프셋은 게임 내 객체의 움직임을 자연스럽고 직관적으로 만들기 위한 핵심 도구입니다. 언리얼 엔진을 사용하여 게임이나 시뮬레이션을 개발할 때, 이러한 개념을 이해하고 활용하는 것이 중요합니다.
이동 속도
속도 변수를 만들어서 속도를 제어할 건데요
게임의 프레임 속도도 고려합니다, 프레임마다 프레임 속도가 달라서 이동이 일정하지 않아요
그래서 프레임 속도를 고려하기 위해 델타 타임이란 걸 다룰 거예요
DeltaLocation.X = Value * DeltaTime * Speed;
bSweep
bSweep은 언리얼 엔진에서 사용되는 중요한 개념으로, 주로 이동 함수들에서 충돌 검출을 위해 사용됩니다. 이 매개변수가 활성화되면, 객체가 이동할 때 경로 상에 있는 다른 객체들과의 충돌을 감지합니다. bSweep의 사용은 충돌 처리, 물리적 상호작용, 게임 내 환경의 실시간 반응성을 보장하는 데 중요한 역할을 합니다.
bSweep의 기본 개념
- 충돌 검출: bSweep 매개변수가 true로 설정되면, 이동 함수는 해당 객체가 이동 경로 상에 있는 다른 객체들과 충돌하는지 검사합니다. 이는 객체가 벽이나 다른 장애물에 부딪힐 때 정확한 반응을 보장하는 데 필요합니다.
- 정밀한 물리 처리: bSweep를 사용하면, 물리 엔진은 객체가 다른 객체에 부딪히는 정확한 시점과 위치를 계산할 수 있습니다. 이는 객체 간의 정밀한 상호작용과 현실적인 물리 효과를 구현하는 데 중요합니다.
언리얼 엔진에서의 bSweep 활용
언리얼 엔진에서 bSweep는 주로 MoveComponent, SetActorLocation, AddActorWorldOffset 등과 같은 이동 관련 함수에서 사용됩니다. 이러한 함수들은 일반적으로 다음과 같은 매개변수를 가집니다:
- 이동 위치 또는 벡터: 객체를 이동시킬 위치나 방향.
- 회전: 객체의 새로운 회전값.
- bSweep: 충돌 검출을 활성화할지 여부를 결정하는 불리언 값.
예를 들어, 플레이어 캐릭터가 벽을 통과하지 않고, 벽에 부딪혔을 때 멈추거나 반응해야 하는 상황에서 bSweep을 true로 설정하면, 이동 함수는 충돌을 감지하고 해당 충돌에 기반하여 적절한 반응을 처리할 수 있습니다.
게임 개발에서의 중요성
- 충돌 회피: bSweep을 사용하면, 객체가 예상치 못한 위치로 이동하는 것을 방지하고, 물리적으로 불가능한 상호작용을 피할 수 있습니다.
- 리얼리즘: 충돌 감지는 게임 내에서 더 현실적이고 믿을 수 있는 물리적 상호작용을 만드는 데 필수적입니다.
- 게임 플레이: 정확한 충돌 처리는 게임 플레이의 품질을 향상시키며, 플레이어의 몰입감과 경험을 높이는 데 기여합니다.
이처럼 bSweep은 게임 개발 과정에서 객체들의 이동과 상호작용을 정밀하게 제어하는 데 매우 중요한 역할을 합니다.
Take Rotation
float 하나를 이용하는 FRotator 사용자를 사용하면 모든 컴포넌트가 이 float 값으로 초기화됩니다.
짐벌 락(Gimbal Lock)
"짐벌 락(Gimbal Lock)"은 3D 그래픽스와 애니메이션에서 발생할 수 있는 문제로, 주로 오일러 각(Euler Angles)을 사용하여 회전을 표현할 때 발생합니다. 이 문제는 한 축의 회전이 다른 축의 회전과 중첩되어 독립적인 회전 제어가 불가능해지는 상황을 말합니다.
짐벌 락의 원인과 개념 이해
- 오일러 각과 3축 회전: 오일러 각은 3D 공간에서 객체의 방향을 표현하기 위해 세 축(X, Y, Z)을 따라 이루어지는 회전을 사용합니다. 각 축은 서로 독립적으로 회전할 수 있어야 합니다.
- 짐벌 락 상황: 짐벌 락은 두 회전 축이 평행하게 될 때 발생합니다. 이 경우, 두 축이 하나로 합쳐져 버리고, 결과적으로 하나의 회전 축이 손실되어, 원래 세 개의 독립적인 회전 축 중 하나를 사용할 수 없게 됩니다.
- 예시: 가장 흔한 예는 '피치(Pitch)' 각이 90도일 때 발생합니다. 이 경우, '롤(Roll)'과 '요(Yaw)' 각이 중첩되어, 두 축 중 하나가 사라지는 것처럼 보이게 됩니다.
짐벌 락의 문제점
- 회전 제한: 짐벌 락이 발생하면, 3D 공간에서의 객체 회전이 제한되어, 원하는 방향으로 자유롭게 회전시키는 것이 불가능해집니다.
- 애니메이션 문제: 3D 모델링 및 애니메이션에서는 짐벌 락으로 인해 예상치 못한 회전 동작이 발생할 수 있으며, 이는 애니메이션의 질을 저하시킬 수 있습니다.
해결 방법
- 쿼터니언 사용: 짐벌 락 문제를 해결하기 위해, 많은 3D 애플리케이션과 게임 엔진은 오일러 각 대신 '쿼터니언(Quaternions)'을 사용합니다. 쿼터니언은 4차원 복소수를 사용하여 회전을 표현하며, 짐벌 락 문제를 피할 수 있습니다.
- 축 제한: 특정 축의 회전 범위를 제한함으로써 짐벌 락의 위험을 줄일 수도 있습니다.
짐벌 락은 3D 그래픽과 애니메이션 분야에서 중요한 이슈이며, 적절한 기술과 방법을 사용하여 이 문제를 피하는 것이 중요합니다.
마우스 커서와 컨트롤러 그리고 Cast<>
커서를 기반으로 조종하는 컨트롤러 함수가 있습니다.
커서를 움직이면 컨트롤러의 함수로 커서 위치에 맞는 위치를 얻을 수 있죠
카메라에서 커서 방향으로 직선을 그리고, 월드의 오브젝트와 부딪히면 이 위치를 알 수 있고 위치를 이용해 탱크 포탑 회전을 설정할 수 있습니다
BeginPlay에서 컨트롤러에 액세스해야 합니다
생성자에서 액세스하기엔 아직 이른데요, 유효한 컨트롤러가 아직 없을 거예요
그래서 Tank 클래스의 BeginPlay 함수가 필요합니다
// Tank.h
APlayerController* PlayerControllerRef;
// Tank.cpp
// Acontroller 포인터 타입의 값이 APlayerController 타입의 엔터티에 할당될 수 없다고 하네요
PlayerControllerRef = GetController();
GetController 함수는 AController의 주소를 반환합니다
AController 포인터에 저장할 수는 있지만 APlayerController 포인터에는 저장할 수 없죠
재미있는 건, 사실 GetController로 반환된 오브젝트가 APlayerController라는 거예요
AController 포인터 형태의 주소가 있고 여기에 APlayerController가 저장되지만
AController 형태로 있다면 필요한 함수에 액세스할 수 없습니다
함수가 APlayerController에 있기 때문이죠
이 함수가 GetHitResultUnderCursor입니다
AController 포인터 타입의 값이 있고 APlayerController 내에 있는
함수를 가져오려고 한다면 실패하게 됩니다. 컴파일 오류가 발생해요
답은 Cast입니다
// Tank.cpp
PlayerControllerRef = Cast<APlayerController>(GetController());
히트 이벤트
Unreal Engine에서의 "히트 이벤트", "라인 트레이스", "트레이스 히트"와 관련된 개념들은 게임 물리학과 충돌 검출에 중요한 요소입니다. 이들은 각각 다음과 같은 방식으로 작동합니다:
- 히트 이벤트 (Hit Event):
- 이것은 게임 환경 내에서 그려진 선과 오브젝트 표면이 부딪혔을 때 발생하는 이벤트입니다.
- 히트 이벤트는 객체의 충돌이 발생했음을 나타내며, 이를 통해 플레이어나 다른 객체에 영향을 미칠 수 있는 상호작용을 발생시킬 수 있습니다.
- 라인 트레이스 (Line Trace):
- 라인 트레이스는 게임 세계에서 보이지 않는 선을 그리는 과정입니다. 이 선은 충돌 검출을 위해 사용됩니다.
- 이 선은 특정 시작점과 끝점 사이를 따라 그려지며, 이 경로 상에 있는 객체들과의 가능한 충돌을 검출합니다.
- 트레이스 히트 (Trace Hit):
- 트레이스 히트는 라인 트레이스 중에 어떤 객체와의 충돌이 발생했을 때를 의미합니다.
- 충돌이 발생하면, 해당 이벤트는 FHitResult라는 구조체에 정보를 저장합니다. FHitResult는 충돌에 관한 다양한 정보를 담고 있어, 충돌한 객체, 위치, 표면의 법선 등을 알 수 있습니다.
- 라인 트레이스의 콜리전 채널 (Collision Channel):
- 라인 트레이스를 수행할 때, 특정 콜리전 채널을 지정하여 실행합니다. 콜리전 채널은 충돌 검출이 어떤 유형의 객체에 대해 수행될지 결정합니다.
- "보통" 라인 트레이스는 ECC_Visibility라는 콜리전 채널을 사용합니다. 이 채널은 시각적으로 보이는 객체들과의 충돌을 검출하는 데 사용됩니다.
- ECollisionChannel 열거형:
- ECollisionChannel은 충돌 검출에 사용되는 다양한 채널을 정의하는 열거형입니다.
- ECC_Visibility는 이 열거형에 정의된 상수 중 하나로, 시각적으로 인지 가능한 객체들과의 충돌을 검출하는 데 사용됩니다.
이러한 개념들은 Unreal Engine에서 물리적 상호작용과 충돌 처리를 위해 매우 중요하며, 게임의 실감나는 상호작용과 반응을 구현하는 데 핵심적인 역할을 합니다.
ECollisionChannel
ECollisionChannel은 언리얼 엔진에서 충돌 처리를 위해 사용되는 열거형(enum)입니다. 이 시스템을 통해 개발자들은 게임 오브젝트가 어떻게 서로 상호작용할지를 정의할 수 있습니다. 각 ECollisionChannel은 게임 내의 다양한 객체 유형을 나타냅니다.
ECollisionChannel의 기본 개념
- 충돌 채널: 각 채널은 게임 오브젝트의 종류나 역할을 대표합니다. 예를 들어, 플레이어, 적, 지형, 프로젝타일 등 각기 다른 유형의 객체들이 있을 수 있습니다.
- 충돌 감지: ECollisionChannel을 사용하면, 어떤 객체가 다른 객체와 충돌할 때 어떤 일이 발생할지 정의할 수 있습니다. 예를 들어, 총알이 벽과 충돌하면 반사되거나 파괴될 수 있습니다.
언리얼 엔진에서의 ECollisionChannel 사용
언리얼 엔진에서 ECollisionChannel은 충돌 검출 및 처리를 위해 널리 사용됩니다. 개발자는 이 열거형을 사용하여 다음과 같은 작업을 수행할 수 있습니다:
- 충돌 규칙 정의: 각 채널에 대해 어떤 채널과 충돌할지, 어떤 채널을 무시할지 정의할 수 있습니다.
- 충돌 프리셋: 언리얼 엔진은 ECollisionChannel과 함께 다양한 충돌 프리셋을 제공합니다. 예를 들어, 'NoCollision', 'BlockAll', 'OverlapAll' 등이 있습니다.
- 커스텀 충돌 채널: 기본 채널 외에도, 개발자는 게임의 특정 요구에 맞게 커스텀 충돌 채널을 생성할 수 있습니다.
게임 개발에서의 중요성
- 정교한 충돌 처리: ECollisionChannel을 사용하면 게임 내에서 더 정교하고 세밀한 충돌 처리가 가능해집니다.
- 퍼포먼스 최적화: 불필요한 충돌 검사를 줄임으로써 게임의 성능을 향상시킬 수 있습니다.
- 게임플레이 디자인: 다양한 게임플레이 메커니즘과 상호작용을 구현하는 데 있어 충돌 채널은 핵심적인 요소입니다.
결론적으로, ECollisionChannel은 언리얼 엔진에서 충돌 처리를 위한 강력하고 유연한 도구로, 게임 개발에서 매우 중요한 역할을 합니다.
HitResult
HitResult 는 언리얼 엔진에서 충돌이나 레이캐스팅(raycasting)과 같은 트레이스(추적) 작업의 결과를 나타내는 구조체입니다. HitResult는 특정 충돌 또는 트레이스 작업의 상세한 정보를 포함하고 있으며, 다음과 같은 주요 필드를 포함합니다:
- Actor (액터):
- 이 필드는 트레이스에 의해 충돌된 액터(Actor)를 나타냅니다. 즉, 레이캐스트 또는 다른 트레이스 작업이 어떤 오브젝트와 충돌했는지를 알려줍니다.
- bBlockingHit (차단 충돌 여부):
- 이 불리언(Boolean) 값은 트레이스가 차단(Block) 형태의 충돌을 만났는지를 나타냅니다. true 값은 트레이스가 충돌을 감지했으며, 이 충돌이 트레이스의 경로를 차단했음을 의미합니다.
- ImpactPoint (충격 지점):
- 이것은 트레이스 모양(예: 상자, 구, 광선 등)이 충돌된 오브젝트에 실제로 접촉한 월드 공간상의 위치를 나타냅니다. 즉, 실제 충돌이 발생한 지점의 좌표를 제공합니다.
HitResult는 게임 개발에서 충돌 처리, 물체 간 상호작용, 물리적 반응, 환경 인식 등 다양한 기능을 구현할 때 매우 중요한 역할을 합니다. 예를 들어, 총알이 벽에 맞았을 때의 충돌 지점을 알아내거나, 캐릭터가 레이캐스트를 사용해 시야 내의 물체를 감지할 때 이 구조체가 사용됩니다.
콜리전 헐 (Collision Hull)
"콜리전 헐(Collision Hull)"은 3D 그래픽스 및 게임 개발에서 사용되는 개념으로, 객체의 충돌 검출을 위해 사용되는 단순화된 형태를 말합니다. 실제 복잡한 모델 대신 콜리전 헐을 사용하여 물리적 상호작용 및 충돌 처리를 보다 효율적으로 수행할 수 있습니다.
콜리전 헐의 기본 원리
- 충돌 검출의 단순화: 실제 3D 모델은 매우 복잡할 수 있으며, 모든 디테일을 고려한 충돌 검출은 연산 비용이 매우 높습니다. 콜리전 헐은 이러한 모델을 간단한 형태(예: 상자, 구, 캡슐 등)로 근사하여 충돌 검출을 수행합니다.
- 효율성 향상: 콜리전 헐을 사용함으로써, 충돌 검출 과정이 훨씬 더 빠르고 효율적이 됩니다. 이는 게임의 성능을 최적화하는 데 중요합니다.
콜리전 헐의 활용
- 물리적 상호작용: 캐릭터나 객체가 환경과 상호작용할 때, 예를 들어 걸어다니거나 물체를 밀때, 콜리전 헐을 통해 이러한 상호작용이 실제와 유사하게 이루어지도록 합니다.
- 충돌 처리: 게임 내에서 발생하는 충돌(예: 총알이 벽에 부딪힘, 캐릭터가 문에 걸림 등)은 콜리전 헐을 기반으로 처리됩니다.
- 물리 엔진 최적화: 물리 엔진은 콜리전 헐을 사용하여 충돌을 계산함으로써, 게임의 성능 저하를 최소화합니다.
콜리전 헐의 종류
- 기본 형태들: 상자(Box), 구(Sphere), 캡슐(Capsule) 등의 기본적인 형태가 일반적으로 사용됩니다.
- 컨벡스 헐(Convex Hull): 보다 복잡한 형태가 필요할 때 사용되며, 객체를 둘러싸는 최소 볼륨을 나타냅니다.
주의점
- 정확도와 성능의 균형: 콜리전 헐은 단순화된 형태이기 때문에, 너무 단순하면 실제 모델과의 차이가 커져 물리적 상호작용이 부자연스러워질 수 있습니다. 반면, 너무 복잡하면 성능에 영향을 줄 수 있습니다.
- 게임 디자인에 따른 선택: 적절한 콜리전 헐의 선택은 게임의 디자인과 요구 사항에 따라 달라질 수 있습니다.
콜리전 헐은 게임 개발과 3D 모델링에서 충돌 검출과 물리 계산의 효율성을 높이는 핵심적인 요소입니다.
SpawnActor<>
언리얼 엔진의 C++ 프로그래밍에서 SpawnActor<AProjectile> 함수를 사용하여 특정 타입의 액터를 생성하는 방법에 대해 설명하고 있습니다. 주요 내용은 다음과 같습니다:
- <AProjectile> 사용의 목적:
- SpawnActor<AProjectile>은 AProjectile 클래스의 인스턴스를 생성하라는 것을 명확히 지정합니다.
- 이 방법을 사용하면 컴파일러는 AProjectile 타입의 액터를 생성하고, 해당 클래스의 생성자를 호출하며, 필요한 메모리를 할당합니다.
- 타입 명시의 이점:
- 코드에 타입을 명시함으로써 반환되는 액터 객체가 AProjectile 타입임이 보장됩니다.
- 이는 타입 오류를 방지하고, 반환된 객체를 AProjectile 타입으로 바로 사용할 수 있게 해줍니다.
- <AProjectile> 없이 SpawnActor 사용 가능성:
- SpawnActor 함수는 UClass* 타입의 파라미터를 받는 오버로드도 가지고 있어, 클래스를 UClass 객체로 전달할 수도 있습니다.
- 하지만, 이 방법은 타입 안전성이 떨어지고, 반환된 액터에 대한 추가적인 타입 캐스팅이 필요할 수 있습니다.
- 결론:
- <AProjectile>을 사용하는 것은 타입 안전성을 제공하며, 코드를 더 명확하고 간결하게 만들어 줍니다.
- 이 방식은 언리얼 엔진의 C++ API에서 권장되는 방법입니다.
요약하자면, <AProjectile>을 사용하여 SpawnActor 함수를 호출하는 것은 타입 안전성과 코드의 명확성을 높이는 언리얼 엔진의 권장된 C++ 프로그래밍 방식입니다.
발사체를 이동 시키는 법
1. Tick, set Locaion/Rotation
2. Add an Impulse
3. Movement Component (we do)
델리게이트
델리게이트는 프로그래밍에서 함수나 메서드에 대한 참조를 의미합니다. 델리게이트를 사용하면 특정 함수를 변수처럼 저장하고, 필요에 따라 그 함수를 호출할 수 있습니다. Unreal Engine의 델리게이트와 일반적인 프로그래밍 언어에서의 델리게이트 개념에는 몇 가지 공통점과 차이점이 있습니다.
Unreal Engine의 델리게이트
Unreal Engine에서 델리게이트는 주로 이벤트 핸들링과 콜백 구현에 사용됩니다. UE 델리게이트는 특히 강력하고 유연한 이벤트 시스템을 제공합니다.
- 유형:
- 싱글캐스트 델리게이트: 한 번에 하나의 함수만 바인딩할 수 있는 델리게이트입니다.
- 멀티캐스트 델리게이트: 여러 함수를 바인딩하고, 이벤트가 발생했을 때 모든 바인딩된 함수를 호출할 수 있는 델리게이트입니다.
- 특징:
- 강한 타입 체크: UE 델리게이트는 매개변수 타입과 반환 타입이 정확히 일치하는 함수만 바인딩할 수 있습니다.
- 동적 바인딩: 런타임에 함수를 델리게이트에 바인딩하거나 해제할 수 있습니다.
- 이벤트 드리븐: UE 델리게이트는 주로 이벤트에 반응하여 특정 작업을 수행하도록 설계되었습니다.
일반적인 델리게이트
일반적인 프로그래밍 언어에서의 델리게이트(예: C#의 델리게이트)는 함수의 참조를 저장하는 타입입니다.
- 특징:
- 함수 참조: 델리게이트는 특정 함수를 가리키며, 이를 통해 함수를 변수처럼 전달하고 호출할 수 있습니다.
- 유연성: 다양한 함수를 동일한 델리게이트 타입으로 참조할 수 있어, 코드의 재사용성과 유연성을 높여줍니다.
- 콜백과 이벤트 처리: 일반적으로 콜백 함수나 이벤트 핸들러로 사용됩니다.
공통점과 차이점
공통점:
- 둘 다 함수나 메서드의 참조를 저장하는 데 사용됩니다.
- 이벤트 핸들링과 콜백 구현에 유용합니다.
차이점:
- 구현과 사용법: UE의 델리게이트는 게임 엔진의 특정 요구 사항과 긴밀하게 통합되어 있으며, 멀티캐스트 기능을 포함합니다. 반면, 일반적인 델리게이트는 프로그래밍 언어의 일부로, 더 단순한 형태를 가질 수 있습니다.
- 타입 체크: UE 델리게이트는 강한 타입 체크를 강조하는 반면, 일부 다른 언어의 델리게이트는 더 유연한 타입 체크를 허용할 수 있습니다.
- 특정 기능: UE 델리게이트는 게임 개발에 특화된 기능(예: 이벤트 드리븐 프로그래밍)을 제공하는 반면, 일반적인 델리게이트는 보다 일반적인 프로그래밍 상황에 맞춰져 있습니다.
Unreal Engine의 델리게이트는 게임 개발의 복잡한 요구를 충족시키도록 설계되었으며, 이벤트 핸들링과 콜백 구현을 위한 강력하고 유연한 도구를 제공합니다. 일반적인 프로그래밍 언어의 델리게이트는 이보다 더 일반적이고 단순한 경우가 많지만, 그럼에도 불구하고 유사한 목적으로 사용됩니다.
// Projectile.h
private:
// 델리게이트에 바인딩하려면 UFUNCTION이어야 합니다
UFUNCTION()
void OnHit(UPrimitiveComponent* HitCOmp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult &Hit);
// Projectile.cpp
// 생성자는 이르고, BeginPlay에서 바인딩
void AProjectile::BeginPlay()
{
Super::BeginPlay();
ProjectileMesh->OnComponentHit.AddDynamic(this, &OnHit);
}
void AProjectile::OnHit(UPrimitiveComponent* HitCOmp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult &Hit)
{
}
invocation list는 델리게이트에 의해 호출될 메서드들의 리스트를 의미합니다. 즉, 델리게이트가 트리거될 때 실행될 메서드들의 순서와 집합을 나타냅니다.
어떤 줄에 전방 선언을 한 번 하고 나면 다음부터 그 타입을 쓸 수 있습니다.
따라서 위에 전방선언을 몰아서 배치하는 방법도 있습니다.
class USoundBase;
int main()
{
USoundBase* AtkSound;
USoundBase* EndingSound;
}
카메라 셰이크
Blueprint > MatineeCameraShake
Oscillation : 진동
Oscillation Duration : 진동 지속 시간
Oscillation Blend in Time : 블렌드 지속 시간
Oscillation Blend in Time : 블렌드 지속 시간
Rot Oscillation과 FOVOscillation은 멀미가 나기 쉬운 진동입니다.
Loc Oscillation을 사용해 봅시다.
Amplityde : 진폭
Frequency : 주파수
스프링암에 관성을 가지게 하는법
(Spring Arm)Enable Camera Lag (check)
(Spring Arm)Enable Camera Rotation Lag (check)
Emitter
Unreal Engine에서 "emitter"는 주로 파티클 시스템 내에서 사용되는 용어로, 파티클을 생성하고 제어하는 역할을 합니다. 파티클 시스템은 게임 내에서 다양한 시각적 효과를 생성하는 데 사용되며, 이러한 효과에는 불, 연기, 안개, 먼지, 빛나는 효과 등이 포함될 수 있습니다.
Emitter의 역할 및 기능
- 파티클 생성:
- Emitter는 파티클, 즉 작은 그래픽 요소들을 생성합니다. 이 파티클들은 시각적 효과의 기본 단위로 사용됩니다.
- 파티클 특성 제어:
- 각 emitter는 생성되는 파티클의 속성을 제어합니다. 이에는 크기, 색상, 수명, 속도, 방향 등의 속성이 포함될 수 있습니다.
- 시각적 효과 구현:
- 다양한 종류의 emitter를 조합하여 복잡한 시각적 효과를 구현할 수 있습니다. 예를 들어, 불과 연기를 동시에 표현하기 위해 여러 emitter를 사용할 수 있습니다.
- 게임 내 환경 향상:
- Emitter를 사용하여 게임 환경을 보다 생동감 있고 현실적으로 만들 수 있습니다. 예를 들어, 캐릭터가 이동할 때 발생하는 먼지, 물체에 부딪혔을 때의 불꽃 튀는 효과 등을 구현할 수 있습니다.
Unreal Engine의 파티클 시스템
- Niagara 및 Cascade:
- Unreal Engine에서는 주로 Niagara 또는 Cascade라는 시스템을 사용하여 파티클 효과를 만듭니다. 이 시스템들 내에서 emitter를 설정하고 조정할 수 있습니다.
- 시각적 편집자:
- 파티클 시스템은 시각적 편집자를 제공하여, 개발자가 쉽게 파티클 효과를 생성하고 수정할 수 있도록 합니다.
Emitter는 게임 개발에서 시각적으로 매력적인 효과를 추가하는 데 필수적인 요소로, 게임 플레이의 몰입감을 높이는 데 크게 기여합니다.
플레이어 컨트롤러에서 커서 모양을 정할 수 있다.
UFUNCTION 매크로
UFUNCTION은 함수를 Unreal의 Reflection 시스템에 등록하고, 특정 특성을 부여하기 위해 사용됩니다. UFUNCTION 내에 사용할 수 있는 여러 키워드들은 함수의 동작 방식과 접근 방식을 다양하게 설정할 수 있게 해줍니다. 여기서는 BlueprintImplementableEvent와 같은 주요 키워드들에 대해 설명하겠습니다.
BlueprintImplementableEvent
- 설명: C++에서 선언되고 Blueprint에서 구현됩니다. 이 함수는 C++ 코드에서 호출할 수 있지만, 구현은 Blueprint에서만 가능합니다.
BlueprintCallable
- 설명: Blueprint에서 직접 호출할 수 있는 함수를 의미합니다. C++에서 구현되며, Blueprint에서 사용할 수 있습니다.
BlueprintNativeEvent
- 설명: C++에서 기본 구현을 제공하고, Blueprint에서 오버라이드할 수 있는 함수입니다. BlueprintNativeEvent는 BlueprintImplementableEvent와 유사하지만, C++에 기본 구현이 있어야 한다는 점에서 차이가 있습니다.
BlueprintPure
- 설명: 이 키워드가 사용된 함수는 사이드 이펙트(side effect)가 없는 순수 함수로 간주됩니다. 즉, 게임의 상태를 변경하지 않고 값을 반환하기만 합니다. Blueprint에서는 이러한 함수가 특별한 노드로 표시됩니다.
BlueprintReadOnly
- 설명: 주로 변수에 사용되며, 이 변수가 Blueprint에서 읽기 전용으로 사용되어야 함을 나타냅니다.
BlueprintReadWrite
- 설명: 이 키워드가 적용된 변수는 Blueprint에서 읽고 쓸 수 있습니다.
NetMulticast, Reliable, Unreliable
- 설명: 네트워크 게임에서 사용되는 키워드들입니다. NetMulticast는 모든 클라이언트에 함수 호출을 전송합니다. Reliable과 Unreliable은 네트워크를 통한 함수 호출의 신뢰성을 설정합니다. Reliable은 호출이 반드시 도달하도록 보장하지만, Unreliable은 그렇지 않습니다.
Server, Client
- 설명: 네트워크 게임에서 사용되며, 함수가 서버에서만(Server) 실행되거나 클라이언트에서만(Client) 실행되어야 함을 나타냅니다.
이러한 키워드들은 Unreal Engine의 게임 개발에서 다양한 상황에 맞춰 함수의 동작 방식을 정의하는 데 큰 역할을 합니다. 예를 들어, 네트워크 게임, Blueprint와의 상호 작용, 게임의 로직 흐름 제어 등에 매우 중요합니다.
'Unreal 공부 > UE5 GameDev' 카테고리의 다른 글
[UE5] ToonTank (2) (0) | 2023.11.19 |
---|---|
[UE5] ToonTank (1) (0) | 2023.11.17 |
[UE5] Crypt Raider (2) (0) | 2023.11.13 |
[UE5] Crypt Raider (1) (0) | 2023.11.11 |
HitResult.Location 과 HitResult.ImpactPoint의 차이 (0) | 2023.11.11 |