05-01 22:46
Notice
Recent Posts
Recent Comments
«   2025/05   »
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
Archives
Today
Total
관리 메뉴

(주) 망나니 힘집

[탑다운] 십자가 이동, 애니메이션 설정, 조사 액션 본문

유니티 최고/Unity Game Making

[탑다운] 십자가 이동, 애니메이션 설정, 조사 액션

군포망나니 2022. 1. 19. 16:05

이 글은 골드메탈님 수업을 듣고 작성하였습니다. 

* 십자가 이동 *

//대각선 이동을 막는 이동방법 

public class PlayerMove : MonoBehaviour
{
    float h;
    float v;

    bool isHorizonMove;
    bool isVerticalMove; 

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

    // Update is called once per frame
    void Update()
    {
        h = Input.GetAxisRaw("Horizontal");
        v = Input.GetAxisRaw("Vertical");

        //버튼 다운,업 확인하기 

        //GetButtonDown : 버튼을 눌렀을 때 

        //GetButtonUp : 버튼을 뗐을 때 
        bool hDown = Input.GetButtonDown("Horizontal");
        bool vDown = Input.GetButtonDown("Vertical");
        bool hUp = Input.GetButtonUp("Horizontal");
        bool vUp = Input.GetButtonUp("Vertical");

        //isHorizontal 체크하기 
        //버트 업으로도 수평이동 체크 가능
        if (hDown || vUp)
            isHorizonMove = true ;          
        else if (vDown || hUp)
            isHorizonMove = false;
    }
    void FixedUpdate()
    {
        //플래그 변수 하나로 수평, 수직 이동을 결정 
        // if 문과 ? 둘 다 가능 
        Vector2 moveVec = isHorizonMove ? new Vector2(h, 0) : new Vector2(0, v);
        rigid.velocity = moveVec * Speed;     
    }
}

 

* 탑다운 애니메이션 설정 * 

 

앞으로 걷는 모습, 뒤로 걷는 모습, 양 옆으로 걷는 모습들을 각각 분리지어 Player에게 애니메이션을 집어넣습니다. 

또한 옆으로 서서 멈춰있는 모습, 뒤로 서서 멈춰있는 모습 등도 같이 넣어줍니다. 

그 후 애니메이터[window] 를 엽니다. 

//Any State : 방향 전환이 바로 되도록 해준다.

Transition Duration = 0 으로 맞춰줍니다. 

Has Exit Time 체크 해제 해줍니다.  

그리고 Loop time 은 꼭 체크 해줍니다. 

 

이런식으로 상하좌우를 정해준다. 

hAxisRaw 와 vAxisRaw 를 정하여 상태에 -1 , 0 ,1 을 추가하여 준다. 

상하좌우 

 

오른쪽 walk -> hAxisRaw == 1 

왼쪽 walk -> hAxisRaw == -1

위 walk -> vAxisRaw == 1 

아래 walk -> vAxisRaw == -1 

Idel == 0 으로 설정한다. 

 

*스크립트*

//애니메이션 말고 애니메이터 선언!
Animator anim; 

//초기화

anim = GetComponent<Animator>();  

//애니메이션 
//int 를 썼기 때문에 Integer
//타입이 달라 형변환시킨다. 
anim.SetInteger("hAxisRaw", (int)h);
anim.SetInteger("vAxisRaw", (int)v);

 

* 주의 : Transition 을 연속적으로 태우면 애니메이션이 작동되지 않기 때문에 Transition 을 한번만 줘야 한다. 

-> 해결방법

 

        if(anim.GetInteger("hAxisRaw") != h)
            anim.SetInteger("hAxisRaw", (int)h);

        if (anim.GetInteger("vAxisRaw") != v)
            anim.SetInteger("vAxisRaw", (int)v);

이렇게 작성한 후 

animator 에 있는 Can Transition To 를 체크 해제해주면 된다. 

 

//주의 : 양쪽 버튼을 누르다가 한 쪽 버튼을 떼면 이동 문제가 발생.

-> 해결방법 : 현재 AxisRaw 값에 따라 수평, 수직 판단해서 해결한다. 

      

        if (hDown)
            isHorizonMove = true ;
        else if(vDown)
            isHorizonMove = false;
        else if (vDown || hUp)
            isHorizonMove = h != 0 ;

 -> 해결.

 

Q . 대각선도 이동하려면? 

isHorizontalMove 관련 부분만 제외하면 된다 !!

 

* 조사 액션 *

: player 앞에 존재하는 사물을 스캔하는 행동이다.       

☆Ray☆ 활용

 

//현재 바라보고 있는 방향 값을 가진 변수가 필요하기 때문에 변수를 하나 선언. 

Vector3 dirVec;

 

void Update(){

//방향

      //상

        if (vDown && v == 1)
            dirVec = Vector3.up;
        //하
        else if (vDown && v == -1)
            dirVec = Vector3.down;
        //좌 
        else if(hDown && h == -1)
            dirVec = Vector3.left;
        //우
        else if(hDown && h == 1)
            dirVec = Vector3.right; 

 

}

 

void FixedUpdate(){ 

        //Ray 
        //길이 : 0.7 
        //색 : 녹색
        Debug.DrawRay(rigid.position, dirVec *0.7f , new Color(0,1,0)); 

 

}

//ray  는 게임 화면에선 안 보이고 씬에서만 보인다. 

 

 //RayCast 작성 : 레이가 콜라이더에 충돌했는지 참/거짓으로 판단 
// player 콜라이더를 무시해야 한다. -> 레이어 추가 
//조사 가능한 오브젝트를 다른 Layer로 설정을 한다 (즉, npc , 사물 등)
RaycastHit2D rayHit = Physics2D.Raycast(rigid.position, dirVec, 0.7f, LayerMask.GetMask("object"));      

 

// 스캔이 되었다는 것을 저장하는 변수를 선언

GameObject scanObject; 

 

//감지      

//raycast 된 오브젝트를 변수로 저장하여 활용한다. 
void FixedUpdate(){ 

        if(rayHit.collider != null)
        {
            scanObject = rayHit.collider.gameObject; 
        }

        else
            scanObject = null;

}

 

void Update(){

 //오브젝트 스캔 출력 
        if (Input.GetButtonDown("Jump") && scanObject != null)
            Debug.Log("이것은" + scanObject.name + "입니다.");  

}

//주의 : 오브젝트에도 collider 컴포넌트가 있어야만 한다. 

 >>>이것은 [   ] 입니다.