2D게임에서 왼쪽 오른쪽으로 방향전환을 해야할 때가 있다.

 

이 때 unity는 spriter renderer 컴포넌트로 Flip 유무를 체크해줄 수가 있다.

 using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.InputSystem;

public class Player : MonoBehaviour
{
    public Vector2 inputVec;

    Rigidbody2D rigid;
    SpriteRenderer spriter;

    public float speed;
    // Start is called before the first frame update
    void Awake()
    {
        rigid = GetComponent<Rigidbody2D>();
        spriter = GetComponent<SpriteRenderer>();
    }

    // Update is called once per frame
    void Update()
    {
        

    }

    private void FixedUpdate()
    {
        /*        // 1.  힘을 준다
                rigid.AddForce(inputVec);

                // 2. 속도 제어
                rigid.velocity = inputVec;
        */
        // 3. 위치 이동
        Vector2 next = inputVec * speed * Time.fixedDeltaTime;
        print(speed);
        print(next);
        
        rigid.MovePosition(rigid.position + next);
    }

    private void LateUpdate()
    {
        if(inputVec.x != 0)
        {
            spriter.flipX = inputVec.x < 0;
        }
    }

    void OnMove(InputValue value)
    {
        inputVec = value.Get<Vector2>();
    }
 
}

SpriteRenderer 컴포넌트를 가져온 뒤 해당 컴포넌트의 Flip 요소를 가지고 와서 X값에 체크박스릃 오른족 왼쪽 여부에 따라 true false로 바꿔주면 된다.

 

애니메이션을 넣는 방법은 3D보다 2D가 훨씬 간단하다.

 

sprite가 없다면 이것도 굉장히 어려운 작업이긴 하겠지만...

 

 

이런식으로 필요한 스프라이트들을 다중선택한 뒤 적용하고 싶은 Object에 넣어주면 해당 오브젝트가 애니메이션을 가지게 된다.

 

애니메이션을 만들면 이렇게 애니메이터가 자동으로 생성되고 이것들을 조합해서 애니메이션을 만들 수 있다.

 

특정 포인트에서 특정 애니메이션을 실행시킬 수 있는데

 

에를들어 InputVec의 x, y값이 0이면 stand (default값으로 설정도 가능)

 

값이 있으면 특정 애니메이션 이런식으로!

 

왼쪽의 Parameter에 변수들을 생성할 수 있는데 이것들은 C# 스크립트에서 Animator 컴포넌트를 가져와서 조절해줄 수가 있다

 

float값은 SetFloat("변수명", 값) 으로 수정이 가능하다.

 

이 변수값에 따라 애니메이션을 작동시킨다면 예를 들어, Speed 값을 넣어서 speed가 0.1 이상일 경우 작동을 하게 한다면

오른쪽의 컨디션에 Parameter값을 넣어 조절을 해주고 

 

 using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.InputSystem;

public class Player : MonoBehaviour
{
    public Vector2 inputVec;

    Rigidbody2D rigid;
    SpriteRenderer spriter;
    Animator anim;

    public float speed;
    // Start is called before the first frame update
    void Awake()
    {
        rigid = GetComponent<Rigidbody2D>();
        spriter = GetComponent<SpriteRenderer>();
        anim = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {
        

    }

    private void FixedUpdate()
    {
        /*        // 1.  힘을 준다
                rigid.AddForce(inputVec);

                // 2. 속도 제어
                rigid.velocity = inputVec;
        */
        // 3. 위치 이동
        Vector2 next = inputVec * speed * Time.fixedDeltaTime;
        print(speed);
        print(next);
        
        rigid.MovePosition(rigid.position + next);
    }

    private void LateUpdate()
    {
        anim.SetFloat("Speed", inputVec.magnitude);
        
        if(inputVec.x != 0)
        {

            spriter.flipX = inputVec.x < 0;
        }
    }

    void OnMove(InputValue value)
    {
        inputVec = value.Get<Vector2>();
    }
 
}

다음과 같이 SetFloat로 Speed값을 벡터의 크기값 magnitude로 넣어주면 이제 Input값이 생길 때마다 걷는 애니메이션이 작동하게 될 것이다.

 

그리고 이런 Parameter와 Trigger 같은 애니메이션 요소들은 오버라이드가 가능하므로 다른 Sprite들을 묶어 애니메이션으로 만든 뒤 오버라이드 시키면 다른 오브젝트에도 같은 애니메이션을 적용할 수가 있다

+ Recent posts