| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
- 값/참조/주소에 의한 전달
- C언어 덱
- 프로그래머스 푸드 파이트 대회
- 운영체제 기능
- 문자형 배열
- 회전 및 자리 이동 연산
- l-value참조자
- 논리 연산
- 주기억장치
- 입출력 관리자
- auto 키워드
- 프로그래머스 배열만들기4
- 문제해결 단계
- const l-value참조자
- C언어 계산기 프로그램
- 알고리즘 조건
- string유형
- 원형 연결 구조 연결된 큐
- 범위 기반 for문
- C언어 스택 연산
- LAN의 분류
- r-value참조자
- 유형 변환
- const화
- getline()함수
- 네트워크 결합
- IPv4 주소체계
- 백준 파이썬
- c언어 괄호검사
- 괄호 검사 프로그램
- Today
- Total
chyam
[unity] - 버튼 클릭하여 저장된 정보 불러오기 본문
클릭한 정보(요리 재료)를 저장하여 최종 화면에서 정보에 관한 이미지가 나타나도록 해주었습니다!
먼저, 주문 사항을 체크해주는 UI를 만들어줍니다.
check_menu( Panel ) 을 추가해주고 그 안에 내용물을 넣어줍니다.
item들은 button으로 만들어 클릭되게 만듭니다.


그리고, 클릭했을때 색이 변하게하여 무엇이 선택되었는지 알 수 있도록 해줍니다!

using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
public class CheckMenu : MonoBehaviour
{
// 리스트를 string형으로 저장, 다른곳에서 접근할수 있도록함
public static List<string> selectedNames = new List<string>();
private Image image;
private bool isSelect = false; // 선택되었는지 여부
private void Awake()
{
image = GetComponent<Image>();
}
public void player_select()
{
string thisname = transform.GetChild(0).name; // 클릭한 버튼의 자식에위치한 (재료의) 이름
if (isSelect)
{
isSelect = false;
selectedNames.Remove(thisname); // 선택된 리스트에서 제거
image.color = new Color32(255, 255, 255, 255); // 원래 색
}
else
{
isSelect = true;
selectedNames.Add(thisname); // 선택된 리스트에 추가
image.color = new Color32(220, 200, 200, 255); // 선택된 색
}
}
}

스크립트를 item1, item2 .. 에 추가해주고, onclick부분에 빨간 부분을 끌어다가 놓아준뒤,

색이 바뀌는 메서드를 연결해줍니다!
완료 버튼을 누르면, 다음 특수 재료를 선택하는 창으로 넘어갑니다.
public GameObject selectMenu;
...
public void completeBtn()
{
this.gameObject.SetActive(false);
selectMenu.gameObject.SetActive(true);
}

CompleteBtn에 위와같이 onclick을 추가해주면 클릭시 이 체크메뉴가 사라지고 다음 체크 메뉴가 나타납니다!
특수재료 메뉴


select 부분에는 UIManager 스크립트를 추가하여 관리할수있도록 해줍니다.

using UnityEngine;
using UnityEngine.SceneManagement;
using System.Collections.Generic;
using System.IO;
using UnityEngine.UI;
using System.Collections;
public class UIManager : MonoBehaviour
{
public GameObject menuPanel;
List<string> names;
private void Start()
{
names = CheckMenu.selectedNames;
}
[System.Serializable]
public class Ingredient
{
public string key; // 재료 이름 저장
public string value; // 재료 포함 여부
}
[System.Serializable]
public class Sandwich
{
public string name; // 샌드위치 이름
public List<Ingredient> ingredients; // 샌드위치 재료
}
[System.Serializable]
public class SandwichListWrapper
{
public List<Sandwich> sandwiches; // 샌드위치 리스트
}
public void LoadSandwiches() // Json 파일 읽어와서 알맞은 샌드위치를 불러와야함.
{
string path = Path.Combine(Application.streamingAssetsPath, "menu.json"); // StreamingAsset 파일 안에 있는 menu.json을 불러온다
int cnt = names.Count; // 선택된 재료의 갯수
if (File.Exists(path)) // 파일이 존재하면
{
string json = File.ReadAllText(path); // 파일을 읽어들임
SandwichListWrapper wrapper = JsonUtility.FromJson<SandwichListWrapper>(json); // json파일을 읽어들여 객체로 반환
foreach (var sandwich in wrapper.sandwiches)
{
int tmp_len = 0; // 선택된 재료와 일치하는 갯수
foreach (var ingredient in sandwich.ingredients)
{
for(int i = 0; i < cnt; i++)
{
if (ingredient.key == names[i] && ingredient.value !="X") // X인거 제외해줘야함.
{
tmp_len++;
}
}
}
if (tmp_len == cnt) // 선택된 재료와 일치하는 샌드위치
{
Debug.Log($" 샌드위치: {sandwich.name}");
}
}
}
else // 파일 존재 X
{
Debug.LogWarning("menu.json 파일이 없습니다.");
}
}
}
names는 내가 이전에 저장했던 재료들의 이름이 담겨있으므로 불러와서 저장해줍니다.
그리고, json 파일은 아래와같이 저장되어있습니다.
{
"sandwiches": [
{
"name": "xxSandwich",
"ingredients": [
{ "key": "pickle", "value": "O" },
{ "key": "mustard", "value": "O" },
{ "key": "cabbage", "value": "O" },
{ "key": "chili", "value": "O" },
{ "key": "tuna", "value": "O" }
]
},
{
"name": "yySandwich",
"ingredients": [
{ "key": "pickle", "value": "O" },
{ "key": "mustard", "value": "X" },
{ "key": "cabbage", "value": "O" },
{ "key": "chili", "value": "O" },
{ "key": "tuna", "value": "O" }
]
}
]
}
각 select_menu 들에 아래와같이 스크립트를 추가해주고, onclick도 처음에 했던것처럼 선택되면 분홍색이 되도록 해줍니다.

완료 버튼에는 아래와같이 해줍니다. 클릭하면 주방이 나올수있도록 하고, 클릭된것과 저장된 샌드위치 정보를 비교하여 알맞은 레시피인지 확인합니다.

...
public void nextScene()
{
SceneManager.LoadScene("Kitchen");
}
...
주방 씬에서는


기본적으로 빵은 있어야하므로 미리 보이게 해줍니다.

CookManager을 만들어서 샌드위치 이미지가 보이도록 관리해줍니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CookManager : MonoBehaviour
{
List<string> strings = CheckMenu.selectedNames; // 선택된 항목 불러옴
public GameObject sandwich;
public int ChildCnt;
void Start()
{
ChildCnt = sandwich.transform.childCount; // 샌드위치 재료 갯수
approachChild(ChildCnt); // 알맞는 재료 보여주기
}
void approachChild(int cnt)
{
foreach (string s in strings) {
for (int i = 0; i < cnt; i++) {
if (sandwich.transform.GetChild(i).name.Contains(s)){ // 선택된 재료의 이름이 있을때
sandwich.transform.GetChild(i).gameObject.SetActive(true); // 보여줌
}
}
}
}
}

'unity' 카테고리의 다른 글
| [Unity] - UI 버튼 선택/해제 구현 (1) | 2025.09.01 |
|---|---|
| [Unity] - 스프레드 시트와 연동하기 (0) | 2025.08.21 |
| [Unity] - JSON 파일 저장하고 불러오기 (1) | 2025.06.04 |
| [unity] - 인벤토리 아이템 클릭 시 설명창 띄우기 (0) | 2025.03.18 |
| [kinect] - 유니티 키넥트v2 연결 (0) | 2025.03.17 |