Unity 개발일지/[Unity2D]졸업프로젝트
[Unity2D] 2. 플레이어 이동 및 좌우반전(개선)
knhoo
2024. 1. 28. 01:54
728x90
2023.09.28 플레이어 오브젝트 추가 및 동작 구현
Player 스크립트를 생성하여 코드를 작성해주었다.
1. 최초 코드
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
public Vector2 inputVec;
public float speed;
public float jumpPower;
Rigidbody2D rigid;
SpriteRenderer spriter;
Animator anim;
void Awake()
{
rigid = GetComponent<Rigidbody2D>();
spriter = GetComponent<SpriteRenderer>();
anim = GetComponent<Animator>();
}
void Update()
{
inputVec.x = Input.GetAxisRaw("Horizontal");//좌우이동
inputVec.y = Input.GetAxisRaw("Vertical");//수직이동
//점프 동작
if (Input.GetButtonDown("Jump"))
{
rigid.AddForce(Vector2.up * jumpPower, ForceMode2D.Impulse);
}
}
//플레이어 이동
void FixedUpdate()
{
Vector2 nextVec = inputVec.normalized * speed * Time.fixedDeltaTime;
rigid.MovePosition(rigid.position + nextVec);
}
//플레이어 좌우반전
void LateUpdate()
{
anim.SetFloat("Speed",inputVec.magnitude);
//속도에 의한 좌우반전
if (inputVec.x != 0)
{
spriter.flipX = inputVec.x > 0;
}
}
}
최초의 코드는 위와 같았으나, 플레이어의 좌우 반전이 원활하게 일어나지 않아서
아래와 같이 수정해주었다.
2. 좌우반전 방식 개선
이전 방식 : 속도로 좌우 방향 전환 감지
현재 방식 : 방향키 입력에 의한 방향 전환 감지
//플레이어 좌우 반전 코드
//좌/우 방향키를 누를 때 마다 플레이어 스프라이트가 좌우반전된다.
if (Input.GetKey(KeyCode.RightArrow) || Input.GetKey(KeyCode.D))
{
spriter.flipX = true;
}
else if (Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(KeyCode.A))
{
spriter.flipX = false;
}
좌우 이동 및 점프 코드도 바꿔주었다.
3. 좌우이동 방식 개선
이전 방식 : rigid.MovePosition을 사용
현재 방식 : rigid.AddForce을 사용 , 최대 속도 제한, 걷기 감지하여 애니메이션 실행
//stopspeed
if (Input.GetButtonUp("Horizontal"))
{
rigid.velocity = new Vector2(rigid.velocity.normalized.x * 0.5f, rigid.velocity.y);
}
//점프 코드
if (Input.GetKeyDown(KeyCode.Space))
{
rigid.AddForce(Vector3.up * jumpPower, ForceMode2D.Impulse);
}
//걷기 감지
if (Mathf.Abs(rigid.velocity.x) < 0.3)
anim.SetBool("isWalking", false);
else
anim.SetBool("isWalking", true);
void FixedUpdate()
{
//좌우 이동
float h = Input.GetAxisRaw("Horizontal");
rigid.AddForce(Vector2.right * h, ForceMode2D.Impulse);
//최대 속도 제한
if (rigid.velocity.x > maxSpeed)
rigid.velocity = new Vector2(maxSpeed, rigid.velocity.y);
else if (rigid.velocity.x < maxSpeed * (-1))
rigid.velocity = new Vector2(maxSpeed * (-1), rigid.velocity.y);
}
}
4. 무한 점프 방지 제한
이전 방식 : 무제한 점프 가능
현재 방식 : raycast로 바닥을 감지하여 공중에 떠 있을때에는 점프 제한
//////////////////////////////////////////////////
// void Update()
/////////////////////////////////////////////////
//isJumping이 false일때만 점프 가능
if (Input.GetKeyDown(KeyCode.Space) && !anim.GetBool("isJumping"))
{
rigid.AddForce(Vector3.up * jumpPower, ForceMode2D.Impulse);
anim.SetBool("isJumping", true); //점프하면 isJumping을 true로 설정
}
//////////////////////////////////////////////////
//fixedUpdate()
/////////////////////////////////////////////////
if(rigid.velocity.y < 0)
{
//아래 방향으로 ray 쏘기(?)
Debug.DrawRay(rigid.position, Vector3.down, new Color(0, 1, 0));
//"Ground"레이어와 충돌하는지 확인
// == 플레이어가 지면에 닿아있는지 확인
RaycastHit2D rayHit = Physics2D.Raycast(rigid.position, Vector3.down, 1, LayerMask.GetMask("Ground"));
if (rayHit.collider != null) //공중에 떠 있는것이 아니라면
{
if (rayHit.distance < 0.8f)
anim.SetBool("isJumping", false); //isJumping을 false로 설정
}
}
728x90