ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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애니메이션으로 변경된다.

    위 프로세스를 확장하여 스킬을 구현할 예정이다.

    댓글

Designed by Tistory.