ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 물리엔진, 애니메이션, 씬 변환
    유니티/유니티 메인 2024. 2. 1. 01:25
    public class Playercontrol : MonoBehaviour
    {
        Rigidbody2D rigidbody;
        float jumpforce = 350f;
        float walkforce = 30f;
        float maxwalkspeed = 2f;
        // Start is called before the first frame update
        void Start()
        {
            this.rigidbody = GetComponent<Rigidbody2D>();
        }
    
        // Update is called once per frame
        void Update()
        {
            int key = 0 ;
            if(Input.GetKeyDown(KeyCode.Space))
            {
                this.rigidbody.AddForce(transform.up *  jumpforce);
            }     //2일차에 했었던 진도
    
            if(Input.GetKeyDown(KeyCode.LeftArrow)) key = -1;    // 왼쪽키를 누르면 방향을 뒤로
            if (Input.GetKeyDown(KeyCode.RightArrow)) key = 1;   // 오른쪽키를 누르면 방향을 앞으로
            float speedx = Mathf.Abs(this.rigidbody.velocity.x);
    
            if(speedx < this.maxwalkspeed) 
            {
                this.rigidbody.AddForce(transform.right * key * this.walkforce);  // 그리고 할당받은 방향에 따라 
                                                                                     walkforce와 곱하여 이동한다
            }
        }
    }

    2일차에 이어 이번엔 왼쪽, 오른쪽으로 이동하는것까지 구현하였다

    분명 velocity는 수업때 설명을 잘 들었는데도 다시 와서 코딩을 해보려니 뭐였는지 생각이 잘 나질 않는다

    우선 Mathf.Abs는 괄호안의 절대값을 추출하는 함수이다

     

     

    위의 사진을 보면 rb2D의 속도를 오른쪽으로 speed만큼 증가시켜준다는것까지는 똑같지만

    이름뒤에 붙는게 AddForce 대신 velocity가 붙는다면 가속도가 생기는 AddForce 대신 가속도 없이 일정한 속도로 이동한다는 것이다

     

    float walkforce = 30f;

    float maxwalkspeed = 2f;         

                      ......

                      ......

      float speedx = Mathf.Abs(this.rigidbody.velocity.x);     1. speedx는 rigidbody가 x축으로 향하는 속도의 절댓값이다

            if(speedx < this.maxwalkspeed)    2. 만약 이 속도가 maxspeed(2f)를 넘지 않는다면
            {
                this.rigidbody.AddForce(transform.right * key * this.walkforce); 3. rigidbody는 key의 방향에 따라 일정한 속도로 이동한다
            }

     

    이해하기 쉽게 코드를 한줄한줄 뜯어가며 보니 좀 더 이해하기 쉬워진다

    완벽하게 잘 이해한건지는 모르겠지만 나중에 이걸 다시 본다면 더 쉽게 알게될수도 있으니 일단 이정도로 만족하는걸로

     

    방향을 전환할때마다 모습을 반전시켜준다

    transform.localScale을 사용하여 Vector3의 첫번째 숫자만 key를 통해 변경 가능하다

     

    하지만 분명 이렇게 모습을 반전시키려면 x축이 아닌 y축으로 반전을 줘야 가능한데 

    왜 Vector3에서는 x축에 변화를 줘야 바뀌는건가 싶었다

     

    하지만 책을보니 x축 방향 배율에 변화를 주는것이라고 한다. 이게 무슨말인가 싶어

    코드를 바꿔 적용해보니

    대충 어떤 느낌인지 알것같다. 축을 반전시키기 보다는

    고양이라는 얇은 종이를 x방향으로 뒤집는 느낌처럼 생각하면 될것같다

     

    <애니메이션 만들기>

    애니메이션을 적용할 cat을 선택뒤 window에서 Animation-Animation을 선택

    create 클릭 후 이름 지정

    Add Property에서 sprite 선택

    프레임을 적절히 배치해준뒤 마지막 프레임에서 끊어주기

    public class Playercontrol : MonoBehaviour
    {
        Animator animator;
        Rigidbody2D rigidbody;
        float jumpforce = 350f;
        float walkforce = 100f;
        float maxwalkspeed = 2f;
        // Start is called before the first frame update
        void Start()
        {
            this.animator = GetComponent<Animator>();
            this.rigidbody = GetComponent<Rigidbody2D>();
        }

    애니메이터 컴포넌트 적용시키고

           if(key !=0 )
            {
                transform.localScale = new Vector3(key,1,1);
            }
    
            this.animator.speed = speedx / 2.0f;
        }

    이동속도를 2로 나눠준 속도로 애니메이션 빠르기 조절. 

     

    <씬 변환하기>

    고양이가 깃발에 닿는순간 충돌판정이 되어 클리어 씬으로 장면이 변환하기

    우선 깃발에도 박스 콜라이더를 추가해준뒤 Is Trigger를 체크해준다. 충돌판정을 위해 필요

    private void OnTriggerEnter2D(Collider2D collision)
        {
            //최초 충돌시 한번만 시전
            Debug.LogFormat("OntriggerEnter2D : {0}", collision);
        }
        private void OnTriggerStay2D(Collider2D other)
        {
            //충돌중일때 계속~
            Debug.LogFormat("OnTriggerStay2D : {0}", other);
    
        }
        private void OnTriggerExit2D(Collider2D other)
        {
            // 충돌에서 벗어날때 한번만
            Debug.LogFormat("OnTriggerExit2D : {0}", other);
        }

    충돌판정 방법은 크게 3가지이다

     

    물리엔진을 위한 충돌판정 조건은 2가지가 있는데
    1. 둘중 하나는 리지드바디 컴포넌트가 있어야한다
    2. 두 객체 모두 콜라이더가 있어야한다. 두 조건이 만족할시 충돌판정이 이루어진다

     

    scene을 새로 하나 만든뒤 이름을 지정하고 이미지를 붙여넣는다. 이러면 clearscene은 완성이다

     

    이제 남은건 2가지이다

    1. Gamescene에서 깃발에 닿는 순간 Clearscene으로 이동하기

    2. Clearscene에서 버튼을 클릭하는순간 다시 Gamescene으로 이동하기

     private void OnTriggerEnter2D(Collider2D other)
        {
            //최초 충돌시 한번만 시전
            Debug.LogFormat("OntriggerEnter2D : {0}", other);
            SceneManager.LoadScene("Clearscene");    //추가한 한줄
        }

     

    우선 부딫히는 순간 Clearscene으로 이동하는건 playercontrol에서 한줄만 추가하면 된다

     

    근데 여기까지 수정하고 나서 아무리 실행을 해봐도 깃발에 부딫히는 순간 Clearscene으로 넘어가질 않아

    뭐가 문제인건가 싶어 Console창을 확인해봤다

    다른건 다 빼고 build setting이라는 단어만 봐도 씬 등록을 안했다는게 생각이 났다

    build setting에 들어가 샘플씬은 빼준뒤 두 씬의 순서를 조정해준다.

    당연히 Gamescene이 먼저니 우선으로 지정해준다

    마지막은 클릭 한번으로 다시 Gamescene으로 돌아와야하기 때문에 Clearscene에 들어가

    ClearDirector라는 빈 폴더와 함께 같은 이름의 스크립트도 하나 만들어준다

    using UnityEngine.SceneManagement;
    
    public class ClearDirector : MonoBehaviour
    {
        void Update()
        {
            if(Input.GetMouseButtonDown(0))
            {
                SceneManager.LoadScene("Gamescene");
            }
        }
    }

    이것도 아까랑 비슷하게 버튼을 누르는순간 Gamescene으로 돌아가도록 설정해준다

    '유니티 > 유니티 메인' 카테고리의 다른 글

    Vector2 클래스, transform, GetMouseButtonDown  (0) 2024.02.03
    총정리 (용어정리)  (0) 2024.02.03
    물리엔진  (0) 2024.01.31
    프리팹, 충돌판정 복습 & 물리엔진  (1) 2024.01.31
    충돌판정, 프리팹  (1) 2024.01.29
Designed by Tistory.