우선 Unity에서 새로운 2D 프로젝트를 생성해주자. 나는 여기서 unity 버전 2022.3.16f1을 사용했다.
만들어주고 탑뷰에 사용할 간단한 에셋을 Asset Store에서 다운 받아주자. 나는 다음 두 에셋을 사용하였다.
https://assetstore.unity.com/packages/2d/environments/tiny-rpg-town-environment-88293
Tiny RPG Town Environment | 2D 주변환경 | Unity Asset Store
Elevate your workflow with the Tiny RPG Town Environment asset from Ansimuz. Find this & more 주변환경 on the Unity Asset Store.
assetstore.unity.com
2D Farm Game Grasslands 4 Seasons Tileset | 2D 주변환경 | Unity Asset Store
Elevate your workflow with the 2D Farm Game Grasslands 4 Seasons Tileset asset from ElvGames. Find this & more 주변환경 on the Unity Asset Store.
assetstore.unity.com
1.이동 및 애니메이션
우선 캐릭터를 하나를 sprite를 가져와서 만들어주자.
여기서 Inspector에서 RigidBody 2D Component를 추가해주자. 그리고 우선 조작키를 받을 수 있도록 Unity Registry에서 Input System을 추가해주자
이렇게 추가해준다음 새로운 Input Action을 생성해주자.
그 다음 원하는 기능에 따라 Maps로 대분류를 해주고 키를 받아서 실제 기능을 하게될 Actions를 통해 키를 mapping 해주자.
그리고 Save Asset을 해주게 되면 그에 대응되는 C# Script가 생기는데 이를 Player Scrip를 만들어준 다음 여기서 가져
와서 사용하도록 하자.
이때 Actions의 이름에 맞게 함수를 만들고 바인딩 시켜주자.
Player.cs
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.InputSystem;
public class Player : MonoBehaviour
{
[SerializeField] private Rigidbody2D rb;
[SerializeField] private float speed = 5f;
[SerializeField] private Vector2 movementInput;
private PlayerInputActions playerInputActions;
private void Awake()
{
rb = GetComponent<Rigidbody2D>();
playerInputActions = new PlayerInputActions();
}
private void FixedUpdate()
{
onMove();
}
public void Move(InputAction.CallbackContext context)
{
// 움직임 입력 받기
movementInput = context.ReadValue<Vector2>();
}
private void onMove()
{
// 움직임 처리
rb.velocity = movementInput * speed;
}
private void OnEnable()
{
// Move 액션이 수행될 때 호출될 함수 연결
playerInputActions.PlayerAction.Move.performed += Move;
playerInputActions.PlayerAction.Move.canceled += Move;
// 액션 활성화
playerInputActions.Enable();
}
private void OnDisable()
{
// 액션 비활성화
playerInputActions.Disable();
}
}
이렇게 해준 방향에 맞는 Sprite를 출력해주도록 Animator와 Animation Controller를 만들어주자.
받아온 에셋에 보면 up down left right에 맞는 Sprite들이 나눠져 있는 경우가 있다. 이렇게 나눠져있으면 그에 해당하는 Sprite를 바탕으로 Animator를 만들어주자. 그리고 이러한 Animator 흐름을 설정해줄 수 있는 Animation Controller를 생성해주자.
Animation Controller는 기본은 Idle 상태로 두고 이를 움직이는 Parameters는 Speed, MoveX MoveY로 해서 어느방향으로 얼마나 움직이는지에 따라 다른 애니메이션이 실행되도록할 것이다. 그리고 up down left right의 애니메이션은 Blend Tree를 통해 흐름이 제어되도록 할 것인데 기존 애니메이션의 흐름은 저 화살표인 Transition을 통해 이루어지는데 4방향간의 모든 흐름을 제어하려면 화살표가 너무 복잡해진다. 그렇기 때문에 값에 따라 애니메이션을 분배해주는 Blend Tree가 적합하다.
BlendTree을 생성하고 Blend Type에서 2D Simple Directional로 설정하는 것으로 2개 x,y 값을 통해 Blend가 이루어지도록 설정하자. 그리고 4방향의 motion을 추가해주고 해당하는 값도 추가해주자.
이렇게 해주고 캐릭터의 움직임에 따라 Parameters값이 Update 되도록 Player 코드를 수정해주면 된다.
Player.cs
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.InputSystem;
public class Player : MonoBehaviour
{
[SerializeField] private Rigidbody2D rb;
[SerializeField] private float speed = 5f;
[SerializeField] private Vector2 movementInput;
private PlayerInputActions playerInputActions;
private Animator animator;
private void Awake()
{
rb = GetComponent<Rigidbody2D>();
playerInputActions = new PlayerInputActions();
animator = GetComponent<Animator>();
}
private void Update()
{
// Animator 파라미터 업데이트
animator.SetFloat("MoveX", movementInput.x);
animator.SetFloat("MoveY", movementInput.y);
animator.SetFloat("speed", movementInput.sqrMagnitude); // 이동 중인지 여부 판단
}
private void FixedUpdate()
{
onMove();
}
public void Move(InputAction.CallbackContext context)
{
// 움직임 입력 받기
movementInput = context.ReadValue<Vector2>();
}
private void onMove()
{
// 움직임 처리
rb.velocity = movementInput * speed;
}
// 나무와 충돌 감지
void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.tag == "Tree")
{
// 충돌하면 움직임을 멈추거나 처리할 로직
Debug.Log("나무에 부딪혔습니다.");
}
}
private void OnEnable()
{
// Move 액션이 수행될 때 호출될 함수 연결
playerInputActions.PlayerAction.Move.performed += Move;
playerInputActions.PlayerAction.Move.canceled += Move;
// 액션 활성화
playerInputActions.Enable();
}
private void OnDisable()
{
// 액션 비활성화
playerInputActions.Disable();
}
}
이렇게 해주면 Player가 잘 움직이는 것을 볼 수 있다.
2.Tile Map
게임 배경에 해당하는 Tile Map은 2D Object / TileMap / Rectangular을 선택해주면 된다. 그리고 에셋에 보면 배경에 넣을 수 있도록 미리 Tile Pallete가 설정되어 있는 경우가 있다. 이런 경우에는 그냥 사용을 해주면 된다. 사용법은 일단
Window / 2D / Tile Palette를 선택해서 팔레트를 켜주고 원하는 Map을 선택한다음 맵에 그려주고 싶은 부분을 선택해주고 붓모양을 클릭한다음 그려주면 된다.
만약 나무와 같이 다른 오브젝를 만들때는 겹치게 새로운 TileMap을 만들고 그 위에 그려주면 된다.
'게임공부 > Unity' 카테고리의 다른 글
[C#][Unity][나만의 탑뷰 게임 만들기]3. 퀘스트시스템 만들기-1 (1) | 2024.11.25 |
---|---|
[C#][Unity][나만의 탑뷰 게임 만들기]2. 대화 상호작용 만들기 (1) | 2024.11.06 |
[Unity][C#]개발꿀팁 모음 (1) | 2024.06.15 |
[Unity]게임 만들어보기 0장. 기획 (0) | 2024.02.06 |
[Unity]게임테일러-우리만의 게임으로 바꿔보기 (3) | 2023.11.26 |