Rigidbody2D나 Box Collider등과 같은 컴포넌트들을 게임오브젝트에 추가했던것 처럼 스크립트를 컴포넌트처럼 추가할 수 있습니다.
스크립트 파일 만들기
게임오브젝트에서 Add Component에서 스크립트를 추가할 수도 있고 프로젝트뷰에서 스크립트를 만들어 나중에 추가할 수도 있습니다. 프로젝트뷰에서 Scripts폴더를 만든후 폴더안에서 우클릭후 Create>Script를 클릭후 이름을 PlayerController로 바꿔줍니다.
매 프레임 불리워지는 Update()에서 키보드입력을 받습니다. axisH = Input.GetAxisRaw("Horizontal");
일정한 간격으로 호출되는 FixedUpdate()에서 Rigidbody 2D컴포넌트를 사용중이므로 Rigidbody를 물리를 이용 객체의 위치를 변경시킵니다. rbody.velocity = new Vector2 (axisH * 3.0f, rbody.velocity.y);
Rigidbody를 사용하지 않을경우 Transform컴포넌트를 이용 객체를 이동시키나 Rigidbody를 사용시는 되도록 Rigidbody를 사용해야 합니다. 이는 Rigidbody가 Trnasform컴포넌트 보다 나중에 실행되어지기 때문입니다.
저장후 Pplayer_stop에 적용시켜줍니다. 플레이후 AD키를 누르면 좌우로 움직입니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
// Start is called before the first frame update
Rigidbody2D rbody;
float axisH = 0.0f;
void Start()
{
rbody = GetComponent<Rigidbody2D>();
}
// Update is called once per frame
void Update()
{
axisH = Input.GetAxisRaw("Horizontal");
}
private void FixedUpdate() {
rbody.velocity = new Vector2 (axisH * 3.0f, rbody.velocity.y);
}
}
변수부분에 public float speed = 3.0f; 를 추가하고 상수 3.0f대신 speed를 사용합니다.
캐릭터가 좌우로 움직일 경우 진행 방향을 바라보기 위해 transform.localScale을 이용합니다. 물리상 - Scale은 말이 안되지만 유니티에서는 반전을 뜻합니다. (-1,1)은 x축만 반전 시키겠다는 의미입니다.
if(axisH > 0.0f) { //오른쪽 처리
transform.localScale = new Vector2(1, 1);
} else if (axisH <0.0f) { //왼쪽 처리
transform.localScale = new Vector2(-1, 1);
}
저장하고 실행해보면 캐릭터가 진행방향에 따라 반전하는걸 알수 있습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour{
// Start is called before the first frame update
Rigidbody2D rbody;
float axisH = 0.0f;
public float speed = 3.0f;
void Start(){
rbody = GetComponent<Rigidbody2D>();
}
// Update is called once per frame
void Update(){
axisH = Input.GetAxisRaw("Horizontal");
if(axisH > 0.0f) {
transform.localScale = new Vector2(1, 1);
} else if (axisH <0.0f) {
transform.localScale = new Vector2(-1, 1);
}
}
private void FixedUpdate() {
rbody.velocity = new Vector2 (speed * axisH, rbody.velocity.y);
}
}
하이라키에 다음과 같이 Images/back, ground, Player폴더의 player_stop이미지를 끌어다 놓는다. 플레이해 보면 예상과 다르게 배경만 보인다. player_stop의 이름은 player로 바꿉니다.
트랜스폼
트랜스폼: 위치, 화면 크기를 조절하는 컴포넌트 입니다.
스프라이트랜더러
스프라이트랜더러 : 이미지를 표시하는 컴포넌트입니다. 다음과 같은 값을 가지고 있습니다.
Sprite : 표시할 이미지에셋을 나타냅니다.
Color : 색감변경
Flip : 상하좌우로 반전시킬수 있습니다.
Sorting Layer: 게임오브젝트를 레이어라는 그룹으로 묶고 표시의 우성순위를 그룹별로 지정할 수 있습니다.
Order in Layer : Sorting Layer로 나눈 레이어 중 게임 오브젝트가 씬에 표시되는 순서를 정합니다. 값이 클수록 앞에 표시됩니다.
게임 오브젝트의 이미지 변경하기
스프라이트렌더러에는 이미지의 파일명이 표시된 Sprite라는 항목이 있습니다. Sprite를 클릭하면 프로젝트뷰에서 해당 이미지 에셋이 강조돼 어느 에셋이 사용되는지 확인할 수 있습니다.
이미지를 선택한후 Delete키를 클릭해 제거해 보면 씬뷰에서보이지 않게 되지만 하이라키뷰에서는 게임오브젝트가 남아 있습니다.
다시 이미지를 설정해 봅시다. 이미지가 제거 되었으니 계층뷰에서 게임오브젝트를 선택합니다. 프로젝트 뷰의 이미지를 선택해 Sprite의 오른쪽 텍스트박스에 드래그앤드롭합니다.
표시우선순위를 알아보기
지면이나 캐릭터 등은 항상 배경보다 앞에 표시돼야 해 표시 우선순위를 의도적으로 변경해야 합니다. 우선순위를 높이려면 Sprite Renderer 컴포넌트의 Additional Settings에서 Order in Layer의 값을 크게 합니다. 여기서는 배경 0, 플레이어는 3, 지면은 2로 설정했습니다. 드디어 보이네요
하이라키에서 player_stop을 선택하고 오른쪽 인스펙터부에서 Rigidbody 2D 컴포넌트를 추가합니다.
플레이해보면 플레이어가 아래로 떨어집니다.
충돌판정, ground에 Box Collider 2D 추가하기
하이라키에서 ground를 선택하고 Box Collider 2D를 선택 추가합니다.
플레이 해보면 아직도 플레이어가 떨어집니다. 이제 플레이어에도 Box Collider 2D를 추가해보면 다음과 같이 사각형이 생기는데 Edit Collider를 누르면 사각형 색과 모양이 다음과 같이 바끼고 크기를 조정할 수 있습니다. Capsule Collider 2D를 선택하면 좀더 타이트하게 설정도 가능합니다. 가벼운 처리를 위해서는 Circle Collider 2D가 있습니다. 대량의 적 캐릭터의 충돌 판정에 적합합니다.