유튜브 27 - https://youtu.be/KRDe3X9VfR0
자, 오늘은 지난 시간에 배운 Time.deltaTime을 이용하여 캐릭터를 fps와 상관없이 일정하게 움직이는 방법을 살펴보겠습니다.

일단 참고하시고요^^
https://docs.unity3d.com/kr/current/Manual/TimeFrameManagement.html

지난 시간에 배운 Time.deltaTime을 그림으로 표현해본 것입니다. deltaTime이란 마지막 프레임 이후의 완료 시간(초)을 의미한다고 했습니다. 그림과 같이 유니티에서는 게임의 프레임 속도가 일정하지 않으며, Update 함수 콜 사이의 시간 간격이 일정하지 않습니다.

이러한 기본적인 사항을 바탕으로 캐릭터가 움직이는 것을 생각해 봅니다. 예를 들어 1초당 2프레임을 재생하는 경우 이동거리를 10이라고 가정하면 20만큼 이동합니다. 그러나 fps가 3일 경우 1초당 움직이는 거리는 30이 됩니다. 따라서 fps가 연산 등의 이유로 일정하지 않은 유니티 환경에서는 캐릭터의 움직임 속도가 일정하지 않게 됩니다. 이것을 해결할 방법은 다음과 같습니다. (사실.. 저도 처음에 이해되지 않았습니다. 책을 보아도, 구글링을 해보아도.. 뭐할까.. 잘 이해가 되지 않더군요. 그래서 스스로 그림을 그리고 나니.. 그제서야 이해가 되더군요)

1초에 재생하는 fps가 다를 경우 이동거리에 Time.deltaTime을 곱해주면 결론적으로 초당 움직이는 거리는 동일하게 됩니다.
이해가 되시나요? 전.. 처음에 이해가 안되다가.. 직접 그림을 그려보니.. 이해가 되더군요.^^ 유튜브 강의 들어보시고, 여러분도 한번 직접 그려보세요. 이해가 안되신다면^^

그래서 다음의 코드를 완성했습니다. 캐릭터가 일정하게 움직이도록이요. 사실 이전 코드와 큰 차이를 못 느낄수 있습니다. 하지만 이제 캐릭터는 fps와 상관없이 일정하게 움직입니다. 와우!! 이제 우리는 큰 산? 아니 적어도 중간 사이즈 정도 되는 산을 넘은 것 같습니다. 큰 협곡은 아니더라도 말이지요. 이제 앞으로 타이머도 달고, 충돌 검사도 하고, 어쩌고 저쩌고 하면… 간단한 게임이 완성될 듯 합니다. ^^
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
private float speed = 10.0f;
private Animator animator;
void Start()
{
animator = GetComponent<Animator>();
}
void Update(){
if(Input.GetAxisRaw("Horizontal") < 0 || Input.GetAxisRaw("Horizontal") > 0){
transform.Translate(Input.GetAxisRaw("Horizontal") * speed * Time.deltaTime, 0, 0);
transform.localScale = new Vector2(Input.GetAxisRaw("Horizontal"), 1);
animator.SetBool("RunStart", true);
} else if(Input.GetAxisRaw("Horizontal") == 0) {
animator.SetBool("RunStart", false);
}
if (Input.GetAxisRaw("Vertical") > 0 || Input.GetKey(KeyCode.Space)) {
transform.Translate(0, speed * Time.deltaTime, 0);
}
}
}

낙숫물이 바위를 뚫는다고 하죠…”수적석천(水適石穿)-물방울이 돌을 뚫는다” 검색하니 수적선천이라고 하네요. 우리의 매일 30분 공부는 작은 물방울인것 같습니다. 하지만 끊임없이 한다면… 쇼생크탈출의 작은 망치의 위력이 나타나지 않을까요^^ 모두 화이팅입니다. 오늘도 수고했습니다. 그럼 다음 시간에 만나요~ 안녕~

유튜브 27 - https://youtu.be/KRDe3X9VfR0
자, 오늘은 지난 시간에 배운 Time.deltaTime을 이용하여 캐릭터를 fps와 상관없이 일정하게 움직이는 방법을 살펴보겠습니다.
일단 참고하시고요^^
https://docs.unity3d.com/kr/current/Manual/TimeFrameManagement.html
지난 시간에 배운 Time.deltaTime을 그림으로 표현해본 것입니다. deltaTime이란 마지막 프레임 이후의 완료 시간(초)을 의미한다고 했습니다. 그림과 같이 유니티에서는 게임의 프레임 속도가 일정하지 않으며, Update 함수 콜 사이의 시간 간격이 일정하지 않습니다.
이러한 기본적인 사항을 바탕으로 캐릭터가 움직이는 것을 생각해 봅니다. 예를 들어 1초당 2프레임을 재생하는 경우 이동거리를 10이라고 가정하면 20만큼 이동합니다. 그러나 fps가 3일 경우 1초당 움직이는 거리는 30이 됩니다. 따라서 fps가 연산 등의 이유로 일정하지 않은 유니티 환경에서는 캐릭터의 움직임 속도가 일정하지 않게 됩니다. 이것을 해결할 방법은 다음과 같습니다. (사실.. 저도 처음에 이해되지 않았습니다. 책을 보아도, 구글링을 해보아도.. 뭐할까.. 잘 이해가 되지 않더군요. 그래서 스스로 그림을 그리고 나니.. 그제서야 이해가 되더군요)
1초에 재생하는 fps가 다를 경우 이동거리에 Time.deltaTime을 곱해주면 결론적으로 초당 움직이는 거리는 동일하게 됩니다.
이해가 되시나요? 전.. 처음에 이해가 안되다가.. 직접 그림을 그려보니.. 이해가 되더군요.^^ 유튜브 강의 들어보시고, 여러분도 한번 직접 그려보세요. 이해가 안되신다면^^
그래서 다음의 코드를 완성했습니다. 캐릭터가 일정하게 움직이도록이요. 사실 이전 코드와 큰 차이를 못 느낄수 있습니다. 하지만 이제 캐릭터는 fps와 상관없이 일정하게 움직입니다. 와우!! 이제 우리는 큰 산? 아니 적어도 중간 사이즈 정도 되는 산을 넘은 것 같습니다. 큰 협곡은 아니더라도 말이지요. 이제 앞으로 타이머도 달고, 충돌 검사도 하고, 어쩌고 저쩌고 하면… 간단한 게임이 완성될 듯 합니다. ^^
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
private float speed = 10.0f;
private Animator animator;
void Start()
{
animator = GetComponent<Animator>();
}
void Update(){
if(Input.GetAxisRaw("Horizontal") < 0 || Input.GetAxisRaw("Horizontal") > 0){
transform.Translate(Input.GetAxisRaw("Horizontal") * speed * Time.deltaTime, 0, 0);
transform.localScale = new Vector2(Input.GetAxisRaw("Horizontal"), 1);
animator.SetBool("RunStart", true);
} else if(Input.GetAxisRaw("Horizontal") == 0) {
animator.SetBool("RunStart", false);
}
if (Input.GetAxisRaw("Vertical") > 0 || Input.GetKey(KeyCode.Space)) {
transform.Translate(0, speed * Time.deltaTime, 0);
}
}
}
낙숫물이 바위를 뚫는다고 하죠…”수적석천(水適石穿)-물방울이 돌을 뚫는다” 검색하니 수적선천이라고 하네요. 우리의 매일 30분 공부는 작은 물방울인것 같습니다. 하지만 끊임없이 한다면… 쇼생크탈출의 작은 망치의 위력이 나타나지 않을까요^^ 모두 화이팅입니다. 오늘도 수고했습니다. 그럼 다음 시간에 만나요~ 안녕~