일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
- 값/참조/주소에 의한 전달
- 백준 파이썬
- r-value참조자
- 회전 및 자리 이동 연산
- 운영체제 기능
- 프로그래머스 배열만들기4
- 네트워크 결합
- 입출력 관리자
- C언어 스택 연산
- auto 키워드
- 범위 기반 for문
- 알고리즘 조건
- 프로그래머스 푸드 파이트 대회
- LAN의 분류
- 문자형 배열
- 주기억장치
- l-value참조자
- 원형 연결 구조 연결된 큐
- 괄호 검사 프로그램
- 문제해결 단계
- getline()함수
- const l-value참조자
- const화
- string유형
- C언어 덱
- IPv4 주소체계
- 논리 연산
- C언어 계산기 프로그램
- c언어 괄호검사
- 유형 변환
- Today
- Total
chyam
[unity 3d] - 오브젝트들을 인벤토리에 저장하기 본문
<구현 목표>
오브젝트들을 인벤토리에 저장해보기!
저번에는 한개의 오브젝트만 저장해서 변수를 지정하지 않았기 때문에 이를 수정해주었습니다.추후에 인벤토리 추가기능을 만들때 약간 더 수정할 예정입니다!
먼저, Raycast를 통해 충돌한 물체의 tag와 이름을 저장해줍니다.
"G"키를 누르면 먼저 tag를 확인해줍니다.
void ColliderObject()
{
Vector3 startPosition = transform.position + Vector3.up * 10f;
RaycastHit hit;
if (Physics.Raycast(startPosition, transform.forward, out hit, 12))
{
string hitString = hit.collider.gameObject.tag;
string hitName = hit.collider.gameObject.name;
if (Input.GetKeyDown(KeyCode.G)) // 물체 얻기
{
TagCheck(hitName, hit, hitString);
}
...
}
}
tag가 "flower"이나 "log"이면 Inventory 스크립트에 있는 Check(name)을 실행시킨 뒤 파괴해줍니다.
void TagCheck(string name, RaycastHit hit, string hitString)
{
if (hitString == "flower" || hitString == "log")
{
Inventory.Instance.Check(name);
Destroy(hit.collider.gameObject);
}
}
Check(name)은 오브젝트의 이름과 아이템의 이름을 비교하여 올바른 곳에 넣어줍니다.
public void Check(string name)
{
FreshSlot();
int i = 0;
for (; i < slots.Length; i++)
{
if (slots[i].item != null)
{
if (name.Substring(0, 3) == "log" && "log" == slots[i].item.itemName.Substring(0, 3))
{
print(name);
slotText[0].text = (int.Parse(slotText[0].text) + 1).ToString();
}
else if (name.Substring(0, 3) == "flo" && name == slots[i].item.itemName) //슬롯과 이름이 같을때만
{
int slotnum = int.Parse(name.Substring(name.Length - 1, 1));
slotText[slotnum].text = (int.Parse(slotText[slotnum].text) + 1).ToString();
break;
}
}
}
for(i = 0; i < slots.Length; i++) {
if (slotText[i].text != "0") //0이 아니면 숫자가 보임
{
slotText[i].gameObject.SetActive(true);
}
else
{
slotText[i].gameObject.SetActive(false);
}
if (int.Parse(slotText[i].text) == 5 && slots[i].item.itemName == "log")
{
if (!bridge.activeSelf) // 다리가 공개되지 않았을때
{
print("나무를 5개 모았습니다!");
bridge.SetActive(true);
slotText[i].text = "0";
}
}
}
}
처음에 꽃을 한번 먹으면 3개씩 저장되는 오류가 있었는데, 이는 슬롯의 이름을 비교할때 "flo"로만 비교하여 flower로 시작하는 슬롯이 3개라 발생한 오류였습니다..
name은 오브젝트의 이름으로, log로 시작하는건 하나밖에 없어서 간단하게 구현해주었습니다.
log의 이름들은 다 log_a1 , a2...이런식으로 되어있어서 0번째부터 3자리까지 "log"이고, 아이템의 이름도 "log"일 때, slotText의 텍스트를 1 증가시켜주었습니다.
flower은 색깔이 3가지라서 flower1, flower2 ... 이런식으로 되어있어서 name이 아이템이름과 같고 name이 flo로 시작할때, 마지막에 있는 숫자를 인덱스로 하여 slotText의 값을 증가시켜주었습니다.
int i = 0;
for (; i < slots.Length; i++)
{
if (slots[i].item != null)
{
if (name.Substring(0, 3) == "log" && "log" == slots[i].item.itemName)
{
slotText[0].text = (int.Parse(slotText[0].text) + 1).ToString();
}
else if (name.Substring(0, 3) == "flo" && name == slots[i].item.itemName) //슬롯과 이름이 같을때만
{
int slotnum = int.Parse(name.Substring(name.Length - 1, 1));
slotText[slotnum].text = (int.Parse(slotText[slotnum].text) + 1).ToString();
break;
}
}
}
0이 아닐때 숫자가 보이게 해주었고, 아이템 이름이 log일때 5이상이고 다리의 active 상태가 false일때만 다리를 보여주게하고 개수를 0으로 초기화 해주었습니다.
for(i = 0; i < slots.Length; i++) {
if (slotText[i].text != "0") //0이 아니면 숫자가 보임
{
slotText[i].gameObject.SetActive(true);
}
else
{
slotText[i].gameObject.SetActive(false);
}
if (int.Parse(slotText[i].text) == 5 && slots[i].item.itemName == "log")
{
if (!bridge.activeSelf) // 다리가 공개되지 않았을때
{
print("나무를 5개 모았습니다!");
bridge.SetActive(true);
slotText[i].text = "0";
}
}
}
'unity' 카테고리의 다른 글
[unity] - 인벤토리 아이템 클릭 시 설명창 띄우기 (0) | 2025.03.18 |
---|---|
[kinect] - 유니티 키넥트v2 연결 (0) | 2025.03.17 |
[unity 3d] - 인벤토리 슬롯을 클릭할 때 색상을 변경하기 (0) | 2025.03.07 |
[unity 3d] - 바라보는 오브젝트를 키 입력을 통해 인벤토리에 저장하기 (0) | 2025.03.03 |
[unity 3d] - 마우스 움직임을 통해 플레이어가 해당 방향을 바라보도록 설정하기 (0) | 2025.02.27 |