본문 바로가기
Unity/2D

[Unity] 2D게임 만들기 #3-2_ 플레이어 이동과 애니메이션 순환/ 애니메이터 이용해서 플레이어 멈추고 걷기 구현

by Meaning_ 2021. 9. 6.
728x90
반응형

플레이어 방향전환 


Sprite Renderer의 Flip 옵션을 이용해서 오른쪽 방향키를 누르면 플레이어가 오른쪽을 향하게, 왼쪽 방향키를 누르면 왼쪽으로 향하게 해줄 것이다. 

cf) Flip : 스프라이트 뒤집는 옵션 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class PlayerMove : MonoBehaviour
{
    public float maxSpeed;
    Rigidbody2D rigid;
    SpriteRenderer spriteRenderer;
    void Awake()
    {
        rigid = GetComponent<Rigidbody2D>();
        rigid.freezeRotation = true;
        spriteRenderer = GetComponent < SpriteRenderer >();
    }
 
    // 키보드에서 손을 뗐을 때 완전 stop -->멈출 때 속도 
    private void Update() //즉각적인 키 입력 ,단발적인 키 입력
    {
        if (Input.GetButtonUp("Horizontal"))//버튼에서 손 뗏을 때 
        {
 
            rigid.velocity = new Vector2(rigid.velocity.normalized.x * 0.5f, rigid.velocity.y);
        }
        //방향 전환
        if (Input.GetButtonDown("Horizontal"))
        {
            //기본값은 false
            spriteRenderer.flipX = (Input.GetAxisRaw("Horizontal"== -1);
        }
        
    }
    //일반 속도 
    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);//y값을 0으로 잡으면 공중에서 멈춰버림
        }else if (rigid.velocity.x < maxSpeed*(-1))//왼쪽
        {
            rigid.velocity = new Vector2(maxSpeed*(-1), rigid.velocity.y);
        }
    }
}
cs

 

사실상 26~30번째 줄이 추가 되었다고 보면된다.

 

if (Input.GetButtonDown("Horizontal"))

수평으로 움직이려면 "Horizontal"을 받아오고, 수직으로 움직이려면 "Vertical"을 받아오면된다!

 

spriteRenderer.flipX = (Input.GetAxisRaw("Horizontal"== -1);

-1은 뭐지? 했는데 수평으로 값을 받아와서 이게 -1이면 뒤집어준다는 것이였다.그래서 1도 넣어봤는데 1을 넣어도 뒤집어지는데 키보드 키를 누른것과 반대로 뒤집어 졌다 ㅋㅋ

 

 

애니메이션을 통해 멈추고 걷기 구현 


Transition : 애니메이션 상태를 옮겨가는 통로 

 

Parameters : 애니메이터 매개변수로 상태 바꿀 때 필요한 변수이다. 

예를들어 idle에서 walk으로 이동할 때 필요한 매개변수라고 보면된다. 

내가 이해한 파라미터는 transition을 켜줄지, 꺼줄지 결정하는 버튼 같은 것으로 이해했다.

 

bool 타입의 isWalk 변수를 만들어줬다.

 

idle에서 walk로 가는 것이기 때문에 파라미터의 condition을 true로 맞춰준다.

 

Has Exit Time: 애니메이션이 끝날 때까지 상태를 유지 , 다음 state로 넘기지 않겠다는 것.

--> 보통 잘 안씀

 

2D 애니메이션 정리 : Has Exit Time 끄기, 겹구간 닫기, 매개변수 설정 

 

walk에서 idle로 가는 쪽도 만들어준다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public class PlayerMove : MonoBehaviour
{
    public float maxSpeed;
    Rigidbody2D rigid;
    SpriteRenderer spriteRenderer;
    Animator anim;
    void Awake()
    {
        rigid = GetComponent<Rigidbody2D>();
        rigid.freezeRotation = true;
        spriteRenderer = GetComponent < SpriteRenderer >();
        anim = GetComponent<Animator>();
    }
 
    // 키보드에서 손을 뗐을 때 완전 stop -->멈출 때 속도 
    private void Update() //즉각적인 키 입력 ,단발적인 키 입력
    {
        if (Input.GetButtonUp("Horizontal"))//버튼에서 손 뗏을 때 
        {
 
            rigid.velocity = new Vector2(rigid.velocity.normalized.x * 0.5f, rigid.velocity.y);
        }
        //방향 전환
        if (Input.GetButtonDown("Horizontal"))
        {
            //기본값은 false
            spriteRenderer.flipX = Input.GetAxisRaw("Horizontal"== -1;
        }
 
        //애니메이션
 
        if (rigid.velocity.normalized.x == 0)
        {
            //횡 이동 단위 값이 0 (즉 멈춘거)
            anim.SetBool("isWalk"false);
 
        }
        else
        {
            anim.SetBool("isWalk"true);
        }
        
    }
cs

 

앞이랑 달라진 점은

Animator 변수하나 만들어주고, 멈췄을 때 isWalk 매개변수를 꺼주고 걸을 때 isWalk 매개변수를 켜주면된다.

32번째 줄부터 41번째 줄을 보면된다. 

 

가만히 있으면

걷는 상태면

rigid.velocity.normalized.x == 0

--> 이걸 쓰면 갑자기 멈추는듯한 느낌이 들어서 부드럽게 멈추게 하기 위해 

rigid.velocity.x 가 0.3보다 작을 때 멈추게 하는 것으로 만들어볼 것이다.

그러면 0.3,-0.3모두 신경써야 하므로 c#의 수학 라이브러리인 Mathf에서 절대값을 이용할 것이다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
//애니메이션
 
        if (Mathf.Abs(rigid.velocity.x )<0.3)
        {
            //횡 이동 단위 값이 0 (즉 멈춘거)
            anim.SetBool("isWalk"false);
 
        }
        else
        {
            anim.SetBool("isWalk"true);
        }
        
cs
728x90
반응형

댓글