유니티/게임 프로젝트

2D RPG - (16 - 4) 블랙홀 스킬 구현_04

monstro 2025. 2. 12. 00:22
728x90
반응형

이번 포스트에서는 기존의 구조에 맞춰 블랙홀 스킬을 적용해보고 시각적으로 개선해보겠습니다.

 

1) BaseCharacterController

 

 

 

게임에서 사용하는 모든 캐릭터들의 조상 클래스BaseCharacterController

SpriteRenderer 프로퍼티추가하여 해당 프로퍼티를 통해 캐릭터를 투명하게 만드는

MakeTransparent 메서드를 추가하였습니다.

 

2) SkillManager

public class SkillManager : MonoBehaviour
{
    public static SkillManager _skillManagerInstance;

    // SkillManager는 스킬을 수행하는 주체이므로, 각 스킬에 대해 알고 있어야 함
	.
	.
	.
    public SkillBlackHole _skillBlackHole { get; private set; }

	.
	.
	.

    private void Start()
    {
        
		.
		.
		.
        
        _skillBlackHole = GetComponent<SkillBlackHole>();
    }
}

 

모든 스킬들을 관리하는 싱글톤 클래스 SkillManager블랙홀 스킬을 추가하였습니다.

 

3) SkillBlackHoleController

 

 

 

이전의 로직에서 일부를 함수로 변경하여 수행하도록 코드를 수정하였습니다.

또한, 생성된 분신이 공격한 후플레이어잠시동안 투명하게 만들고

만약 공격 횟수가 0이되면 일정 시간 후 PlayerControllerFinishBlackHoleAbility 함수를 호출합니다.

 

3) PlayerController

 

 

 

 

 

 

 

 

 

플레이어의 조작을 담당하면서 플레이어 그 자체를 의미하는 PlayerController의 경우

블랙홀 스킬을 사용하는 상태BlackHoleState를 위한 로직을 추가하였습니다.

또한 블랙홀 스킬을 사용하기 위한 입력을 처리하는 로직 역시 추가하였고,

메서드 FinishBlackHoleAbility의 경우, 블랙홀 스킬을 사용한 후 상태를 전환하는 용도로 사용합니다.

 

4) PlayerState

 

 

모든 상태의 조상 클래스PlayerState의 경우,

PlayerController로부터 R 키의 입력을 받아 프로퍼티의 값을 설정합니다.

 

5) PlayerStateGrounded

 

땅을 딛고 있는 상태에서 R 키를 누르면, 현재 상태를 BlackHoleState로 전환합니다.

 

6) PlayerStateBlackHole

public class PlayerStateBlackHole : PlayerState
{
    // 순서대로 공중에 떠 있는 시간 / 블랙홀 스킬을 사용했는지 판단 / 기본상태의 중력
    private float _flyTime = 0.4f;
    private bool _skillUsed;
    private float _defaultGravity;

    public PlayerStateBlackHole(PlayerController inController, PlayerStateMachine inStateMachine, string inParamName)
        : base(inController, inStateMachine, inParamName)
    {

    }

    // BlackHole State에 돌입하면
    public override void Enter()
    {
        base.Enter();

        // 기본 상태의 중력을 저장
        _defaultGravity = _controller._rigidbody2D.gravityScale;

        // 스킬이 아직 사용되지 않았으므로 false로 설정 / BlackHole State의 타이머 설정 / 중력 수치를 0으로 설정하여 하늘에 띄움
        _skillUsed = false;
        _stateTimer = _flyTime;
        _rigidbody2D.gravityScale = 0;
    }

    // BlacHoleState에서 탈출하면
    public override void Exit()
    {
        base.Exit();

        // Player의 중력을 기본 중력 상태로 바꿔 떨어뜨리고 / 투명해진 상태에서 다시 원래 상태로 돌아옴
        _controller._rigidbody2D.gravityScale = _defaultGravity;
        _controller.MakeTransparent(false);
    }

    public override void Update()
    {
        base.Update();

        // 타이머가 0보다 크다면, 서서히 플레이어가 하늘로 올라감
        if (_stateTimer > 0)
            _rigidbody2D.velocity = new Vector2(0, 15);

        // 타이머가 0보다 작아지면
        if (_stateTimer < 0)
        {
            // 플레어는 천천히 떨어짐
            _rigidbody2D.velocity = new Vector2(0, -0.1f);

            // 만약 스킬 사용이 이뤄지지 않았다면
            if (_skillUsed == false)
            {
                // 스킬 사용이 가능한지 판단하고
                if (_controller._skillManager._skillBlackHole.DoDefineCanUseSkill())
                {
                    // 스킬을 사용하고 / 스킬 사용 여부를 true로 설정
                    _controller._skillManager._skillBlackHole.DoUseSkill();
                    _skillUsed = true;
                }
            }
        }
    }
}

 

블랙홀 스킬을 사용한 후의 상태는 위와 같은 로직으로서 이뤄집니다.

최종 실행 결과는 다음과 같습니다.

 

728x90
반응형