개인 과제 구현 한다고, 생각만 앞서다가 시간을 다 잡아 먹었다...
내가 원하는 기능을 구현하는게 쉬우면서도 어려운 것 같다.
지금 더 열심히 한다면, 고점을 뚫겠지..!
Terrain
Animation
유니티에서는 WordBuild를 제공한다. 대지의 형태, 초목 등 환경 지형을 생성할 수 있는 다양한 툴을 제공하는데,
Terrain이 여기에 속한다.
Terrain은 게임에 풍경을 추가하는 데 사용할 수 있는 기능이다. 여러 지형 타일을 만들고, 풍경의 높이나 모양을 조정하고, 나무나 잔디를 추가할 수 있다.
아래 사이즈는 2 X 2
아래 사이즈는 5 X 5다. 한 타일안 이미지가 확대되었음!
즉, 이미지의 크기와 위치를 조절하는 기능이다.
레이어 세팅이 끝나면, Brushes에서 원하는 Brush를 선택하자.
Terrain으로 구조를 만들 수 있다.
Inspector -> Raise or Lower Terrain 을 클릭하면,
Brush를 선택하고, 원하는 모양으로 좌클릭을 누르면 브러쉬 모양으로 땅이 상승한다!
이렇게 땅을 내려가게도 할 수 있는데,
2.5D로 FSM을 사용해보려고 했는데, 애니메이션을 여러개 만들다 보니, 구현할 방법이 생각이 안났다.
간단하게 애니메이션을 구현해봤는데,
우선 픽셀로 원하는 캐릭터를 만들었다.
환웅 캐릭터를 모티브로 삼고, 픽셀로 구현해봤다.
중간에 쓰지않는 동작은 제외하고, 최대한 환웅과 비슷하게 만들어봤는데
점프하는 모션을 쓰지 않아서 조금 아쉽다.
using UnityEngine;
public class PlayerController : MonoBehaviour
{
public Rigidbody playerRB;
public float moveSpeed;
public float jumpForce;
private Vector2 moveInput;
public LayerMask terrainLayer;
public Transform groundPoint;
private bool isGrounded;
public Animator anim;
private void Update()
{
moveInput.x = Input.GetAxis("Horizontal");
moveInput.y = Input.GetAxis("Vertical");
moveInput.Normalize();
playerRB.velocity = new Vector3(moveInput.x * moveSpeed, playerRB.velocity.y, moveInput.y * moveSpeed);
anim.SetFloat("moveSpeed", playerRB.velocity.magnitude);
if (moveInput.x > 0)
anim.SetInteger("Direction", 3);
else if (moveInput.x < 0)
anim.SetInteger("Direction", 2);
if (moveInput.y > 0)
anim.SetInteger("Direction", 1);
else if (moveInput.y < 0)
anim.SetInteger("Direction", 0);
RaycastHit hit;
if (Physics.Raycast(groundPoint.position, Vector3.down, out hit, .3f, terrainLayer))
{
isGrounded = true;
}
else
{
isGrounded = false;
}
if (Input.GetButtonDown("Jump") && isGrounded)
{
playerRB.velocity += new Vector3(0f, jumpForce, 0f);
}
}
}
코드는 간단하다.
Update()에서 플레이어의 입력을 받아와 캐릭터의 움직임과 애니메이션 상태를 제어하는 로직을 작성했다.
moveInput.x = Input.GetAxis("Horizontal");
moveInput.y = Input.GetAxis("Vertical");
사용자의 입력을 받아와 moveInput 벡터에 저장한다.
playerRB.velocity = new Vector3(moveInput.x * moveSpeed
playerRB.velocity.y, moveInput.y * moveSpeed);
사용자의 입력에 따라 캐릭터가 움직일 방향과 속도를 계산하여 Rigidbody 컴포넌트에 적용한다.
anim.SetFloat("moveSpeed", playerRB.velocity.magnitude);
현재 캐릭터의 속도를 Animator 컴포넌트에 전달하여 애니메이션 상태를 결정하는 데 사용했다.
방향 입력에 따라 'Direction' 파라미터 값을 설정하는 코드들은 해당 방향으로 이동하는 애니메이션을 재생하도록 했다.
Raycast를 이용하여 현재 캐릭터에 지면 위에 있는지 확인하고, 점프 가능 여부를 결정한다.
Parameters를 설정하고, Sub-State Machine으로 Walk를 따로 구현했다.
Player에게 속도가 부여되면, Walk가 실행된다!
마법진 같은 모양인데,, 각 Transition은 Direction에 대한 int 값으로 연결되어있다.
각 상태에서 Exit로 나가는 Transition은 속도 값(flaot)이 0.1 아래로 떨어지면, Idle 상태로 나간다.
시작 화면 구성
메인 화면 기능 추가
바쁘다.... 바빠