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로 설정
            }
        }

 참고 영상 : https://youtu.be/2SikOdH7xvQ?feature=shared

728x90