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정도 하니 움직입니다.
--------------