이번 포스트에서는 기존의 구조에 맞춰 블랙홀 스킬을 적용해보고 시각적으로 개선해보겠습니다.
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이되면 일정 시간 후 PlayerController의 FinishBlackHoleAbility 함수를 호출합니다.
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;
}
}
}
}
}
블랙홀 스킬을 사용한 후의 상태는 위와 같은 로직으로서 이뤄집니다.
최종 실행 결과는 다음과 같습니다.
'유니티 > 게임 프로젝트' 카테고리의 다른 글
2D RPG - (16 - 5) 블랙홀 스킬 구현_05 (0) | 2025.02.12 |
---|---|
2D RPG - (16 - 3) 블랙홀 스킬 구현_03 (0) | 2025.02.11 |
2D RPG - (16 - 2) 블랙홀 스킬 구현_02 (0) | 2025.02.11 |
2D RPG - (16 - 1) 블랙홀 스킬 구현_01 (0) | 2025.02.10 |
2D RPG - (15 - 9) 단검 투척 스킬 구현_09 (0) | 2025.02.06 |