[Go-Unity] 7. 플레이어 이동, 점프 ⭐⭐⭐
카테고리: Go Unity
Collider2D.Bounds, Layer, Gizmos, GetKey
고박사의 유니티 기초를 복습하면서 정리.
1. 플레이어
Component
- Rigidbody 2D : Freeze Z 확인
- Collider 2D
Script
- Movement 2d : 플레이어 이동, 점프
- Player Controller : 플레이어 점프
2. Movement2D.cs
Movement2D.cs
public class Movement2D : MonoBehaviour
{
//private Vector3 moveDirection = Vector3.zero;
[SerializeField]
private float moveSpeed = 3; //속도
[SerializeField]
private float junpForce = 8.0f; //점프 힘
[HideInInspector]
public bool isLongJump = false; //점프높이구분
[SerializeField]
private LayerMask groundLayer; //바닥 체크를 위한 충돌레이어
private CircleCollider2D circleCollider2D; //오브젝트의 충돌 범위 컴포넌트
private bool isGrounded; //바닥체크
private Vector3 footposition; //발의 위치
[SerializeField]
private int maxJumpCount = 2;
private int currentJumpCount= 0;
private Rigidbody2D rigid2D;
private void Awake() {
rigid2D = GetComponent<Rigidbody2D>();
circleCollider2D = GetComponent<CircleCollider2D>();
}
private void FixedUpdate() {
if(transform.position.y < -4){ // 낙하시 플레이어 불러오기
transform.position = new Vector3(0,0,0);
}
// ~~Collider2D.bounds : 오브젝트의 collider2d min, center, max 위치 정보
Bounds bounds = circleCollider2D.bounds;
// 플레이어의 발 위치 설정 X : 오브젝트의 중심, Y 오브젝트의 바닥
footposition = new Vector2(bounds.center.x, bounds.min.y);
// Physics2D.OverlapCircle(Position위치, raius크기, layer레이어)
// 플레이어의 발위치에 반지름만큼 보이지않는 원 충돌 범위 생성 ,
// 원이 레이어에 충돌하면 true, 아니면 false
isGrounded = Physics2D.OverlapCircle(footposition,0.1f, groundLayer);
// 땅에 있고, y축 속도가 0이하이면 점프 횟수 초기화
// velocity.y <= 0을 추가 하지 않으면 점프키를 누르는 순간에도 초기화가 되어
// 최대 점프 횟수를 2로 설정하면 3번까지 점프한다.
if (isGrounded ==true && rigid2D.velocity.y<=0)
{
currentJumpCount = maxJumpCount;
}
// 낮은 점프, 높은 점프 구현을 위한 중력 계수(gravityScale) 조절 (jump up일 때만 적용)
if ( isLongJump && rigid2D.velocity.y > 0) //높은점프
{
rigid2D.gravityScale = 1.0f; //isLongJump : True -> 중력 1.0
}else //낮은점프
{
rigid2D.gravityScale = 2.5f; //isLongJump : false -> 중력 2.5
}
}
public void Move(float x){
// x축은 속도, y축은 기존 속력 값(중력)
rigid2D.velocity = new Vector2(x*moveSpeed,rigid2D.velocity.y);
}
public void jump(){
if (currentJumpCount > 0)
{
// jump force의 크기만큼 위쪽 방향으로 속력 설정
rigid2D.velocity = Vector2.up * junpForce;
currentJumpCount --; //점프횟수 감소
}
}
//화면에 선이나 도형을 표시할 수 있다.
private void OnDrawGizmos() {
Gizmos.color = Color.blue;
Gizmos.DrawSphere(footposition, 0.1f);
}
}
- 플레이어의 이동, 점프에 관한 cs
- Playercontroller.cs에서 호출하여 사용
Bounds
Bounds bounds = circleCollider2D.bounds;
footposition = new Vector2(bounds.center.x, bounds.min.y);
- ~~Collider2D.bounds : 오브젝트의 collider2d min, center, max 위치 정보
- footposition => 플레이어의 발 위치 설정 X : 오브젝트의 중심, Y 오브젝트의 바닥
땅(Ground), 땅마찰력(Friction) ,점프횟수, 점프세기 Ground, LongJump
//#1
isGrounded = Physics2D.OverlapCircle(footposition,0.1f, groundLayer);
//#2
if (isGrounded ==true && rigid2D.velocity.y<=0){ // 땅에 있고, y축 속도가 0이하이면 점프 횟수 초기화
currentJumpCount = maxJumpCount;
}
//#3
//
if ( isLongJump && rigid2D.velocity.y > 0){ //높은점프
rigid2D.gravityScale = 1.0f; //isLongJump : True -> 중력 1.0
}else{ //낮은점프
rigid2D.gravityScale = 2.5f; //isLongJump : false -> 중력 2.5
}
- #1 - Physics2D.OverlapCircle(Position위치, raius크기, layer레이어)
- #1 - 플레이어의 발위치에 반지름만큼 보이지않는 원 충돌 범위 생성 , 원이 레이어에 충돌하면 true, 아니면 false
- #2 - velocity.y <= 0을 추가 하지 않으면 점프키를 누르는 순간에도 초기화가 되어 최대 점프 횟수를 2로 설정하면 3번까지 점프한다.
- #3 - 낮은 점프, 높은 점프 구현을 위한 중력 계수(gravityScale) 조절
-
Ground 레이어 설정
- 인스펙터뷰 Layer -> Add Layer 에 Ground 추가
- Ground로 사용되는 모든레이어를 Ground로 설정
-
Ground 마찰력 추가
- Project View 에 Physics Material 2D추가
- 설정 Friction - 0에 가까울수록 미끄럽다. Bounciness : 충돌할때 튕기는정도
- 생성한 physics Material을 적용할 오브젝트 collider 컴포넌트의 Material에 드래그엔 드랍
Move,Jump 함수 (기본 움직임, 점프)
//#1
public void Move(float x){
// x축은 속도, y축은 기존 속력 값(중력)
rigid2D.velocity = new Vector2(x*moveSpeed,rigid2D.velocity.y);
}
//#2
public void jump()
{
if (currentJumpCount > 0)
{
// jump force의 크기만큼 위쪽 방향으로 속력 설정
rigid2D.velocity = Vector2.up * junpForce;
currentJumpCount --; //점프횟수 감소
}
}
- #1 - Move 함수 : 플레이어의 기본 움직임
- #2 - Jump 함수 : 점프카운터가 0 이상이면 점프힘만큼 점프 2회가능
Gizmos
private void OnDrawGizmos() {
Gizmos.color = Color.blue;
Gizmos.DrawSphere(footposition, 0.1f); //바닥표시
}
- Gizmos : 화면에 선이나 도형을 표시할 수 있다.
- Gizmos.Draw~~~()
3. playercontroller.cs
playercontroller.cs
public class playercontroller : MonoBehaviour
{
private Movement2D movement2D;
private void Awake() {
movement2D = GetComponent<Movement2D>();
}
private void Update() {
float x = Input.GetAxisRaw("Horizontal"); //좌 우 이동
movement2D.Move(x); //movement2D클래스의 move함수 사용
if (Input.GetKeyDown(KeyCode.Space)){ //스페이스바 눌렀을 때
movement2D.jump(); //점프함수 호출
}
if (Input.GetKey(KeyCode.Space)){ //스페이스바 누르고 있을경우
movement2D.isLongJump = true; //롱점프 : true
}
else if (Input.GetKeyUp(KeyCode.Space)){ //스페이스바 눌렀다 땠을 때
movement2D.isLongJump = false; //롱점프 : false
}
}
}
- Awake() - movemoen2D 컴포넌트 호출
- Update() - 좌우이동, movemoen2D.Move 호출
- Getkey - 스페이스 누름에 따라 점프변화
Input 함수 GetKey, GetKeyDown, GetKeyUp
GetKey
: 해당 키를누르고 있을 경우
True 반환
GetKeyDown
: 해당 키를눌렀을 때
True 반환
GetKeyUp
: 해당 키를눌렀다 땟을때
True 반환
댓글남기기