Unity 강의 정리 4-4장: 소코반 게임 만들기 - 오브젝트 회전 + 시간 간격🎮

나무에물주기·2023년 8월 15일
1

Unity

목록 보기
7/21
post-thumbnail

인프런에 있는 레트로의 유니티 C# 게임 프로그래밍 에센스 강의를 듣고 정리하는 글입니다!

이번 장에서는 EndPoint 객체를 회전시키는 기능을 만들면서, 오브젝트의 회전과 시간 간격에 대한 내용을 정리할 것이다.


1. 오브젝트의 지속적인 회전 구현 🔄

오브젝트를 회전시키려면 Unity에서 제공하는 회전 함수를 사용해야 한다. Transform 컴포넌트의 Rotate 메서드를 사용하면 특정 각도만큼 회전시킬 수 있다. 여기서는 EndPoint 객체를 회전시키는 예제를 살펴볼 것이다.

먼저, C# 스크립트를 생성하고 Rotator라는 이름을 지정한다. 그리고 다음과 같이 작성한다:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Rotator : MonoBehaviour
{
    public Transform myTransform; // Transform 컴포넌트 참조 변수

    void Start()
    {
        // 시작 시 60도씩 회전
        myTransform.Rotate(60, 60, 60);
    }

    void Update()
    {
        // 매 프레임마다의 로직은 여기에
    }
}

여기서 myTransform은 회전을 적용하려는 오브젝트의 Transform 컴포넌트를 참조하는 변수이다. Start 함수에서 Rotate 메서드를 호출하여 x, y, z 축에 대해 각각 60도 회전시킨다.


2. Transform 컴포넌트로 오브젝트 제어하기 🧩

모든 오브젝트가 Transform 컴포넌트를 디폴트로 갖고 있으므로, 변수 선언과 할당 없이 소문자 transform을 바로 사용하여 회전을 적용할 수 있다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Rotator : MonoBehaviour
{
    void Start()
    {
        // 소문자 transform을 사용하여 60도씩 회전
        transform.Rotate(60, 60, 60);
    }

    void Update()
    {
    
    }
}

소문자 transform을 사용하면 해당 스크립트가 붙어 있는 오브젝트의 Transform 컴포넌트에 바로 접근할 수 있다. 이를 통해 회전, 위치 이동, 크기 조절 등의 작업을 수행할 수 있다.


3. 연속적인 회전의 구현과 적용 🎡

게임에서는 종종 오브젝트를 계속 회전시켜야 하는 경우가 있다. 이를 위해 Update 함수 내에서 회전 로직을 구현하면 된다. 아래 예제에서는 매 프레임마다 오브젝트를 60도씩 회전시킨다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Rotator : MonoBehaviour
{
    void Start()
    {
    
    }

    void Update()
    {
        // 매 프레임마다 x, y, z축을 각각 60도씩 회전
        transform.Rotate(60, 60, 60);
    }
}

이러한 방식은 1초에 60도가 아닌, 1초에 3600번 돌게 되는 문제를 초래할 수 있다. 이 문제를 해결하기 위해서는 시간 간격을 고려해야 한다.


4. 프레임당 시간 간격을 고려한 구현 ⏲️

게임 개발에서 시간 간격은 중요한 역할을 한다. Unity의 Update 함수는 화면이 한 번 깜빡일 때마다 실행되는데, 이 깜빡임의 횟수는 컴퓨터의 성능에 따라 다르다. 예를 들어, 1초에 30번 또는 60번 깜빡일 수 있다.

이러한 프레임 속도의 차이는 오브젝트의 움직임에 영향을 미친다. 예를 들어, 오브젝트를 1초에 1m 움직이게 하고 싶다면, 30 프레임 컴퓨터에서는 매 프레임마다 ( frac{1}{30} )을 곱하고, 60 프레임 컴퓨터에서는 매 프레임마다 ( frac{1}{60} )을 곱해야 한다.

Unity는 이를 쉽게 처리하기 위해 Time.deltaTime 변수를 제공한다. 이 변수는 마지막 프레임을 완료하는 데 걸린 시간을 반환하므로, 특정 오브젝트가 1초에 3m 움직이게 하려면 3 * Time.deltaTime을 사용하면 된다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Rotator : MonoBehaviour
{
    void Start()
    {
    }

    void Update()
    {
        // 시간 간격을 고려하여 x, y, z축을 각각 60도씩 회전
        transform.Rotate(60 * Time.deltaTime, 60 * Time.deltaTime, 60 * Time.deltaTime);
    }
}

이 방식을 사용하면 다양한 컴퓨터 사양에서도 오브젝트의 움직임이 일관되게 유지된다. 프레임 속도와 독립적으로 움직임을 제어할 수 있어, 게임의 품질을 높이는 데 기여한다.


🎓 정리

이번 장에서는 오브젝트의 연속적인 회전을 다루었다. 회전을 적용하는 방법과 이를 매 프레임마다 연속적으로 적용하는 방법, 그리고 시간 간격을 고려하여 부드러운 움직임을 구현하는 방법을 배웠다.

profile
개인 공부를 정리함니다

0개의 댓글