에셋 Import 후 Sprite에서 캐릭터 메인 png 파일 Example에 복붙
그리고 아래처럼 설정해주기
Sprite Editor에서 Cell 사이즈로 나눠주기
Apply하면 이렇게 잘려서 생성됨
빈GameObject 만들고 Sprite Rendere 추가한 다음 Sprite에 할당, Animatior 추가
ctrl+6으로 애니메이션 창 열어서 애니메이션 생성
잘린 이미지들 중 서있을 때 애니메이션을 애니메이션 창에 넣으면 애니메이션이 됨
애니메이션이 너무 빠르니
1초당 재생할 애니메이션 프레임 수 수정을 위해 Show Sample Rate해서 수정
Animator 실행
초반부에 썼던 방식은 저기서 조건으로 제어하는거였는데 버그잡기 힘들어서 다른 방법 쓰신다고 함
기존 에셋 폴더의 Animation, Sprite Example에 복붙하고 Animation Controller 생성
생성한 Animation Controller에 들어가서 Sprite에 있던 거 넣어주기
Create State - From New Blend Tree로 Blend Tree 만들어서
idle이랑 Jump 두개 추가해주고 Speed 파라미터 추가해주기
Idels에 다 transition 연결해주고 Idels Set Default로 만들어주기
Input System 설치
그럼 이제 Editor/Project Settings에서 Active Input Handling을 확인할 수 있음
Example/Alchemist에서 Input Actions 추가
키보드 추가해주기
Action Value2로 바꿔주기
그럼 이렇게 뜸
이제 키 바인딩이 필요한데 Listen 누르고 해당 키 누르면 해당 키가 뜸
설정해주고 Generate C# Class 체크, Apply
Add Component로 PlayerInput 추가해주고, 아래처럼 설정해줄 것
Invoke C Sharp Events가 제일 낫다고 함
타일맵 만들기
new scene 만들기
Tile Palette 열기
Create New Palette
Rectangle(ex. 포켓몬 등)로 진행
밑에 옵션은 기본으로(Automatic~) 두고 Create하면 위치 지정 창 뜨면서 생성됨
Texture에서 받았던 에셋의 파일을 Drag & Drop
Tilemap-Rectangular 생성
Tile Palette에서 붓 선택 후 원하는 타일 누르면 그려짐
인포에서 사용한 항목 확인 가능
해당 항목에서
Sprite : 픽셀단위로 충돌체 설정
Grid : 그리드 단위로 충돌체 설정
Ground에 Tilemap Collider 2D 추가
Composite Collider 2D 추가하고 Used By Composite 체크해서 충돌체를 하나로 합쳐주기
두 Tile에 대해 알아보자
- Animated Tile
- Rule Tile
Number of Animated 5로 설정하고 애니메이션처럼 보여지도록 텍스쳐 추가
영역만큼 드래그해서 지정한후 붓으로 똑같이 그리면 됨
Rule Tile은 여기서...
https://www.youtube.com/watch?v=OuJ9qSA_w3Q
인벤토리 만들기
소스 이미지를 늘리는 법
소스 이미지의 Sprite Editor 클릭
이런 식으로 늘어나면 안되는 영역 설정
Apply 해주고 Image Type을 Simple -> Sliced로 바꾼 후 Width 조절하면 됨
여기부턴 프리펩 오류 한번 터지고 실시간으로 따라가기 실패!
스샷 찍는 건 벅차서 간단하게 정리
스크립터블 오브젝트 (후에 유용하니 잘 메모해두라는 멘토님의 추천)
// Manager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// [CreateAssetMenu]를 사용하면 Unity 메뉴에 새로운 ScriptableObject를 생성할 수 있는 옵션을 추가합니다.
// "ItemData"라는 이름으로 파일을 생성할 수 있으며, "Datas/ItemData" 경로로 접근 가능합니다.
[CreateAssetMenu(fileName = "ItemData", menuName="Datas/ItemData")]
public class ItemData : ScriptableObject
{
// 아이템 이름을 저장하는 변수
public string itemName;
// 아이템 아이콘 이미지를 저장하는 변수 (Sprite 형식)
public Sprite icon;
}
// ItemInfo 클래스는 아이템의 데이터를 담는 역할을 합니다.
// 이 클래스는 MonoBehaviour가 아니기 때문에 게임 오브젝트에 직접 연결되지 않습니다.
public class ItemInfo
{
// 해당 아이템의 데이터 (ItemData를 참조)
public ItemData itemData;
// 아이템의 수량을 저장하는 변수
public int amount;
}
// ItemManager 클래스는 아이템 데이터를 관리하는 역할을 합니다.
// MonoBehaviour를 상속받았으므로 Unity 게임 오브젝트에 붙여서 사용 가능합니다.
public class ItemManager : MonoBehaviour
{
// 게임에서 사용할 아이템 데이터 리스트
// Unity 인스펙터에서 여러 아이템 데이터를 추가할 수 있습니다.
public List<ItemData> itemsDatas = new List<ItemData>();
}
인벤토리에 아이템 넣기
맵에서 캐릭터 움직이기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class CharController : MonoBehaviour
{
// 애니메이터에서 사용할 Speed 파라미터의 해시값을 저장 (성능 최적화)
private static readonly int Speed1 = Animator.StringToHash("Speed");
// 캐릭터의 이동 속도
[SerializeField] private float Speed = 5.0f;
// 메인 카메라를 참조하기 위한 변수
[SerializeField] private Camera _mainCamera;
// 카메라 이동 속도
[SerializeField] private float CameraSpeed = 4.0f;
// 캐릭터와 카메라의 최대 거리 제한
[SerializeField] private float MaxDistence = 4.0f;
// 카메라와 캐릭터 간의 초기 오프셋(거리)
private Vector3 cameraOffset;
// 플레이어 이동 입력을 처리하는 InputAction
InputAction Move_Input;
// 캐릭터의 애니메이션을 관리할 Animator 컴포넌트
private Animator _animator;
// 캐릭터의 Rigidbody2D 컴포넌트
private Rigidbody2D _rigidbody;
// 캐릭터의 SpriteRenderer 컴포넌트 (스프라이트를 뒤집기 위해 사용)
private SpriteRenderer _spriteRenderer;
void Start()
{
// 컴포넌트 초기화
_animator = GetComponent<Animator>();
_rigidbody = GetComponent<Rigidbody2D>();
_spriteRenderer = GetComponent<SpriteRenderer>();
// PlayerInput 컴포넌트에서 이동 입력을 가져옴
UnityEngine.InputSystem.PlayerInput Input = GetComponent<UnityEngine.InputSystem.PlayerInput>();
Move_Input = Input.actions["Move"];
// 카메라와 캐릭터 간의 초기 오프셋 계산
cameraOffset = _mainCamera.transform.position - transform.position;
}
void Update()
{
// 이동 입력 값 읽기 (Vector2로 반환됨, x는 좌우, y는 상하)
Vector2 moveValue = Move_Input.ReadValue<Vector2>();
// 캐릭터의 이동 방향에 따라 스프라이트를 좌우로 뒤집음
if (moveValue.x != 0)
_spriteRenderer.flipX = moveValue.x < 0;
// 이동 속도(절대값)를 애니메이터 파라미터에 설정
_animator.SetFloat(Speed1, Mathf.Abs(moveValue.x));
// 입력값에 따라 캐릭터의 위치를 이동
transform.position += new Vector3(moveValue.x * Speed, 0, 0) * Time.deltaTime;
}
private void LateUpdate()
{
// 카메라가 따라가야 할 새로운 위치 계산
var CharPosition = transform.position + cameraOffset;
// 기본 카메라 이동 속도
float speed = CameraSpeed;
// 카메라가 캐릭터와 너무 멀어졌다면 이동 속도를 조정
if (Vector3.Distance(_mainCamera.transform.position, CharPosition) >= MaxDistence)
{
// 캐릭터와 카메라의 거리를 한 번에 좁히도록 속도를 조정
speed = MaxDistence / Time.deltaTime;
}
// 카메라 위치를 캐릭터 위치로 부드럽게 이동
Vector3 newPosition = Vector3.MoveTowards(
_mainCamera.transform.position, CharPosition, speed * Time.deltaTime);
// 카메라 위치 업데이트
_mainCamera.transform.position = newPosition;
}
}
중간에 프리펩 오류나서 아예 못따라갈뻔...했지만
다행히 해결함
프리펩으로 만든 버튼에 스크립트 추가가 안되는 이슈였는데
기존 스크립트에 오류가 있어서 안되는거였음
그동안 축적된 저장 버릇 때문에 강사님이 작성하시다 만 스크립트 따라치던거 저장 누르고...그 스크립트는 그대로 오류가 있는 스크립트가 되어버려 해당 이슈가 발생한 것이었다...
휴~
'공부 > [TIL] Game Bootcamp' 카테고리의 다른 글
[멋쟁이사자처럼 부트캠프 TIL] 유니티 게임 개발 3기 : Curve, 몬스터 생성, 몬스터와 충돌 이벤트 (1) | 2024.12.17 |
---|---|
[멋쟁이사자처럼 부트캠프 TIL] 유니티 게임 개발 3기 : 애니메이션을 더한 캐릭터 점프, 아이템 먹기 (1) | 2024.12.16 |
[멋쟁이사자처럼 부트캠프 TIL] 유니티 게임 개발 3기 : Unity C# (0) | 2024.12.12 |
[멋쟁이사자처럼 부트캠프 TIL] 유니티 게임 개발 3기 : 정렬 (0) | 2024.12.11 |
[멋쟁이사자처럼 부트캠프 TIL] 유니티 게임 개발 3기 : 자료구조(Queue), 오브젝트 풀링 등 (1) | 2024.12.06 |