본문 바로가기

Unity

Unity(유니티) 정리: 01.이동

SFML로 게임을 만들어보려 했습니다만

게임개발 초보자가 간단히 개발하기에는 쉽지 않아서

Unity(유니티)로 잠시 눈을 돌렸습니다.

몇번을 찾아보게 되는 내용이라 정리를 하기로 했습니다.


기본설정

--------------

GameObejct >> 3D Object >> Plane

GameObejct >> 3D Object >> Cube

Cube가 기본적으로 Plane에 반이 파묻힌 상태이므로

Scale(Y:높이)1의 반을 Position(Y:위치상하) 0.5로 바꿔서 Plane위에 딱 놓이도록 했습니다.


카메라에 표시되는 화면을 조정합니다.

Main Camera선택한 상태에서 GameObejct >> Aling With View 를 선택하면 현재 Scene를 보고 있는 상태 그대로를 카메라가 표시합니다.


Assets >> Create >> Meterial

생성된 Meterial를 선택 Inspector:Main Maps:Albedo에서 색을 바꾼후 Cube에 드래그&드롭해서 Cube의 색을 바꿨습니다.


Assets >> Create >> C# Script

스트립트를 하나 만들어 Cube에 드래그&드롭해서 연결했습니다.

--------------


이동 처리

--------------

1.Transform.Translate이용

GameObject의 Transform(Position,Rotate,Scale)의 Position을 직접 Translate메서드를 이용해 이동시키는 방법입니다. 


https://docs.unity3d.com/ScriptReference/Transform.Translate.html


--------------

void Update ()

{

if (Input.GetKey(KeyCode.W))

{

transform.Translate(Vector3.forward * Time.deltaTime);

}

if (Input.GetKey(KeyCode.S))

{

transform.Translate(Vector3.back * Time.deltaTime);

}

if (Input.GetKey(KeyCode.A))

{

transform.Translate(Vector3.left * Time.deltaTime);

}

if (Input.GetKey(KeyCode.D))

{

transform.Translate(Vector3.right * Time.deltaTime);

}

}

print(Vector3.forward)로 Unity의 Console에서 확인한값입니다.

Vector3.forward →(0.0, 0.0, 1.0) z값의 1 증가

Vector3.back →(0.0, 0.0, -1.0) z값의 1 감소

Vector3.right →(1.0, 0.0, 0.0) x값의 1 증가

Vector3.left →(-1.0, 0.0, 0.0) x값의 1 감소

빠르게 이동시키고 싶은 경우에는 speed같은 변수를 하나 만들어 곱해주면 될것 같네요.

Time.deltaTime 은 마지막 프레임에 걸린시간, 게임에서 프레임 속도를 독립적으로 하고 싶은 경우 이용하라고 설명되어있습니다. 


https://docs.unity3d.com/ScriptReference/Time-deltaTime.html


컴퓨터 사양에 따라 (프레임별 처리속도가 다른경우) 고정으로 프레임당 처리를 하게되면 차이가 날 가능성이 있으니 시간당 처리 (사양에 맞게 조정) 하는 값으로 이해했습니다.

-------------- 


2.RigidBody.Velocity이용

GameObject에 물리적인 속도(RigidBody.Verocity)를 주어 이동하게 하는 방법입니다. 


https://docs.unity3d.com/ScriptReference/Rigidbody-velocity.html


우선 Cube를 선택한 상태에서

Component >> Physics >> Rigidbody 를 추가합니다.

--------------

private Rigidbody rb;

void Start ()

{

rb = GetComponent<Rigidbody>();

}

void Update ()

{

if (Input.GetKey(KeyCode.W))

{

//rb.velocity = new Vector3(0, 0, 1);

rb.velocity = Vector3.forward;

}

if (Input.GetKey(KeyCode.S))

{

rb.velocity = new Vector3(0, 0, -1);

}

if (Input.GetKey(KeyCode.A))

{

rb.velocity = new Vector3(-1, 0, 0);

}

if (Input.GetKey(KeyCode.D))

{

rb.velocity = new Vector3(1, 0, 0);

}

}

rb를 따로 선언하지 않고 GetComponent<Rigidbody>().verocity 식으로 이용가능합니다.

new Vector3(0, 0, 1) 직접 벡터 값을 주어도 되고 Vector3.forward를 이용해도 가능합니다.


(추기)

rigidbody를 이용한 처리는 물리시뮬레이션으로 이 경우는 Update()가 아닌 FixedUpdate()를 이용하라고 합니다. Update()는 매 프레임별 호출되고 FixedUpdate()는 매 물리처리에 호출됩니다.


https://unity3d.com/jp/learn/tutorials/topics/scripting/update-and-fixedupdate


그리고 작동을 해보면 Cube가 이동하면서 굴러가게 됩니다.

Cube에 추가한 Rigidbody의 Constraints:Freeze Rotation의 X,Z에 체크하면 구르지 않도록 할 수 있습니다.

--------------


3.RigidBody.AddForce이용

GameObject에 물리적인 힘(RigidBody.AddForce)를 주어 이동하게 하는 방법입니다. 


https://docs.unity3d.com/ScriptReference/Rigidbody.AddForce.html


--------------

private Rigidbody rb;

void Start ()

{

rb = GetComponent<Rigidbody>();

}

void Update ()

{

if (Input.GetKey(KeyCode.W))

{

//rb.AddForce(new Vector3(0, 0, 10));

rb.AddForce(Vector3.forward*10);

}

if (Input.GetKey(KeyCode.S))

{

rb.AddForce(new Vector3(0, 0, -10));

}

if (Input.GetKey(KeyCode.A))

{

rb.AddForce(new Vector3(-10, 0, 0));

}

if (Input.GetKey(KeyCode.D))

{

rb.AddForce(new Vector3(10, 0, 0));

}

}

new Vector3(0, 0, 10) 직접 벡터 값을 주어도 되고 Vector3.forward를 이용해도 가능했습니다.

힘의 값도 Vector3로 표현되나 봅니다. 1의 값으로는 미동도 없고 10정도 하니 움직입니다.

--------------


반응형