[Unity2D] 2. 플레이어 이동 및 좌우반전(개선)

2024. 1. 28. 01:54·Unity 개발일지/[Unity2D]졸업프로젝트
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

'Unity 개발일지 > [Unity2D]졸업프로젝트' 카테고리의 다른 글

[Unity2D] 5. 광물 랜덤 생성  (1) 2024.01.29
[Unity2D] 4. 마우스 위치에 선택 박스 표시  (0) 2024.01.29
[Unity2D] 3. 랜덤 맵 생성하기  (1) 2024.01.28
[Unity2D] 1. 타일맵 타일맵 콜라이더  (1) 2024.01.28
[Unity 2D] 0. 시작  (0) 2024.01.25
'Unity 개발일지/[Unity2D]졸업프로젝트' 카테고리의 다른 글
  • [Unity2D] 4. 마우스 위치에 선택 박스 표시
  • [Unity2D] 3. 랜덤 맵 생성하기
  • [Unity2D] 1. 타일맵 타일맵 콜라이더
  • [Unity 2D] 0. 시작
knhoo
knhoo
  • knhoo
    &*
    knhoo
  • 전체
    오늘
    어제
    • 전체 (145)
      • Unity 개발일지 (20)
        • [Unity2D]졸업프로젝트 (17)
        • [Unity3D]VR프로젝트 (2)
      • 공부 (120)
        • 게임 수학 (1)
        • 부트캠프 (13)
        • C++ (39)
        • Unity & C# (8)
        • 데이터베이스 (2)
        • 컴퓨터비전 (0)
        • 컴퓨터구조 (0)
        • python (7)
        • BAEKJOON (39)
        • 개발 (2)
        • 자료구조 (9)
      • 일상 (2)
  • 블로그 메뉴

    • Github
    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • 📖README
  • 인기 글

  • 태그

    비트버니
    오블완
    unity2d
    패널파워
    자료구조
    unity
    c#
    til
    앱테크
    백준 #python
    멋쟁이사자처럼후기
    백준
    머니워크
    Cpp
    Python
    티스토리챌린지
    구간합
    C++
    야핏무브
    캐시워크
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
knhoo
[Unity2D] 2. 플레이어 이동 및 좌우반전(개선)
상단으로

티스토리툴바