11주차

By | 2025년 05월 21일

■ 구현 기능
· 게임 시작 화면 UI ( Game Start, exit )
· E 키로 바닥의 아이템을 줍고, I 키로 인벤토리 창을 열어 확인할 수 있는 기능
· 아이템이 인벤토리 슬롯에 표시되고, 우클릭 시 ‘USE’ / ‘THROW’ 메뉴가 표시됨
· ‘THROW’ 선택 시 아이템이 다시 바닥에 드랍

■ 게임 시작 화면 UI ( Game Start, exit )

시작화면

— 게임 시작화면 UI —

using UnityEngine;
using UnityEngine.SceneManagement;

public class StartMenu : MonoBehaviour
{
    public void StartGame()
    {
        SceneManager.LoadScene("GameScene"); // 씬 이름 정확히 맞춰야 함!
    }

    public void QuitGame()
    {
        Application.Quit(); // 빌드된 게임에서만 작동
        Debug.Log("게임 종료"); // 에디터에서는 이 로그만 찍힘
    }
}

“Game Start” 버튼을 누르면 다음 씬으로 넘어가고, “exit” 버튼을 누르면 종료

■ E 키로 바닥의 아이템을 줍고, I 키로 인벤토리 창을 열어 확인할 수 있는 기능
I키 누르면 인벤토리 창 열리고 닫힘
■ 슬롯 여러 개 배치 (Grid로 정렬)

1. 기본 구조 만들기
1.1. 씬에 당근 스프라이트 드래그 해서 배치 ( 오브젝트 이름 : Item_Carrot )
1.2. 오브젝트에 Box Collider 2D 컴포넌트 추가 ( Is Trigger 체크 )2. PlayerMovement 스크립트 만들기

3. InventoryManager 스크립트 만들기

4. ItemPickup 스크립트 만들기

5. 인벤토리 UI 만들기
5.1. Canvas를 생성 ( 이름 : InventoryUI )
5.2. Panel을 추가 ( 이름 : InventoryPanel, 비활성화(비체크) )
5.3 InventoryUI 스크립트 만들기

6. 인벤토리 슬롯 UI 만들기
6.1 InventoryUI 오브젝트 안에 패널 추가
· InventoryUI -> 우클릭 -> UI > Panel
6.2 SlotGrid에 GirdLayoutGroup 컴포넌트 추가
6.3 TitleText 추가
· InventoryPanel 안에 UI > Text – TextMeshPro ( 이름 : TitleText, 텍스트 : Inventory )
(Canvas > InventoryUI > InventoryPanel > SlotGrid > Slot > ItemImage 형태로 계층 구성)

7. 슬롯 프리팹 만들기
7.1. UI > Image ( 이름 : Slot )
7.2. 슬롯 안에 아이템 이미지용 Image 추가
7.3. 슬롯을 프리팹으로 저장
· Slot 오브젝트를 Project 창으로 드래그하여 프리팹으로 저장

8. SlotGrid 만들기
· InventoryPanel 안에 UI > Empty 만들기 ( 이름 : SlotGrid )
· 컴포넌트 추가 : Grid Layout Group

9. InventoryUI 스크립트 수정

10. InventoryManager에서 아이템 추가 호출
// 인벤토리에 아이템 추가 (carrotSprite는 아이템 스프라이트)
InventoryUI inventoryUI = GameObject.Find(“InventoryUI”).GetComponent();
inventoryUI.AddItem(carrotSprite);

11. Inspector 연결
11.1 InventoryUI 오브젝트 선택
11.2 InventoryUI 스크립트에:
· Slot Prefab: 아까 만든 프리팹
· Slot Grid: SlotGrid 오브젝트 드래그

■ 우클릭: 슬롯 위에서 메뉴 팝업 (버리기, 사용하기)
■ 버리기 선택: 아이템이 플레이어 위치에 다시 생성

1. 기존 아이템 오브젝트를 프리팹으로 저장
1.1. Hierarchy에 있는 Item_Carrot나 Item_Ball 등을 Project 창으로 드래그
1.2. Resources/Items 폴더에 넣기

2. 우클릭 메뉴 UI 만들기
2.1. Canvas 안에 Panel 생성 ( 이름 : ItemContextMenu )
2.2. 안에 Button 2개 추가 ( 이름 : UseButton, DropButton )
2.3. InventorySlot 스크립트 만들기
2.4. ItemContextMenu 스크립트 만들기
2.5 InventoryUI 스크립트에 연결
· Hierarchy에서 InventoryUI 오브젝트 선택 -> Inspector에서 다음 항목을 연결
필드 이름 (Inspector) 연결할 오브젝트
Slot Prefab Slot 프리팹
Slot Grid SlotGrid 오브젝트 (슬롯 부모)
Inventory Panel InventoryPanel 오브젝트
Context Menu ItemContextMenu 오브젝트
Use Button ItemContextMenu 하위의 UseButton
Drop Button ItemContextMenu 하위의 DropButton
Item Prefab 위에서 만든 Item_Carrot_Prefab 프리팹

아이템 줍기/버리기/확인

npc 지정 경로 이동
  • 사용 코드

using UnityEngine;

public class AlexNPCMovement : MonoBehaviour
{
public Transform[] waypoints;
public float moveSpeed = 2f;
private int currentIndex = 0;
private Animator animator;
private bool isFinished = false;

void Start()
{
    animator = GetComponent<Animator>();
}

void Update()
{
    if (waypoints.Length == 0 || isFinished) return;

    Vector3 targetPos = waypoints[currentIndex].position;
    Vector3 direction = targetPos - transform.position;

    if (direction.magnitude < 0.1f)
    {
        animator.SetBool("IsMoving", false);
        currentIndex++;


        if (currentIndex >= waypoints.Length)
        {
            isFinished = true;
        }

        return;
    }

    Vector3 moveDir = direction.normalized;
    transform.position += moveDir * moveSpeed * Time.deltaTime;

    animator.SetFloat("MoveX", moveDir.x);
    animator.SetFloat("MoveY", moveDir.y);
    animator.SetBool("IsMoving", true);
}

}

지정된 경로로 잘 이동하나 속도 + 더 촘촘하게 해야함

이동 중 플레이어에게 막히거나 밀릴 시 오류 발생

애니메이션 오류

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다