2025년, 코딩은 선택이 아닌 필수!

2025년 모든 학교에서 코딩이 시작 됩니다. 먼저 준비하는 사람만이 기술을 선도해 갑니다~

응용프로그래밍/유니티기초

[유니티기초]1-05. 프레임에 따라 update 되는 속도가 다른 것을 어느 컴퓨터에서나 동일한 속도를 보장 하는 deltaTime

파아란기쁨1 2022. 5. 30. 10:34
반응형
목표

스크립트의 update() 는 화면 처리속도에 따라 다른 속도로 처리 되는 것을 확인하고 이것을 동일한 속도로 처리 할 수 있는 deltaTime 을 활용하는 방법을 알아 보자.

 

 

이론

스크립트의 Update는 컴퓨터의 프레임에 따라 반복 되는 횟수가 다릅니다.

가령 초당 프레임이 30FPS 인 컴퓨터와 60FPS 인 컴퓨터가 있다면 update 에서 총알이 한번 방문할때 10m 씩 날아 간다면 초당 프레임이 30FPS인 컴퓨터에서는 초당 30m 를 날아가게 되고 60FPS인 컴퓨터는 60m를 날아가게 됩니다.

 

 

이렇게 프레임 속도에 따라 동작이 달라진다면 문제가 있을것 같네요.

 

오늘은 deltaTime 을 이용해서 속도를 보정하는 방법을 알아 보겠습니다.

 

실습

 

프로젝트는 https://thinkmath2020.tistory.com/3410

 

[유니티 기초] 오브젝트를 키보드로 이동 시켜 보자.

https://thinkmath2020.tistory.com/3408 Plane 클릭 해서 객체 생성 2. 점프 할 큐브 생성 - 하이라키에서 + 기호 눌러" data-og-host="thinkmath2020.tistory.com" data-og-source-url="https://thinkmath2020.t..

thinkmath2020.tistory.com

이것을 이용해서 키보드 동작을 1초에 한번씩만 동작하는 코드로 만들어 보겠습니다.

 

Time.deltaTime 은 전 프레임이 완료되기 까지 걸린 시간을 의미합니다.

즉 30FPS 는 한프레임이 1/30, 60FPS 는 한프레임이 1/60 이라는 값을 나타내는 것입니다.

따라서 Update 가 동작 할때 마다 Time.deltaTime 을 누적한다면 1초에 1의 값이 되는 것입니다.

 

Jump 스크립트를 다음과 같이 변경하여 1초에 한번씩만 키보드가 동작 할 수 있도록 처리 합니다.

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

public class Jump : MonoBehaviour
{
    Rigidbody rb; //Rigidbody 를 연결할 변수 선언
    public float speed = 300f; // 이동 속도
    float timer = 0;
    // Start is called before the first frame update
    void Start()
    {
        rb = GetComponent<Rigidbody>();  //자신의 Rigidbody 를 가져와서 rb에 연결
        //rb.AddForce(0,500,0); // y 축으로 500 만큼 점프하자.
        
    }

    // Update is called once per frame
    void Update()
    {
        timer += Time.deltaTime;
        if(timer<1) return; //1초가 되기 전이라면 빠져 나가자 
        timer=0;
        if(Input.GetKey(KeyCode.UpArrow)){
            rb.AddForce(0f,0f,speed);
        }
        if(Input.GetKey(KeyCode.DownArrow)){
            rb.AddForce(0f,0f,-speed);
        }
        if(Input.GetKey(KeyCode.LeftArrow)){
            rb.AddForce(-speed,0f,0f);
        }
        if(Input.GetKey(KeyCode.RightArrow)){
            rb.AddForce(speed,0f,0f);
        }
        if(Input.GetKey(KeyCode.Space)){
            rb.AddForce(0f,speed,0f);
        }
        
    }
}

 

 

 

 

반응형