이번 포스팅에서는 컴포넌트를 직접 만들어서, 게임 오브젝트를 움직여보겠습니다.
우선 프로젝트 창에서 마우스 우클릭으로 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게임을 만들어보려고 합니다!!
'유니티(Unity) > 기본' 카테고리의 다른 글
유니티 개발 공부(4) 컴포넌트, 동작 원리 (0) | 2021.04.20 |
---|---|
유니티 개발 공부(3) 컴포넌트 (0) | 2021.04.19 |
유니티 개발 공부(2) 유니티 인터페이스 (0) | 2021.04.18 |
유니티 개발 공부(1) 프로젝트 준비 (0) | 2021.04.18 |