이번 포스팅 C# 스크립트를 사용하여 그동안 만들었던 PlayerObject를 이동하는 것을 보여드리도록 하겠습니다.
포스팅은 유니티 2D 게임 개발(게임 개발 프로그래밍)에 나온 예제로 진행합니다.
먼저 스크립트를 저장할 폴더를 Assets > Scripts 생성하였습니다.
Assets > Scripts > 마우스 오른쪽 클릭 > Create > C# Script를 선택하여 새로운 C# Script를 생성합니다.
새로만든 Script의 이름을 저는 MoveController 라고 정하였습니다.
MoveController 스크립트의 코드는 이렇게 하였습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MoveController : MonoBehaviour
{
public float movementSpeed = 3.0f;
Vector2 movement = new Vector2();
Rigidbody2D rigidbody2D;
void Start()
{
rigidbody2D = GetComponent<Rigidbody2D>();
}
void Update()
{
}
private void FixedUpdate()
{
movement.x = Input.GetAxisRaw("Horizontal");
movement.y = Input.GetAxisRaw("Vertical");
movement.Normalize();
rigidbody2D.velocity = movement * movementSpeed;
}
}
먼저 변수를 선언한 부분을 살펴 보겠습니다.
//1
public float movementSpeed = 3.0f;
//2
Vector2 movement = new Vector2();
//3
Rigidbody2D rigidbody2D;
1. 캐릭터가 움직이는 속력을 public으로 설정하였습니다.
스크립트를 PlayerObject의 컴포넌트에 추가하면 public으로 설정하였기 때문에 Inspector창에서 값을 조절할 수 있습니다.
2. Vector2는 2차원 벡터나 위치를 표현합니다. X축, Y축으로 이루어진 2D공간에서 Player의 위치를 표현합니다.
3. Rigidbody2D의 참조를 저장할 변수를 선언하였습니다.
Start() 메서드 부분입니다.
void Start()
{
rigidbody2D = GetComponent<Rigidbody2D>();
}
Start() 메서드는 MonoBehaviour 클래스가 제공하고 스크립트를 실행하자마자 불리는 메서드의 하나입니다.
Start() 메서드는 첫 번째 프레임을 업데이트하기 전에 불립니다.
Start() 메서드 안쪽에는 이전에 추가하였던 PlayerObject의 Rigidbody2D 컴포넌트의 참조를 얻으려는 GetComponent<Rigidbody2D>를 호출합니다.
GetComponent 메서드는 Type형식의 파라미터를 입력받아서 현재 Game Object가 지닌 컴포넌트 중 Type이 동일한 컴포넌트가 있으면 반환하는 메서드입니다.
PlayerObject에 Rigidbody 2D 컴포넌트가 존재합니다. GetComponent<>() 메서드가 <>안에 Type형식의 파라미터를 입력을 받는다고 하였는데 여기서는 바로 Rigidbody 2D 컴포넌트를 받습니다.
FixedUpdate() 메서드 부분입니다.
private void FixedUpdate()
{
movement.x = Input.GetAxisRaw("Horizontal");
movement.y = Input.GetAxisRaw("Vertical");
movement.Normalize();
rigidbody2D.velocity = movement * movementSpeed;
}
FixedUpdate() 메서드는 유니티가 일정한 간격으로 호출하는 메서드입니다.
FixedUPdate() 메서드 안을 확인하면 Vector2 의 x와 y값에 Input클래스의 GetAxisRaw() 메서드를 변수에 대입합니다.
Input 클래스는 사용자의 입력을 획득할 수 있습니다.
GetAxisRaw() 메서드는 입력을 받을 2D 축을 지정하는 Horizontal(수평), Vertical(수직)을 파라미터로 받고 -1, 0, 1의 값을 반환합니다.
"오른쪽 키" 또는 "d"키를 누르면 "1"의 값을 반환합니다.
"왼쪽 키" 또는 "a"키를 누르면 "-1" 값을반환합니다.
"0"은 누른 키가 없다는 의미입니다.
Edit > Project Settings > Input Manager 를 확인하면 입력키 설정을 할 수 있습니다.
movement.Nomalize()는 오브젝트가 대각선, 수직, 수평, 어느 뱡향으로 움직이든 일정한 속력을 유지하게 해줍니다.
rigibody 2D.velocity(속도) = movement * movementSpeed; 는 movement벡터(x,y)에 movementSpeed(3.0f) 값을 곱한 결과를 Rigidbody 2D의 velocity(속도)에 대입을 해야 플레이어가 움직이게 됩니다.
모두 작성한 코드를 저장합니다.
PlayerObject나 만들어놓은 프리팹에 방금 만든 MoveContorller 스크립트를 찾아 컴포넌트를 추가합니다.
Hierarchy창에 해당 오브젝트가 존재하는지 확인하고 게임을 실행시키고 방향키 혹은 w,a,s,d, 키를 누르면 캐릭터가 이동하는 것을 확인할 수 있습니다.
PlayerObject > Move Controller(Script) > Movement Speed 의 값을 조절하면 캐릭터의 이동속도를 변경 시킬 수 있습니다. Movement Speed가 바로 위에서 public으로 지정한 것입니다.
하지만 캐릭가 x축, y축으로는 이동하지만 애니메이션이 변화하지 않습니다. 이것은 다음 포스팅에서 진행하겠습니다!
마지막으로 Ctrl + S를 눌러 Scene을 저장합니다!
감사합니다! :)
'유니티2D' 카테고리의 다른 글
#8-3 유니티 캐릭터(Player) 이동하기_애니메이션(블렌드트리) (0) | 2020.12.01 |
---|---|
#8-2 유니티 캐릭터(Player) 이동하기_애니메이션(전환) (1) | 2020.11.30 |
#7 유니티 프리팹(Prefab) (0) | 2020.11.27 |
#6 유니티 태그(Tag), 레이어(Layer) (0) | 2020.11.27 |
#5 유니티 콜라이더(Collider), 리지드 바디(Rigid body) 컴포넌트 (0) | 2020.11.27 |