-
231005 Attack 원거리 공격기록 2023. 10. 5. 19:33
플레이어는 총 4가지 스킬 모션을 가지고 있다.
1. Arrow
2. Magic
3. Bomb
4. Hook
Hook를 제외한 Arrow, Magic, Bomb는 공격 물체인 화살, 불, 폭탄을 던지도록 되어있다.
던져지는 물체를 먼저 제작하여 몬스터와 콜리전 체크(부딪힐) 시 몬스터의 FSM을 HIT로 바꾸는 작업을 진행하였다.
1. 던지는 물체 sphere 액터를 제작한다
// PlayerAttMagic.h #pragma once #include <GameEngineCore/GameEngineActor.h> #include "PhysXSphereComponent.h" class PlayerAttMagic : public GameEngineActor { friend class Player; // Player 에대 대한 정보를 접근할 수 있도록 protected: void Start() override; void Update(float _DeltaTime) override; private: bool isShoot = false; float4 Dir = float4::ZERO; // 날라가는 방향 float firetime = 0.0f; // 날라가기 시작한 시간을 측정하기 위함 // Component // Render std::shared_ptr<class ContentFBXRenderer> MagicRenderer = nullptr; // 랜더 //physx std::shared_ptr<class PhysXSphereComponent> PhysXComp = nullptr; // 피직스(콜리전) // init void Init(); void SetDir(const float4& _Dir, const float4& _Pos); };
//PlayerAttMagic.cpp #include "PreCompileHeader.h" #include "PlayerAttMagic.h" #include "ContentFBXRenderer.h" #include "PhysXSphereComponent.h" PlayerAttMagic::PlayerAttMagic() { } PlayerAttMagic::~PlayerAttMagic() { } void PlayerAttMagic::Init() // 랜더러생성 { MagicRenderer = CreateComponent< ContentFBXRenderer>(); MagicRenderer->SetFBXMesh("SphereDefault.fbx","ContentMeshDeffered"); GetTransform()->SetLocalScale(float4::ONE * 0.2f); } void PlayerAttMagic::Start() { Init(); } void PlayerAttMagic::Update(float _DeltaTime) // 매 프레임마다 들어와 update한다. { if (false == isShoot) { return; } float4 Test = GetTransform()->GetWorldPosition(); if (true == CheckCollision(PhysXFilterGroup::MonsterDynamic) || GetLiveTime() > firetime + 10.0f) {// 몬스터에 부딪히거나 or 발사한지 10초 이상 지난다면 Death(); return; } PhysXComp->GetDynamic()->setLinearVelocity({ 0,0,0 }); PhysXComp->SetMoveSpeed(Dir * 1000.0f); // Dir방향으로 등속운동을 하도록 한다 isPhysXCollision = 0; } void PlayerAttMagic::SetDir(const float4& _Dir, const float4& _Pos) { // 마우스 위치에 따라 공격 sphere의 위치와 날라가는 방향을 변경해준다. if (true == _Dir.IsZero()) { MsgAssert("Zero dir은 입력할 수 없습니다"); return; } if (nullptr == PhysXComp) // 피직스 컴포넌트가 생성되지 않았을 경우 생성해 준다. { PhysXComp = CreateComponent< PhysXSphereComponent>(); PhysXComp->CreatePhysXActors(float4::ONE * 100.0f, float4::ZERO); PhysXComp->SetFilterData(PhysXFilterGroup::PlayerSkill, PhysXFilterGroup::MonsterDynamic); PhysXComp->SetPhysxMaterial(1.f, 1.f, 0.f); PhysXComp->TurnOffGravity(); PhysXComp->SetTrigger(); } PhysXComp->GetDynamic()->setGlobalPose(float4::PhysXTransformReturn(float4::ZERO, _Pos)); //PhysXComp->SetWorldPosWithParent(_Pos); Dir = _Dir; firetime = GetLiveTime(); }
기본 sphere 액터 오브젝트가 생성됨을 테스트맵에서 확인하였다.
2. 플레이어 FSM에서 이 sphere가 플레이어애니메이션의 Weapon본 위치에서 생성되어 플레이어가 바라보는 방향으로 발사하게 만들었다.
//SKILL // 우클릭 Arrow, Arrow_bomb, Arrow_magic, Hookshot, Hookshot_fly SetFSM(PlayerState::SKILL, [this] //fsm start { MoveDir = GetMousDirection(); Skill = GetLevel()->CreateActor< PlayerAttMagic>(); float4 MagicPos = GetBonePos("Weapon_L"); Skill->SetDir(MoveDir, MagicPos); MoveUpdate(0.0f); }, [this](float Delta) // fsm update { if (true == GameEngineInput::IsPress("PlayerRBUTTON")) { MoveDir = GetMousDirection(); // 마우스 방향을 바라보도록 함 float4 MagicPos = GetBonePos("Weapon_L"); //플레이어의 Weapon_L본위치를 가져옴 Skill->SetDir(MoveDir, MagicPos); //skill이 날라갈 방향과 존재하는 위치를 어베이트함 } else { // 스킬 발사 후 플레이어의 state를 idle상태로 변경함 Skill->isShoot = true; SetNextState(PlayerState::IDLE); } }, [this] { // fsm end Skill = nullptr; // skill에 대한 controll권한을 잃었고 shared_ptr로 관리하기 때문에 nullptr로 변경함 } );
다음과 같이 플레이어가 클릭한 방향으로 구체가 날라감을 확인할 수 있다.
3. 몬스터가 PhysXFilterGroup::PlayerSkill(구)에 닿으면 Hit fsm으로 변경하게 하였다.
//EnemyFirePlant.cpp SetFSM(EnemyFireFlowerState::BITE, [this] // fsm start { EnemyRenderer->ChangeAnimation("BITE"); }, [this](float Delta) // fsm update { if (true == CheckCollision(PhysXFilterGroup::PlayerSkill)) { // 플레이어 스킬과 콜리전체크가 된다면 SetNextState(EnemyFireFlowerState::HIT); // 다음 state는 hit return; } if (true == EnemyRenderer->IsAnimationEnd()) { // bite애니메이션이 끝난다면 SetNextState(EnemyFireFlowerState::IDLE); // 다음 state는 idle return; } }, [this] // fsm end { } );
다음과 같이 플레이어가 발사하는 구체와 맞으면 HIT애니메이션으로 변경된다.
위 프로세스를 확장하여 스킬을 구현할 예정이다.
'기록' 카테고리의 다른 글
231011 이펙트 메쉬 적용, 몬스터 공격 액터 생성, 본 애니메이션 weight 변경, 그 외 (0) 2023.10.11 231010 플레이어 문제해결, 화살 매쉬 생성, 2D방향을 3D에 적용, (0) 2023.10.10 231003 PhysX Collision Checking (1) 2023.10.03 231002 Batch파일 경로 문제 오류 , Animation의 Start Event Function (0) 2023.10.02 20231001 PhysX Component를 가지는 액터 Position체크 (0) 2023.10.01