-----------------------------
--인벤토리 창 만들기--
스크롤 뷰만들기(UI) > "Inventory" 이름바꾸기
Canvas > Canvas Scaler의 UI Scale Mode를 'Scale With Scen Size'로 바꾸고 x 1920, y 1080으로 변경
인벤토리 크기를 600 * 750으로 바꾸기, 닻은 우측중앙, 화면 끝에서 조금 떨어지게 위치조정, 이미지 넣고 불투명 최대
인벤토리 펼쳐서 스크롤 제어삭제 (vewpoint만 남기기)
인벤토리 안에 UI버튼 추가하기 > "CloseButton"이름 변경, 창 끄는 이미지넣고 위치조정
CloseButton의 OnClick 추가, Inventory 넣고 'GameObject', 'SetActive(bool)'선택
인벤토리 인스펙터창의 맨 위의 체크박스 해제(창 안보이게)
캔버스안에 버튼 만들기 > 200 * 50, "InventoryButton"으로 이름바꾸고 텍스트 "INCENTORY"로 바꾸기
InventoryButton의 OnClick 추가, Inventory 넣고 'GameObject', 'SetActive(bool)'선택, 체크박스 체크
재생 눌러서 인벤토리버튼이랑 닫기버튼으로 인벤토리창 껃다켰다 되는지 확인하기
-------------------------------
--인벤토리 객체 만들기--
인벤토리 보이게 하고
인벤토리의 뷰포인트 안의 Content안에 버튼 만들기(100*100), 인벤토리랑 어울리는색으로 바꾸기
버튼은 "Item", 텍스트이름은 "ItemName"으로 바꾸고 텍스트 위치 중앙 하단으로 변경
아이템 안에 이미지(UI) 만들기 > 사이즈 50*50, y값 올려서(5) 글씨 보이게 하기, 이름 "ItemIcon"으로 바꾸기
아이템 안에 버튼 만들기 > 아이템 삭제버튼 위치로 놓기(아이템 우측상부), 이미지넣기, 크기조정, 비가시화(인스펙터창)
아이템 프리펩 만들고 하이라키의창에서 지우기
Content > Add Component 'Grid Layout Group'
> Padding - 왼쪽:40,오른쪽:0,위30,아래0
Spacing x5,y5
--참고--
Padding(테두리간격 띄우기)
Cell Size
Spacing (셀 사이 간격 띄우기)
...
Child Alignment - Middle Center 하면 중앙배열 됨
Constraint - Fixed Column Count - 가로 셀 개수 고정
--------------------------------------------------
Content 인스펙터 Add component "Content Size Fitter", (도로 올라감 방지)Vertical Fit을 Min Size로 바꾸기
vewpoint > Top 30, right 17, bottom 30
-------
오브젝트 3개 꺼내서 화면에 배열하기, 콜리더 넣기(있으면 말고)
"Item.cs" 만들기
------------------------------------------
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(fileName = "New Item", menuName = "Item/Creat New Item")]
public class Item : ScriptableObject
{
public int id; // 항목번호
public string itemName; // 아이템 이름
public int value; // 아이템 개수
public Sprite icon; // 아이콘 이미지
}
------------------------------------------
Items 폴더 만들기(아이콘 관리) > 폴더 들어가서 우클릭, item클릭 > new Item 클릭(아이템 갯수만큼)
빈칸 채우기
"ItemController.cs" 만들기
-------------
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ItemController : MonoBehaviour
{
public Item Item;
}
--------------
ItemController.cs를 모든 아이템창에 넣을 오브젝트에 넣고 프리펩 넣기
하이라키창에 빈 오브젝트 만들기 + .Cs만들고 "InventoryManager"로 이름바꾸기
ItemPickup.cs 만들기
(5:50)
----InventoryManager.cs----
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InventoryManager : MonoBehaviour
{
public static InventoryManager Instance;
// 정적 인벤토리 관리자 만들고 'Instance'로 선언
public List<Item> items = new List<Item>();
// 이이템 리스트 만들기
private void Awake(){
Instance = this;
}
public void Add(Item item){
// 파라미터(매게변수)의 형태를 item으로 지정
items.Add(item);
}
public void Remove(Item item){
// 파라미터(매게변수)의 형태를 item으로 지정
items.Remove(item);
}
}
---------------------------------
----ItemPickup.cs ----
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ItemPickup : MonoBehaviour
{
public Item Item;
void Pickup(){
InventoryManager.Instance.Add(Item);
// 인벤토리 관리자에 액세스하여 항목을 추가
Destroy(gameObject);
// 추가한 항목 파괴(하이라키에서 지우기)
}
private void OnMouseDown(){
Pickup();
}
}
------------------------------------------
객체(아이템) 내부에 충돌체(콜라이더) 있는지 확인하기
객체(아이템)에 ItemPickup.cs 넣기, 아이콘 넣기
InventoryManager의 InventoryManager.cs에 아이콘 넣기
-----InventoryManager.cs 수정-----
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class InventoryManager : MonoBehaviour
{
public static InventoryManager Instance;
// 정적 인벤토리 관리자 만들고 'Instance'로 선언
public List<Item> Items = new List<Item>();
// 이이템 리스트 만들기
public Transform ItemContent;
public GameObject InventoryItem;
private void Awake(){
Instance = this;
}
public void Add(Item item){
// 파라미터(매게변수)의 형태를 item으로 지정
Items.Add(item);
}
public void Remove(Item item){
// 파라미터(매게변수)의 형태를 item으로 지정
Items.Remove(item);
}
public void ListItems()
{
foreach (var item in Items)
{
// 인벤토리 아이템 게임오브젝트를 생성하고 ItemContent의 자식으로 설정
GameObject obj = Instantiate(InventoryItem, ItemContent);
// 아이템의 이름 텍스트 컴포넌트를 찾아서 itemName 변수에 할당
var itemName = obj.transform.Find("ItemName").GetComponent<Text>();
// 아이템의 아이콘 이미지 컴포넌트를 찾아서 itemIcon 변수에 할당
var itemIcon = obj.transform.Find("ItemIcon").GetComponent<Image>();
itemName.text = item.itemName;
itemIcon.sprite = item.icon;
}
}
}
--------------------------
(8:30)
인벤토리 버튼 온클릭 추가 > 하이라키의 인벤매니저 넣고 인벤토리메니저의 ListIten()선택
인벤토리 메니저에 Item Content에 인벤토리 안의 Content, InventoryItem에 ItenPrefab 넣기, Content안에있는 아이템칸들 하나만 남기고 지우기
----토글로 아이템 삭제버튼 활성화 ----
인벤토리에 ui 토글 만들기
위치 : 인벤토리 왼쪽 하단, 크기 30*30, 토글이름 EnableRemove, 레이블 EnableRemove,
---인벤매니저.cs 수정---
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class InventoryManager : MonoBehaviour
{
public static InventoryManager Instance;
// 정적 인벤토리 관리자 만들고 'Instance'로 선언
public List<Item> Items = new List<Item>();
// 이이템 리스트 만들기
public Transform ItemContent;
public GameObject InventoryItem;
public Toggle EnableRemove;
// 인벤토리 내 아이템 삭제가능 상태로 변환하는 토글
private void Awake(){
Instance = this;
}
public void Add(Item item){
// 파라미터(매게변수)의 형태를 item으로 지정
Items.Add(item);
}
public void Remove(Item item){
// 파라미터(매게변수)의 형태를 item으로 지정
Items.Remove(item);
}
public void ListItems()
{
// Clean content before open.
foreach (Transform item in ItemContent)
{
Destroy(item.gameObject);
}
foreach (var item in Items)
{
// 인벤토리 아이템 게임오브젝트를 생성하고 ItemContent의 자식으로 설정
GameObject obj = Instantiate(InventoryItem, ItemContent);
// 아이템의 이름 텍스트 컴포넌트를 찾아서 itemName 변수에 할당
var itemName = obj.transform.Find("ItemName").GetComponent<Text>();
// 아이템의 아이콘 이미지 컴포넌트를 찾아서 itemIcon 변수에 할당
var itemIcon = obj.transform.Find("ItemIcon").GetComponent<Image>();
itemName.text = item.itemName;
itemIcon.sprite = item.icon;
}
}
public void EnableItemsRemove()
{
if (EnableRemove.isOn)
{// 토글 활성 시 항목제거 활성화
foreach(Transform item in ItemContent)
{
item.Find("RemoveButton").gameObject.SetActive(true);
}
}
else
{
foreach(Transform item in ItemContent)
{// 토글 비활성
item.Find("RemoveButton").gameObject.SetActive(false);
}
}
}
}
----------------------
인벤 메니저의 Enable Remove에 토글 넣기
토글(EnableRemove) > Toggle > On Value Changed (Boolean)
>+, 인벤메니저 넣기, 'InventoryManager' - 'EnableItemsRemove ()'
확인하기
스크립트 만들기
-- InventoryItemController.cs--using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class InventoryItemController : MonoBehaviour
{
Item item;
public Button RemoveButton;
public void RemoveItem()
{
InventoryManager.Instance.Remove(item);
Destroy(gameObject);
}
public void AddItem(Item newItem)
{
item = newItem;
}
}
---------------------
아이템 프리펩에 넣기
-----------------인벤 메니저.cs---
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class InventoryManager : MonoBehaviour
{
public static InventoryManager Instance;
// 정적 인벤토리 관리자 만들고 'Instance'로 선언
public List<Item> Items = new List<Item>();
// 아이템 리스트 생성
public Transform ItemContent;
public GameObject InventoryItem;
public Toggle EnableRemove;
// 인벤토리 내 아이템 삭제 가능 상태로 변환하는 토글
public InventoryItemController[] InventoryItems;
private void Awake()
{
Instance = this;
}
public void Add(Item item)
{
// 파라미터(매개변수)의 형태를 item으로 지정
Items.Add(item);
}
public void Remove(Item item)
{
// 파라미터(매개변수)의 형태를 item으로 지정
Items.Remove(item);
}
public void ListItems()
{
// Open 전에 내용을 정리합니다.
foreach (Transform item in ItemContent)
{
Destroy(item.gameObject);
}
// 각 아이템을 순회하면서 인벤토리 아이템 게임 오브젝트를 생성합니다.
foreach (var item in Items)
{
// 인벤토리 아이템 게임 오브젝트를 생성하고 ItemContent의 자식으로 설정합니다.
GameObject obj = Instantiate(InventoryItem, ItemContent);
// 아이템의 이름 텍스트 컴포넌트를 찾아서 itemName 변수에 할당합니다.
var itemName = obj.transform.Find("ItemName").GetComponent<Text>();
// 아이템의 아이콘 이미지 컴포넌트를 찾아서 itemIcon 변수에 할당합니다.
var itemIcon = obj.transform.Find("ItemIcon").GetComponent<Image>();
var removeButton = obj.transform.Find("RemoveButton").GetComponent<Button>();
// 아이템의 이름과 아이콘을 설정합니다.
itemName.text = item.itemName;
itemIcon.sprite = item.icon;
// 삭제 가능 토글이 켜져있을 때 삭제 버튼을 활성화합니다.
if (EnableRemove.isOn)
removeButton.gameObject.SetActive(true);
}
SetInventoryItems();
}
public void EnableItemsRemove()
{
if (EnableRemove.isOn)
{
// 토글이 활성화되었을 때 항목 제거를 활성화합니다.
foreach (Transform item in ItemContent)
{
item.Find("RemoveButton").gameObject.SetActive(true);
}
}
else
{
// 토글이 비활성화되었을 때 항목 제거를 비활성화합니다.
foreach (Transform item in ItemContent)
{
item.Find("RemoveButton").gameObject.SetActive(false);
}
}
}
public void SetInventoryItems()
{
// InventoryItemController 컴포넌트를 가진 게임 오브젝트들을 가져옵니다.
InventoryItems = ItemContent.GetComponentsInChildren<InventoryItemController>();
// 아이템 수에 맞게 InventoryItemController에 아이템을 추가합니다.
for (int i = 0; i < Items.Count; i++)
{
InventoryItems[i].AddItem(Items[i]);
}
}
}
------------------------
아이템프리펩의 RemoveButton의 OnClick +, 하이라키의 item 프리펩 넣기
InventoryItemController, RemoveItem()
'UNITY > Unity Study' 카테고리의 다른 글
카메라 컨트롤 (0) | 2023.07.05 |
---|---|
메티리얼 문양 크기편집 (0) | 2023.07.05 |
인벤토리 만들기 1("I"키로 여닫기) (0) | 2023.07.05 |
교과서 - 사과 받기 게임 (0) | 2023.07.04 |
물체 사라지게 만들기 (0) | 2023.06.30 |