유니티(Unity)/기본

유니티 개발 공부(5) 게임 오브젝트 움직이기

Whiny 2021. 4. 22. 15:07

이번 포스팅에서는 컴포넌트를 직접 만들어서, 게임 오브젝트를 움직여보겠습니다.

우선 프로젝트 창에서 마우스 우클릭으로 Create -> Folder로 Scripts라는 폴더를 Assets 폴더 아래 만들고,

Create -> C# Script로 MovingCube라는 스크립트를 Scripts폴더에 만듭니다.

 

전에 만들었던 큐브 오브젝트를 클릭하고, 인스펙터 창의 제일 아래에 Add Component 버튼으로 MovingCube스크립트를 추가해 봅시다.

 

스크립트를 프로젝트 창에서 드래그&드롭으로 추가 할수도 있습니다.


 

만들어진 MovingCube스크립트를 더블클릭하면, Visual studio가 켜지면서 편집(코딩)할 수 있게 됩니다.

 

※주의사항

유니티 에디터 상에서 보이는 스크립트의 이름편집기(ex. Visual studio)에서 보이는 클래스 이름은 같아야 합니다!!!

이름이 다를 경우, 에디터에서 스크립트를 제대로 인식하지 못합니다.

이름을 바꾸고 싶다면, 두 곳 모두 똑같이 바꿔주세요!!!

 

처음 생성된 코드는 다음과 같습니다.

 

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

public class MovingCube : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

처음이니 나눠서 살펴보자

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

미리 제공되는 기능을 들여오는 부분

 

public class MovingCube : MonoBehaviour

방금 만든 클래스 MovingCube(Monobehaviour은 자동으로 상속된다)

 

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

    // Update is called once per frame
    void Update()
    {
        
    }

오브젝트가 처음 활성화되었을 때 실행되는 Start, 매 프레임마다 호출되는 Update

 


이제 코드를 한번 수정해보겠습니다. (using문은 너무 길어지니 뺐습니다.)

 

public class MovingCube : MonoBehaviour
{
    public Vector3 StartPos;
    // Start is called before the first frame update
    void Start()
    {
        transform.position = StartPos;
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

이렇게 수정하면 어떻게 될까?

 

transform은 게임 오브젝트의 트랜스폼(위치, 회전, 스케일)정보가 있는 변수고,

position을 변경하는 코드를 추가했다.

 

하지만, 이 코드에서 새로 정의한 StartPos는 초기화 하지 않았는데, 유니티에서는 public으로 선언한 변수를 에디터 상에서 설정이 가능하다.

 

시각적으로 인스펙터 창에 내가 선언한 StartPos가 나타난다. (유니티의 큰 장점)

 

이제 내가 원하는 좌표를 입력하고,

 

에디터 중앙 상단의 플레이 버튼을 누르면 내가 지정한 위치로 큐브가 이동한 것을 볼수 있다.

 


이번에는 실시간으로 큐브를 회전 시켜보도록 하겠다.

public class MovingCube : MonoBehaviour
{
    public Vector3 StartPos;
    private Vector3 rotation;
    // Start is called before the first frame update
    void Start()
    {
        transform.position = StartPos;
    }

    // Update is called once per frame
    void Update()
    {
        rotation += new Vector3(1, 1, 1);
        transform.rotation = Quaternion.Euler(rotation);
    }
}

회전값을 저장해두는 rotation 변수를 선언하고, 매 프레임마다 호출되는 Update메서드 안에 x,y,z축으로 1도씩 회전시키는 코드가 완성되었다.

 

하지만 Update메서드는 매 프레임마다 호출되기 때문에 컴퓨터의 사양이나 환경에 따라 다른 결과를 보인다.

 


public class MovingCube : MonoBehaviour
{
    public Vector3 StartPos;
    private Vector3 rotation;
    // Start is called before the first frame update
    void Start()
    {
        transform.position = StartPos;
    }
    private void FixedUpdate()
    {
        rotation += new Vector3(1, 1, 1);
        transform.rotation = Quaternion.Euler(rotation);
    }
}

그래서 FixedUpdate를 사용한다. Fixed(고정)된 Update로 고정된 시간마다 호출되는 Update이다.

 

Project Settings -> Time -> Fixed Timestep 에서 시간을 정할수있다.(저는 기본 0.02초로 되어있습니다)

 

FixedUpdate는 특정 시간당 항상 같은 결과를 보여주기 위한 연산에서 사용한다.(이동,회전,등등)

 

다음 포스팅에서는 간단한 2D게임을 만들어보려고 합니다!!