본문 바로가기
개발/UNITY

Unity 2D Basic - 1

by 개발자 구리 2022. 4. 18.

게임 오브젝트의 이동

Vector3 구조체

게임의 2D/3D 공간에서 이동, 회전, 크기를 표현하기 위해 (x, y) 또는 (x, y, z)의 좌표 체계를 나타내는 단위.

1 단위의 방향, 두 점 사이의 거리, 각도 등의 연산을 위한 method를 제공한다. e.g., right, left, up, back, forward ...

private void Awake()
{
    // 새로운 위치 = 현재 위치 + (방향 * 속도)
    transform.position = transform.position + new Vector3(1, 0, 0) * 1;
    // transform.position += Vector3.right * 1;
}

Awake()는 한번만 호출되니, 2D 오브젝트를 계속해서 이동시키고 싶다면 Update() 함수를 호출하자.

Update()는 fps 수치에 따라 1초에 몇 번 호출될지 정해지므로, 위의 수식을 그대로 사용한다면

fps가 60인 컴퓨터에서는 1분간 60번 이동하고, fps가 120인 컴퓨터에서는 1분간 120번 이동하게 될텐데

이를 방지하기 위해 Time.deltaTime를 곱해준다.

 

* fps(frames per second) : 1초 동안 보여주는 화면의 수

 

전자의 Time.deltaTime 값은 1이고, 후자의 Time.deltaTime 값은 0.5이므로 이동하는 횟수가 같아진다.

private void Update()
{
    transform.position += Vector3.right * 1 * Time.deltaTime;
}

 

Input 클래스

유니티에서 제공하는 Input 클래스를 이용하여 PC(키보드, 마우스), 모바일(터치, 가속도센서, 자이로센서) 등의 입력 메소드, 마우스 좌표와 같은 각종 property 정보를 얻어올 수 있다.

아래 코드는 방향키를 이용해서 객체를 원하는 곳으로 이동하는 코드이고,

GetAxisRaw는 축의 정보를 string으로 입력받아 float을 반환한다.

    private float moveSpeed = 5.0f;
    private Vector3 moveDirection = Vector3.zero;

    private void Update()
    {
        float x = Input.GetAxisRaw("Horizontal");
        float y = Input.GetAxisRaw("Vertical");

        moveDirection = new Vector3(x, y, 0);

        transform.position += moveDirection * moveSpeed * Time.deltaTime;
    }

 

게임 오브젝트의 물리와 충돌

Rigidbody2D 컴포넌트

2차원 공간에서 오브젝트에 물리를 적용, 처리하는 컴포넌트이다.

질량 / 마찰력 / 중력 계수 / 회전 중 질량은 바로 적용되지만, 그 외에는 Collider2D 컴포넌트를 추가해서 설정해주어야 한다.

 

클래스 내부에 이동 관련 함수가 작동하고 있는데, 다만 초기의 속도(velocity) 값이 (방향: 0, 속력: 0)이어서 움직이지 않는다.

위에서 작성한 transform.position += 대신

Rigidbody2D에 있는 velocity 변수만 바꿔주면 Rigidbody2D에 의한 이동이 가능해진다.

    private float moveSpeed = 5.0f;
    private Rigidbody2D rigid2D;

    private void Awake()
    {
        rigid2D = GetComponent<Rigidbody2D>();
    }

    private void Update()
    {
        float x = Input.GetAxisRaw("Horizontal");
        float y = Input.GetAxisRaw("Vertical");

        // moveDirection = new Vector3(x, y, 0);
        // transform.position += moveDirection * moveSpeed * Time.deltaTime;

        rigid2D.velocity = new Vector3(x, y, 0) * moveSpeed;
    }

 

Collider2D 컴포넌트

2차원 공간에서 오브젝트의 충돌 범위를 나타내는 컴포넌트이다.

충돌 범위의 생김새나 특징에 따라 Box / Circle 등등 ~ Collider 2D와 같이 명명한다.

 

서로 다른 두 오브젝트가 충돌하게 하려면,

1. 두 오브젝트 모두 충돌 범위인 Collider2D 컴포넌트를 가지고 있어야 한다.

2. 둘 중 하나 이상의 오브젝트가 물리 처리를 담당하는 Rigidbody2D 컴포넌트를 가지고 있어야 한다.

 

OnCollision 이벤트

게임 내에서는 오브젝트가 단순히 충돌하고 끝나는게 아니라, 충돌한 후 호출되는 함수를 통해 다양한 기능을 추가할 수 있다.

OnCollisionEnter2D() : 두 오브젝트가 충돌하는 순간 1회 호출됨

OnCollisionStay2D() : 충돌 직후 맞닿아 있는 동안 매 프레임 호출

OnCollisionExit2D() : 두 오브젝트가 떨어져서 충돌이 종료되는 순간 1회 호출

 

이를 이용해서 짱구가 닿으면 벽의 색깔이 변하도록 해보았다.

    [SerializeField]
    private Color color;
    private SpriteRenderer spriteRenderer;

    private void Awake()
    {
        spriteRenderer = GetComponent<SpriteRenderer>();
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        spriteRenderer.color = color;
    }

    private void OnCollisionStay2D(Collision2D collision)
    {
        Debug.Log(gameObject.name + " : OnCollisionStay2D() 메소드 실행");
    }

    private void OnCollisionExit2D(Collision2D collision)
    {
        spriteRenderer.color = Color.white;
    }

[SerializeField]를 private Color color; 바로 윗줄에 선언했는데, 이를 통해 Inspector View에서 변수의 옵션을 조절할 수 있게 된다.

 

 

OnCollision과 다르게, 물리적인 충돌 없이 이벤트 함수가 호출될수도 있다.

OnTriggerEnter2D() : 두 오브젝트가 충돌하는 순간 1회 호출됨

OnTriggerStay2D() : 충돌 직후 맞닿아 있는 동안 매 프레임 호출

OnTriggerExit2D() : 두 오브젝트가 떨어져서 충돌이 종료되는 순간 1회 호출

'개발 > UNITY' 카테고리의 다른 글

Building System 만들기  (0) 2022.05.03
Unity 3D Basic - 1  (0) 2022.04.26
Unity 2D Basic - 2  (0) 2022.04.20
Unity Introduction  (0) 2022.04.18
유니티 깔짝거려보기  (0) 2022.04.08