Unity Chapter 4-4. 소코반 게임 만들기 : 회전과 시간 간격
Categories: Unity Lesson 1
Tags: Unity Game Engine
인프런에 있는 이제민님의 레트로의 유니티 C# 게임 프로그래밍 에센스 강의를 듣고 정리한 필기입니다. 😀
🌜 [레트로의 유니티 C# 게임 프로그래밍 에센스] 강의 들으러 가기!
Chapter 4. 소코반 게임 만들기 : 회전과 시간 간격
오브젝트 계속 회전 시키기
EndPoint
오브젝트를 게임 내내 뺑글뺑글 돌게 하고 싶다. 새로운 c# 스크립트를 만들어 EndPoint에 붙여서 계속해서 회전하게 해보자. 스크립트 이름은 Rotator로 해서 생성해주기.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Rotator : MonoBehaviour
{
public Transform myTransform;
void Start()
{
myTransform.Rotate(60, 60, 60);
}
void Update()
{
}
}
public Transform myTransform;
- public이므로 유니티에서 슬롯이 열린다. 이 스크립트를 붙일 오브젝트의
Transform
컴포넌트를 슬롯에 넣어주자 - rotation값을 만질 것이기 때문에 Transform 컴포넌트를 가져왔다.
- public이므로 유니티에서 슬롯이 열린다. 이 스크립트를 붙일 오브젝트의
- Start()
myTransform.Rotate(60, 60, 60); }
- Rotate 함수는 x, y, z축 방향으로 각각 매개변수로 들어온 값만큼 회전시킨다.
- Start 안에 구현했으므로 게임이 시작 될 때 오브젝트를 60, 60, 60도로 회전시킨다. (rotation 값을 이렇게 초기화.)
- 스크립트를 EndPoint 오브젝트에 붙여준다.
- EndPoint 오브젝트의 Inspector창의 유니티
myTransform 슬롯
에 현재 EndPoint에 붙어있는 Transform 컴포넌트를 드래그 앤 드롭하여 넣어준다.
transform
Transform myTransform
하고 변수 선언을 해준 후 myTransform.Rotate()
이런식으로 쓰는 일반적인 방법도 있긴 하지만 Transform 컴포넌트는 모든 오브젝트들이 디폴트로 갖고 있는 컴포넌트기 때문에 그냥 변수 선언 없이 transform
소문자 transform으로 바로 사용하는게 가능하다. transform.Rotate()
이렇게. transform만 적어주면 나 자신의 Transform 컴포넌트를 바로 찾아준다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Rotator : MonoBehaviour
{
void Start()
{
transform.Rotate(60, 60, 60);
}
void Update()
{
}
}
계속 회전하게 하고 싶으므로 update()안에 구현하자.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Rotator : MonoBehaviour
{
void Start()
{
}
void Update()
{
transform.Rotate(60, 60, 60);
}
}
그러나 이렇게 하면 update함수는 매 프레임마다 실행되기 때문에 매 프레임마다 60도씩 돌게 되고 따라서 엄청! 미친듯이! 빨리 돌게 되는 문제가 발생한다. 1초에 60프레임이라면 1초에 3600도 도는 셈..😱 따라서 시간 간격을 고려해주어야 한다.
시간 간격 고려하기
- Update 함수는 한 프레임당, 즉 화면이 한번 깜빡일 때마다 실행된다.
- 1초에 몇번 깜빡일지는 개인 컴퓨터 사양에 따라 다르다. 1초에 30번 깜빡이는 컴퓨터도 있고 사양이 좋아서 1초에 60번 깜빡이는 컴퓨터도 있고…
- 30 프레임 컴퓨터에서 오브젝트로 하여금 1초 마다 1m를 움직이게 하고 싶다면
1/30
을 곱해주면 된다. - 60 프레임 컴퓨터에서 오브젝트로 하여금 1초 마다 1m 를 움직이게 하고 싶다면
1/60
을 곱해주면 된다.
- 30 프레임 컴퓨터에서 오브젝트로 하여금 1초 마다 1m를 움직이게 하고 싶다면
- 즉 시간 간격을 고려하여 매 프레임마다
1/프레임
을 곱해주면 된다.- 이
1/프레임
을 유니티 자체에서 지원해준다. - Time.deltaTime
- UnityEngine에서 지원하는 변수.
- 우리집 컴퓨터가 60프레임이면
1/60
. - update같이 매 프레임마다 실행되는 함수 안에서 시간 간격을 고려하여 곱해준다.
- 1초에 3m 가게 움직이고 싶은데 1초에 60번 깜빡이는 60프레임 컴퓨터라면 update함수 내에서
3m * Time.deltaTime
해주면 된다. - 매 프레임마다
3m * Time.deltaTime
씩 움직여 최종적으로 1초에 3m 움직이게 되는 것.
- 1초에 3m 가게 움직이고 싶은데 1초에 60번 깜빡이는 60프레임 컴퓨터라면 update함수 내에서
- 이
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Rotator : MonoBehaviour
{
void Start()
{
}
void Update()
{
transform.Rotate(60 * Time.deltaTime, 60 * Time.deltaTime, 60 * Time.deltaTime);
}
}
이제 EndPoint 오브젝트는 1프레임 당 60도가 아닌, 1초에 60도로 돌아가게 될 것이다.
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
Leave a comment