오늘 학습 키워드

최종 팀 프로젝트

오늘 학습 한 내용을 나만의 언어로 정리하기

시네머신 기본

참고 자료 1
참고 자료 2

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;  
        }  
    }
  • 문제가 있다면 물리법칙 써서 올리는게 아니라는점..? 그래도 훨씬 자연스러워보임