🎮오브젝트 이동

⚙️회전

우선 캡슐 오브젝트를 Scene에 배치하고 이것을 회전 시켜보자.

오브젝트를 배치했으면 Project 탭에서 Assets 폴더 안에 Drive라는 C# 스크립트를 추가한다.(마우스 우클릭 -> Create -> C# Script)

오브젝트를 회전시키거나 이동 시키는 것은 Transform 컴포넌트와 관련이 있다.

그 중에서 오브젝트의 회전에 관련된 것은 Transform의 Rotation과 관련이 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Driver : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        transform.Rotate(0, 0, 0.1f);   // (x, y, z)
    }
}

스크립트를 저장하고 유니티 엔진으로 돌아와서 스크립트를 적용할 오브젝트를 선택한다.

스크립트 파일을 해당 오브젝트의 컴포넌트로 적용시키기 위해 스크립트 파일을 오브젝트의 Inspector 창에 드래그 앤 드랍 해준다.

프로젝트를 실행시키면 오브젝트가 z축 기준으로 0.1도 씩 매 프레임마다 회전하는 것을 확인할 수 있다.


⚙️이동

오브젝트의 회전에 관련된 것은 Transform의 Translate과 관련이 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Driver : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        transform.Rotate(0, 0, 0.1f);
        transform.Translate(0, 1, 0);
    }
}

스크립트를 저장하고 프로젝트를 실행시키면 매 프레임 마다 오브젝트가 y축으로 1만큼 이동하는 것을 확인할 수 있다.


⚙️필드 직렬화

필드 직렬화를 통해 유니티 Inspector에서 바로 변수 값을 조정할 수 있다.

Inspector에서 조정한 변수 값은 원래 있던 값을 덮어쓴다.(스크립트의 내용이 달라지는 것은 아니다.)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Driver : MonoBehaviour
{
    [SerializeField] float steerSpeed = 1f;
    [SerializeField] float moveSpeed = 0.1f;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        transform.Rotate(0, 0, steerSpeed);
        transform.Translate(0, moveSpeed, 0);
    }
}


⚙️사용자 입력

Edit - ProjectSettings - Input Manager로 이동.

Axes에서 Horizontal을 살펴보면 왼쪽, 오른쪽으로 움직이는 것과 관련된 것을 알 수 있다. 그리고 Vertical은 위 아래로 움직이는 것과 관련된 것을 알 수 있다.

이 방식은 string 참조를 위해 Axis의 정확한 이름을 알아야한다는 단점이 있다.

Horizontal과 Vertical은 -1에서 1까지의 값이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Driver : MonoBehaviour
{
    // 매 프레임마다 새롭게 계산할 필요 없이 플레이 시점의 값이 무엇인지만 알면 된다.
    [SerializeField] float steerSpeed = 1f;
    [SerializeField] float moveSpeed = 0.1f;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        // steerAmount는 매 프레임마다 새롭게 계산해야하기 때문에 Update() 메서드에 넣는다.
        float steerAmount = Input.GetAxis("Horizontal") * steerSpeed;
        float moveAmount = Input.GetAxis("Vertical") * moveSpeed;
        transform.Rotate(0, 0, -steerAmount);
        transform.Translate(0, moveAmount, 0);
    }
}


⚙️Time.deltaTime

유니티는 Time.deltaTime을 통해 각 프레임이 실행되는데 시간이 얼마나 소요되었는지 알려준다.

빠른 컴퓨터는 한 프레임을 화면에 그리는데 짧은 시간이 걸리고, 느린 컴퓨터에서는 더 오랜 시간이 걸릴 것이다.

느린 컴퓨터가 1초에 10 프레임을 그린다고 하면 한 프레임을 그리는데 걸리는 시간은 0.1초이다.

반면에 빠른 컴퓨터가 1초에 100 프레임을 그린다고 하면 한 프레임을 그리는데 걸리는 시간은 0.01초이다.

위의 방식대로 플레이어를 움직인다면 컴퓨터 성능에 따라 이동 속도가 달라질 수 있어 게임을 플레이할 때 불편할 수 있다. 따라서 컴퓨터의 성능에 관계없이 플레이어가 일정하게 움직이도록 조정해야할 필요가 있다.

매 프레임 마다 1 유니티 유닛만큼 움직이고 싶다면, 매 프레임 마다 갈 수 있는 거리에 한 프레임을 그리는데 걸리는 시간을 곱해주면 컴퓨터의 성능에 상관없이 동일한 값을 얻을 수 있다.(동일한 거리를 갈 수 있도록 할 수 있다.)

예를 들어, 매 프레임 마다 갈 수 있는 거리에 한 프레임 당 걸리는 시간을 곱하면 다음과 같다.

  • 느린 컴퓨터: 1 × 10 × 0.1 = 1

  • 빠른 컴퓨터: 1 × 100 × 0.01 = 1

이때 한 프레임 당 걸리는 시간에 해당하는 것이 Time.deltaTime이다.

1
2
3
4
5
6
7
8
void Update()
{
    // steerAmount는 매 프레임마다 새롭게 계산해야하기 때문에 Update() 메서드에 넣는다.
    float steerAmount = Input.GetAxis("Horizontal") * steerSpeed * Time.deltaTime;
    float moveAmount = Input.GetAxis("Vertical") * moveSpeed * Time.deltaTime;
    transform.Rotate(0, 0, -steerAmount);
    transform.Translate(0, moveAmount, 0);
}



Leave a comment