
오늘 학습 키워드
최종 팀 프로젝트
오늘 학습 한 내용을 나만의 언어로 정리하기
시네머신 기본
1차 프로토타입 개선안
플레이어가 데미지를 받았을 때에도 회피/패링/섬단이 가능하도록
// DamagedState.cs
public class DamagedState : IPlayerState
{
private float startStateTime;
private float startAttackTime = 0.01f;
private float canInputTime = 0.1f;
public void Enter(PlayerController controller)
{
controller.Move.rb.velocity = Vector2.zero;
controller.Condition.canStaminaRecovery.Value = true;
controller.Animator.SetTriggerAnimation(PlayerAnimID.Damaged);
controller.Inputs.Player.Move.Disable();
controller.Inputs.Player.Jump.Disable();
controller.Inputs.Player.NormalAttack.Disable();
controller.Inputs.Player.Look.Disable();
}
public void HandleInput(PlayerController controller)
{
if (Time.time - startStateTime > canInputTime)
{
controller.Inputs.Player.Move.Enable();
controller.Inputs.Player.Jump.Enable();
controller.Inputs.Player.NormalAttack.Enable();
controller.Inputs.Player.Look.Enable();
}
if (controller.Inputs.Player.SpecialAttack.triggered)
{
controller.isLookLocked = false;
controller.ChangeState<SpecialAttackState>();
return;
}
if (controller.Inputs.Player.Dodge.triggered)
{
controller.ChangeState<DodgeState>();
return;
}
if (controller.Inputs.Player.Parry.triggered)
{
controller.ChangeState<StartParryState>();
return;
}
}
public void LogicUpdate(PlayerController controller)
{
if (Time.time - startStateTime > startAttackTime)
{
AnimatorStateInfo curAnimInfo = controller.Animator.animator.GetCurrentAnimatorStateInfo(0);
if (curAnimInfo.IsName("Damaged"))
{
float animTime = curAnimInfo.normalizedTime;
if (animTime >= 1.0f)
{
controller.ChangeState<IdleState>();
return;
}
}
}
}
public void Exit(PlayerController controller)
{
controller.Inputs.Player.Move.Enable();
controller.Inputs.Player.Jump.Enable();
controller.Inputs.Player.NormalAttack.Enable();
controller.Inputs.Player.Look.Enable();
}
}
한 번 맞고 난 뒤에 바로 패링 안되도록
private void OnTriggerEnter2D(Collider2D other)
{
if (controller.Attack.isStartParry)
{
if (other.TryGetComponent(out ICountable countable))
{
Debug.Log("[플레이어] 플레이어 패링 시도");
if (countable.CounterAttacked())
{
controller.Attack.successParry = true;
Debug.Log("[플레이어] 플레이어 패링 성공");
}
}
return;
}
if (other.TryGetComponent<IDamagable>(out var damagable))
// && other.gameObject.layer == LayerMask.NameToLayer("Monster"))
{
damagable?.TakeDamage(Damage);
Debug.Log($"[플레이어] 플레이어가 몬스터에게 {Damage} 만큼 데미지 줌");
}
}디버그 색을 바꾸는 방법
// <컬러> 말 </컬러>
Debug.Log("<color=yellow>Manager Scene Load Complete.</color>");애니메이션 커브를 사용해서 점프를 구현

- 벽 점프가 내려올 때 너무 어색하다는 문제가 있었음
- 한참 고민하다가 팀원분이 애니메이션 커브를 쓰는 방법을 알려주심
public override void LogicUpdate(PlayerController controller)
{
animRunningTime += Time.deltaTime;
t = animRunningTime / wallJumpAnimationLength;
float x = startPos.x + controller.Move.jumpXCurve.Evaluate(t) * wallJumpDirection * wallJumpMoveX;
float y = startPos.y + controller.Move.jumpYCurve.Evaluate(t) * wallJumpMoveY;
controller.transform.position = new Vector2(x, y);
if (t >= 1f)
{
if (controller.Move.isGrounded)
{
controller.ChangeState<IdleState>();
return;
}
else
{
controller.ChangeState<FallState>();
return;
}
}- 문제가 있다면 물리법칙 써서 올리는게 아니라는점..? 그래도 훨씬 자연스러워보임