
오늘 학습 키워드
최종 팀 프로젝트
오늘 학습 한 내용을 나만의 언어로 정리하기
섬단 만들기
첫 번째 목표 : 애니메이션 넣기
- 성공!
두 번째 목표 : 마우스를 바라보도록 회전하기

- 플레이어가 마우스를 바라보는 벡터를 생성
- 그 벡터의 각도를 구함 (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
- 문제&에러에 대한 정의
애니메이터 안에 있는 애니메이션을 못찾았음
- 해결 방법
애니메이터 안에서 클립이 빠져있었음.