오늘 학습 키워드

최종 팀 프로젝트

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

섬단 만들기

첫 번째 목표 : 애니메이션 넣기

  • 성공!

두 번째 목표 : 마우스를 바라보도록 회전하기

  • 플레이어가 마우스를 바라보는 벡터를 생성
  • 그 벡터의 각도를 구함 (Atan 사용)
  • 그리고 Rad2Deg 곱해줌

문제 : 왼쪽을 보고있으면 애가 반대로 뒤집혀버림

  • 각도를 구한걸 보니까 왼쪽이면 저렇게 90도가 넘게 나옴.

  • 해결!

세 번째 목표 : 이동하는 방법을 바꾸기

  • AddForce로 해놨는데 그러면 안되고 일종의 컴퍼스처럼 해야됨

  • 그래서 AddForce 대신 선형 보간 + MovePosition 사용
// SpecialAttackState.cs
public void Enter(PlayerController player)  
{  
    player.isLookLocked = false;  
    player.PlayerMove.ForceLook(CursorManager.Instance.mousePosition.x - player.transform.position.x < 0);  
    player.PlayerMove.rb.velocity = Vector2.zero;  
    player.PlayerAnimator.ClearTrigger();  
    player.PlayerAnimator.ClearInt();  
    player.PlayerAnimator.ClearBool();  
    player.Inputs.Player.Move.Disable();  
    animRunningTime = 0f;  
    attackAnimationLength =   
        player.PlayerAnimator.animator.runtimeAnimatorController  
            .animationClips.First(c => c.name == "SpecialAttack").length;  
    specialAttackDirection = (CursorManager.Instance.mousePosition - player.transform.position).normalized;  
    player.PlayerAnimator.SetTriggerAnimation(PlayerAnimID.SpecialAttack);  
      
    player.isLookLocked = true;  
      
    // 마우스 바라보는 방향으로 캐릭터 돌리기  
    // 1. 마우스를 바라보는 각도 구하기  
    cursorAngle = Mathf.Atan2(specialAttackDirection.y, specialAttackDirection.x) *  Mathf.Rad2Deg;  
      
    // 2. 그 각도대로 돌리기  
    if (specialAttackDirection.x > 0)  
    {  
        player.transform.rotation = Quaternion.Euler(0, 0, cursorAngle);  
    }  
    else  
    {  
        player.transform.rotation = Quaternion.Euler(0, 0, -180f+cursorAngle);  
    }  
      
    startPos = player.transform.position;  
    targetPos = startPos + (specialAttackDirection * specialAttackDistance);  
  
}
 
public void LogicUpdate(PlayerController player)  
{  
    animRunningTime += Time.deltaTime;  
    float t = animRunningTime / attackAnimationLength;  
  
    // 선형 보간하는 포지션을 만들어서 거기로 MovePosition    Vector2 newPos = Vector2.MoveTowards(startPos, targetPos, t * specialAttackSpeed);  
    player.PlayerMove.rb.MovePosition(newPos);  
    if (Vector2.Distance(newPos, targetPos) < 0.01f)  
    {  
        player.PlayerMove.rb.velocity = Vector2.zero;  
        if (player.PlayerMove.isGrounded) player.ChangeState<IdleState>();  
        else player.ChangeState<FallState>();  
        return;  
    }  
      
    if (Time.time - startStateTime > startAttackTime)  
    {  
        AnimatorStateInfo curAnimInfo = player.PlayerAnimator.animator.GetCurrentAnimatorStateInfo(0);  
  
        if (curAnimInfo.IsName("SpecialAttack"))  
        {   
            float animTime = curAnimInfo.normalizedTime;  
  
            if (animTime >= 1.0f)  
            {  
                if (player.PlayerMove.isGrounded) player.ChangeState<IdleState>();  
                else player.ChangeState<FallState>();  
                return;  
            }  
        }  
  
        if (animRunningTime >= attackAnimationLength)  
        {  
            if (player.PlayerMove.isGrounded) player.ChangeState<IdleState>();  
            else player.ChangeState<FallState>();  
            return;  
        }  
              
    }  
}

회피 만들기

  • 성공!

학습하며 겪었던 문제점 & 에러

문제 1

  • 문제&에러에 대한 정의

애니메이터 안에 있는 애니메이션을 못찾았음

  • 해결 방법

애니메이터 안에서 클립이 빠져있었음.

내일 학습 할 것은 무엇인지