-
231010 플레이어 문제해결, 화살 매쉬 생성, 2D방향을 3D에 적용,기록 2023. 10. 10. 20:44
플레이어 문제점1
Player State가 Idle 혹은 Move일 때 CheckFalliing함수를 통해 땅과 플레이어 사이를 계산하고, 그 값이 일정이상 넘으면 falling state로 변경하게 하였다.
void Player::CheckFalling() { // Falling Check float4 PlayerGroundPos = GetTransform()->GetWorldPosition(); // 플레이어의 위치 float4 CollPoint = float4::ZERO; // 충돌체크할 변수 if (true == m_pCapsuleComp->RayCast(PlayerGroundPos, float4::DOWN, CollPoint, 2000.0f)) // 플레이어 위치에서 float4::DOWN 방향으로 2000.0f 길이만큼 체크한다. { if (PlayerGroundPos.y > CollPoint.y + 300.0f) // 300.0 이상 차이가 나는경우 falling state로 변경한다. { SetNextState(PlayerState::FALLING); return; } } }
문제발생) 내리막길에서 허공을 걸어가게 되어 fallingstate로 변경된다.
원인분석)
1. 피직스 컴포넌트에 적용되는 중력이 약하다.
2. 상하좌우로 움직이는 MoveUpdate값이 상대적으로 중력에 비해 너무 크다.
3. 알 수 없는 외부요인
해결) ModifyHeight()를 추가하여 허공에서 걷지 않도록 하였다.
void Player::ModifyHeight() { float4 PlayerGroundPos = GetTransform()->GetWorldPosition(); // 플레이어의 위치 float4 CollPoint = float4::ZERO; // 충돌체크할 변수 if (true == m_pCapsuleComp->RayCast(PlayerGroundPos, float4::DOWN, CollPoint, 2000.0f)) { if (PlayerGroundPos.y > CollPoint.y + 70.0f) // 플레이어가 허공에 떠있다면 { MoveUpdate(300.0f, float4::DOWN); // 아래로 눌러줌 return; } } } void Player::CheckFalling() { ModifyHeight(); // Falling Check float4 PlayerGroundPos = GetTransform()->GetWorldPosition(); // 플레이어의 위치 float4 CollPoint = float4::ZERO; // 충돌체크할 변수 if (true == m_pCapsuleComp->RayCast(PlayerGroundPos, float4::DOWN, CollPoint, 2000.0f)) // 플레이어 위치에서 float4::DOWN 방향으로 2000.0f 길이만큼 체크한다. { if (PlayerGroundPos.y > CollPoint.y + 300.0f) // 300.0 이상 차이가 나는경우 falling state로 변경한다. { SetNextState(PlayerState::FALLING); return; } } }
화살 매쉬 생성
1. 앞에서 우클릭을 하는 경우 스피어 매쉬를 생성하여 발사하도록 하였다.
https://hayo-su.tistory.com/77
2. ARROW 공격에 BOW 메쉬를 추가하였다.
Bow 메쉬가 플레이어의 Weapon_L 본위치를 따라가도록 만들었다.
발사하기 전까지 Sphere위치도 Weapon_R 본 위치를 따라가도록 만들었다.
3. Sphere 매쉬를 화살 매쉬로 변경하였다.
화살 메쉬의 피봇이 화살촉에 해당하기 때문에 Weapon_R 본 위치에서 Weapon_L 본 위치로 변경하고 오른손이 연결되게 보이도록 rotation시켰다.
2D direction to 3D
클릭한 위치로 플레이어가 공격하고 스킬 시전하도록 만드는 과정이다.
1. 플레이어를 화면(2D)공간으로 가져온 후, 윈도우 좌표계 값을 데카르트 좌표계 값으로 바꾼다.
2. 마우스 위치를 가져온 후, 윈도우 좌표계 값을 데카르트 좌표계 값으로 바꾼다.
3. 1과2 사이의 차이값을 가져와 방향을 얻는다.
4. 이 방향값을 월드에 적용시킨다.
1. 플레이어를 화면(2D)공간으로 가져온 후, 윈도우 좌표계 값을 데카르트 좌표계 값으로 바꾼다.
// 3D to 2D matrix std::shared_ptr<GameEngineCamera> MainCam = GetLevel()->GetMainCamera(); float4x4 CamViewProjectionMat = MainCam->GetView() * MainCam->GetProjection() * MainCam->GetViewPort(); // 플레이어 위치 float4 Player2DPos = GetTransform()->GetWorldPosition(); Player2DPos *= CamViewProjectionMat; // 카메라 ViewProjection Player2DPos /= Player2DPos.w; Player2DPos.w = 1.0f; // Windows Forms to Cartesian Coordinate System 윈도우 좌표계 to 데카르트 좌표계 Player2DPos -= GameEngineWindow::GetScreenSize().half(); Player2DPos.y = -Player2DPos.y;
2. 마우스 위치를 가져온 후, 윈도우 좌표계 값을 데카르트 좌표계 값으로 바꾼다.
// Windows Forms to Cartesian Coordinate System 마우스 위치를 윈도우좌표계 to 데카르트 좌표계 float4 Mouse2DPos = GameEngineWindow::GetMousePosition() - GameEngineWindow::GetScreenSize().half(); Mouse2DPos.y = -Mouse2DPos.y;
3. 1과2 사이의 차이값을 가져와 방향을 얻는다.
// 방향 float4 NDir = Mouse2DPos - Player2DPos; NDir.z = 0;
4. 이 방향값을 월드에 적용시킨다.
float4 Player::GetMousDirection() { // 3D to 2D matrix std::shared_ptr<GameEngineCamera> MainCam = GetLevel()->GetMainCamera(); float4x4 CamViewProjectionMat = MainCam->GetView() * MainCam->GetProjection() * MainCam->GetViewPort(); // 플레이어 위치 float4 Player2DPos = GetTransform()->GetWorldPosition(); Player2DPos *= CamViewProjectionMat; // 카메라 ViewProjection Player2DPos /= Player2DPos.w; Player2DPos.w = 1.0f; // Windows Forms to Cartesian Coordinate System 윈도우 좌표계 to 데카르트 좌표계 Player2DPos -= GameEngineWindow::GetScreenSize().half(); Player2DPos.y = -Player2DPos.y; // 마우스 위치 // Windows Forms to Cartesian Coordinate System 마우스 위치를 윈도우좌표계 to 데카르트 좌표계 float4 Mouse2DPos = GameEngineWindow::GetMousePosition() - GameEngineWindow::GetScreenSize().half(); Mouse2DPos.y = -Mouse2DPos.y; // 방향 float4 NDir = Mouse2DPos - Player2DPos; NDir.z = 0; NDir.Normalize(); float4 Ydir = float4{ NDir.x,0.0f, NDir.y }; return Ydir; }
결과)
issue) 다음과 같이 실제 마우스 위치와 날라가는 화살 위치가 일치하지 않는 문제점이 발생하였다.
'기록' 카테고리의 다른 글
231108 기록 (0) 2023.11.08 231011 이펙트 메쉬 적용, 몬스터 공격 액터 생성, 본 애니메이션 weight 변경, 그 외 (0) 2023.10.11 231005 Attack 원거리 공격 (1) 2023.10.05 231003 PhysX Collision Checking (1) 2023.10.03 231002 Batch파일 경로 문제 오류 , Animation의 Start Event Function (0) 2023.10.02