일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 핀토스
- 파이썬
- 크래프톤정글
- KRAFTON JUNGLE
- project3
- 오블완
- 다익스트라
- anonymous page
- 알고리즘수업-너비우선탐색2
- 유니티
- 4기
- 추상클래스와인터페이스
- 전쟁-전투
- c#
- 이벤트 함수 실행 순서
- 알고리즘
- 크래프톤정글4기
- 크래프톤 정글
- 백준
- 티스토리챌린지
- Unity
- 연결리스트
- TiL
- kraftonjungle
- BFS
- 네트워크
- 크래프톤 정글 4기
- C
- User Stack
- pintos
Archives
- Today
- Total
말감로그
[Unity] Valley - 과일 나무(과일 , 나무조각 드랍) , 아이템 박스 인식 & 애니메이션 본문
728x90
과일 나무 드랍
과일 나무를 도끼로 한 번 치면 과일이 떨어지도록 했다.
과일이 스폰될 위치(FruitSpawn) 와 떨어질 위치(FallPos)를 만들었다.
각 0.5f의 거리를 유지하도록 총 3개의 fruit 프리팹을 생성하고, 코루틴을 사용하고 Lerp를 통해 떨어질 위치까지 부드럽게 이동시키게 했다.
void DropFruit()
{
isFruitDrop = true;
for (int i = 0; i < 3; i++)
{
Vector3 spawnPosition = fruitSpawnPos.position + new Vector3(i * fruitOffset - fruitOffset, 0, 0);
GameObject fruit = Instantiate(fruitPrefab, spawnPosition, Quaternion.identity);
StartCoroutine(MoveFruitToPosition(fruit, fallPos.position + new Vector3(i * fruitOffset - fruitOffset, 0, 0), 1f));
}
}
IEnumerator MoveFruitToPosition(GameObject fruit, Vector2 targetPosition, float duration)
{
Vector3 startPosition = fruit.transform.position;
float elapsedTime = 0f;
Item interactable = fruit.GetComponent<Item>();
if (interactable != null)
interactable.canInteract = false;
while (elapsedTime < duration)
{
fruit.transform.position = Vector2.Lerp(startPosition, targetPosition, elapsedTime / duration);
elapsedTime += Time.deltaTime;
yield return null;
}
fruit.transform.position = targetPosition;
interactable.canInteract = true;
}
과일 생성
이후 나무를 치면 나무도 쓰러지면서 나무조각 생성
레이캐스트를 사용해서 ItemBox를 인식하면 문이 열리고 벗어나면 닫히는 기능을 구현하였다.
레이캐스트 구간을 벗어났을 경우 자동으로 닫히는 기능을 구현하고 싶어 마지막으로 열었던 상자를 저장해서, 마지막으로 열었던 상자가 있다면 닫도록 하였다.
private ItemBox lastOpenedItemBox;
private bool isBoxOpen = false;
void Interactable()
{
RaycastHit2D rayHit = Physics2D.Raycast(rb.position, lastMoveDirection, 1f, LayerMask.GetMask("Chest"));
if (rayHit.collider != null)
{
ItemBox itemBox = rayHit.collider.GetComponent<ItemBox>();
if (Input.GetMouseButtonDown(0) && !isBoxOpen)
{
Debug.Log("아이템 박스 오픈");
isBoxOpen = true;
itemBox.anim.SetBool("isOpen", true);
lastOpenedItemBox = itemBox; // 마지막으로 열린 상자 저장
}
}
else if (isBoxOpen)
{
Debug.Log("아이템 박스 클로즈");
isBoxOpen = false;
// 마지막으로 열었던 상자가 있다면 닫기
if (lastOpenedItemBox != null)
{
lastOpenedItemBox.anim.SetBool("isOpen", false);
lastOpenedItemBox = null;
}
}
}
728x90
'TIL' 카테고리의 다른 글
[Unity] Valley - 판매 가능한 아이템 설정 (0) | 2024.10.30 |
---|---|
[Unity] Valley - 아이템 팔기(+ 아이템 판넬 UI) (2) | 2024.10.29 |
[Unity] Valley - 나무 자르기(나무 애니메이션, 나무조각 생성) (0) | 2024.10.25 |
[Unity] Valley - 식물 성장 코드 분리 및 확장성 개선 (0) | 2024.10.24 |
[Unity] Valley - DayCycle & 식물 성장 시스템 (1) | 2024.10.24 |