1. 플레이어 이동 스크립트 생성
- Rigidbody와 AddForce 사용
- AddForce로 물리 기반 이동을 구현. 키 입력에 따라 힘을 가해 이동.
- 코드에서 rigid.AddForce(Vector2.right * move, ForceMode2D.Impulse); 부분에서 힘을 가하여 플레이어를 이동시킴.
- 기본 이동 문제점
- AddForce를 사용하면 가속도가 증가하는 문제가 발생할 수 있음. 이를 해결하기 위해 속도 제한을 설정.
- rigid.linearVelocity로 속도를 직접 제어하여 문제 해결.
2. 속도 제한 및 최대 속도 설정
- 속도 제한 논리
- maxspeed를 설정하여 속도가 초과하지 않도록 제한.
- 코드에서는 rigid.linearVelocity = new Vector2(maxspeed, rigid.linearVelocity.y); 로 최대 속도를 제한함.
- 반대방향도 처리하여 rigid.linearVelocity.x < maxspeed * (-1)으로 속도를 제한.
3. 좌우 방향 이동 및 속도 감소 처리
- 이동 방향 구현
- Input.GetAxisRaw("Horizontal")로 좌우 이동 처리.
- rigid.AddForce(Vector2.right * move, ForceMode2D.Impulse); 로 물리 기반 이동.
- 속도 감소 처리
- Input.GetButtonUp("Horizontal")을 사용하여 키를 뗐을 때 속도를 서서히 감소시킴.
- rigid.linearVelocity = new Vector2(rigid.linearVelocity.normalized.x * 0.5f, rigid.linearVelocity.y);로 서서히 속도를 줄여줌.
4. 키 입력 처리의 세분화
- FixedUpdate와 Update 사용 차이
- Update: 키 입력 처리. 입력을 받으면 rigid.AddForce()로 이동을 처리.
- FixedUpdate: 물리적 이동 처리. AddForce로 이동을 처리하지만 물리적 계산을 위한 최적화가 필요.
5. 이동 방향 벡터의 노멀화
- Normalize 활용
- rigid.linearVelocity.normalized.x를 사용하여 이동 방향을 정규화.
- linearVelocity로 속도를 설정할 때 방향 벡터의 크기가 1로 맞춰서 일정하게 속도를 유지.
6. 스프라이트 방향 전환
- SpriteRenderer의 FlipX
- Input.GetAxisRaw("Horizontal")을 이용하여 좌우 방향에 맞게 spriteRenderer.flipX로 스프라이트를 반전
spriterenderer.flipX = Input.GetAxisRaw("Horizontal") == -1;
7. 애니메이션 연결 및 상태 전환
- Animator 사용
- anim.SetBool("isWalking", true)와 anim.SetBool("isWalking", false)로 isWalking 상태에 따라 애니메이션 전환.
- 속도가 0일 때는 Idle 애니메이션, 일정 속도 이상일 때는 Walk 애니메이션을 실행
if (Mathf.Abs(rigid.linearVelocity.x) < 0.3f) anim.SetBool("isWalking", false); else anim.SetBool("isWalking", true);
추가적으로 알아두면 좋은 점
- 속도 감소 처리
- 키를 떼었을 때 서서히 감속하는 방법을 linearVelocity를 조정하는 방식으로 처리.
- 애니메이션 전환
- isWalking 값을 통해 애니메이션 상태를 전환.
- linearVelocity.x를 통해 이동 중인지 아닌지를 판별.