
SD건담 캡슐파이터 게임에 있었던 우클릭시 가까운 적을 타게팅하여 에임보정해주는 기능을 구현하기
마우스 우클릭시 적 감지 -> 화면 내에서 가장 가까운 적 타겟팅 -> 컨트롤 로테이션 조정
PlayerBase 추가 내용
- RightMouseButtonAction 추가
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, meta = (AllowPrivateAccess = "true")) UInputAction* RightMouseButtonAction;
- Action에 바인드 할 함수 추가 ( Started, Completed )
void RightMouseButtonStarted(); void RightMouseButtonCompleted();
- 모듈화를 위해 Action에 바인드 된 함수에서 실행할 Event 추가
DECLARE_EVENT(APlayerBase, FRightMouseButtonStarted); FRightMouseButtonStarted& OnRightMouseButtonStarted() { return RightMouseButtonStartedEvent; } DECLARE_EVENT(APlayerBase, FRightMouseButtonCompleted); FRightMouseButtonCompleted& OnRightMouseButtonCompleted() { return RightMouseButtonCompletedEvent; } FRightMouseButtonStarted RightMouseButtonStartedEvent; FRightMouseButtonCompleted RightMouseButtonCompletedEvent;Event를 실행할 코드를 RightMouseButtonStarted와 RightMouseButtonCompleted에 각각 작성하고 이 둘을 RightMouseButtonAction의 Started, Completed에 각각 바인드한다.
TargetComponent ( Actor Component ) 추가
우클릭시 Trace 해서 액터 감지 -> 가장 가까운 액터를 TargetActor로 설정 -> Tick에서 보간으로 ControlRotation Set -> 우클릭 해제시 TargetActor를 nullptr로 설정
- PlayerBase의 OnRightMouseButtonStarted() 에 바인드할 SearchTarget 함수 추가 후 바인드
- PlayerBase의 OnRightMouseButtonCompleted() 에 바인드할 EndTargeting함수 추가 후 바인드
- SearchTarget에서 실행 할 SphereTrace 함수와 SetTarget, 감지된 액터가 화면안에 있는지 체크할 IsInScreen 함수 추가
처음엔 SphereTrace가 아닌 BoxTraceMulti를 통해 감지하려 했으나 어째서인지 하나의 액터만 감지하고 그 뒤로는 감지하지 못했다. 이유는 Enemy가 Visibility 채널에 대해 Block으로 설정되어있었고 BoxTraceMulti는 BlockHit까지만 감지하고 끝나기 때문이다.
이를 방지하기 위해 Visibility 채널에 대해 Overlap으로 해버리면 Weapon의 BoxTraceSingle에 BlockHit이 되지 않아서 공격에 감지가 되지 않는다.
그래서 일단 SphereTraceMulti를 크게 해서 Block이 되더라도 범위 내의 적은 다 검출하도록 하였다.SphereTrace를 하니 캐릭터 뒤쪽의 적도 감지가 되었고 거리순으로 판별하느라 뒤에있는 Enemy가 가장 가까우면 뒤로 돌아버리게 되었다.
그래서 내적을 통해 캐릭터의 앞 일정 각도 내에 있는 Enemy만 거리를 계산하도록 하였다.
가장 가까운 적을 잘 타게팅한다.
뒤에 있는 적은 가까이 있더라도 타게팅되지 않는다.
지금은 거리를 기준으로 가장 가까운 적을 타게팅하는데 이것보단 거리 내에서 내 에임과 가장 가까운 적을 타게팅하도록 하는게 플레이적으로 더 쾌적하고 바람직할 것이다. 알고리즘을 바꿔서 그렇게 구현해야겠다.