과일 합치기까지 구현한 상태(특정 시점 이후 실행X -> 수정 필요)
<구현해야 할 기능>
같은 과일끼리 충돌하면 다음 단계 과일로 합쳐지는 기능- 첫 클릭에는 원하는 위치로 이동, 두 번째 클릭에 낙하
- 이전 과일 낙하 후 새 과일 생성
- 점수 UI
- 게임 진행도에 따른 과일 생성 확률 조정
[ MakeFruits2.cs ]
( MakeFruits"2"인 이유: MakeFruits는 과일 생성과 위치 이동을 한 번에 하려다 보니 꼬여서 버림 )
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MakeFruit2 : MonoBehaviour
{
private GameObject fruit;
[SerializeField] private GameObject cherry;
[SerializeField] private GameObject strawberry;
[SerializeField] private GameObject grape;
[SerializeField] private GameObject orange;
[SerializeField] private GameObject apple;
private GameObject instance;
private int click = 0; // 제거
void Awake()
{
click = 0; // 제거
Make();
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
MoveFruit();
click += 1; // 제거
}
}
void Make()
{
int fruitNumber = Random.Range(8, 13);
//Vector3 pos = transform.position;
//pos.y += 3.5f; <= 원래는 모든 과일 프리팹에 추가할 생각으로 짠 코드. 인스턴스화 위치를 pos로 하려 했다.
switch (fruitNumber)
{
case 8: fruit = cherry; break;
case 9: fruit = strawberry; break;
case 10: fruit = grape; break;
case 11: fruit = orange; break;
case 12: fruit = apple; break;
default: break;
}
instance = Instantiate(fruit, transform.position, transform.rotation); // 빈 오브젝트 Fruits에 부여, Fruits의 position에 과일 생성
}
private void MoveFruit() // 경우를 나누지 않는 걸로 수정
{
if (click == 1)
{
Vector3 pos = instance.transform.position;
pos.x += Input.mousePosition.x;
Destroy(instance);
instance = Instantiate(fruit, pos, transform.rotation);
}
else if (click == 2)
{
fruit.AddComponent<Rigidbody2D>();
click = 0;
StartCoroutine("DropWait");
Make();
}
}
IEnumerator DropWait()
{
yield return new WaitForSeconds(3f); // 0.5f로 수정
}
}
위치 조정 및 낙하
처음엔 첫 클릭(click == 1)엔 위치 조정, 두 번째 클릭(click == 2)에 낙하하게 하려 했는데 너무 어려움
위치 조정도 안 되고 낙하도 지멋대로고 난리남
진짜 수박 게임은 클릭 위치 조정을 여러번 해도 되는 걸로 기억해서 단순화시킨 거였는데
알고 보니 진짜가 더 단순했다: 한 번 클릭하면 위치 조정과 동시에 낙하됨
그래서 그렇게 바꿈!
[ MakeFruits2.cs ]
void Update()
{
if (Input.GetMouseButtonDown(0))
{
MoveFruit();
//click 제거
}
}
void Make()
{
int fruitNumber = Random.Range(8, 13);
switch (fruitNumber)
{
case 8: fruit = cherry; break;
case 9: fruit = strawberry; break;
case 10: fruit = grape; break;
case 11: fruit = orange; break;
case 12: fruit = apple; break;
default: break;
}
instance = Instantiate(fruit, transform.position, transform.rotation);
}
private void MoveFruit() // 마우스 좌클릭했을 때 실행
{
Vector3 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
pos.y = 0;
instance.transform.position += pos; // 마우스의 x좌표만큼 과일 이동
if (instance.GetComponent<Rigidbody2D>() == null) // 리지드바디 없는 경우 추가
{
instance.AddComponent<Rigidbody2D>();
}
StartCoroutine("DropWait"); // 낙하 대기
}
처음엔 pos = Input.mousePosition 로 했는데, 이게 게임 세계 좌표가 아니라 화면 좌표여서 위치 조정이 안 됐던 거임
그래서 Camera.main.ScreenToWorldPoint 로 바꿔줬더니 잘됨 bb (지피티 최고)
드디어 위치 조정도 되고 낙하도 잘된다!!!
새 과일 생성
근데 낙하 후 3초 기다리라고 했는데 안 기다림
Make() 를 IEnumerator DropWait 안에 넣었더니 해결됨 왠지는 잘 모르겠음.. (역시 지피티가 알려줌)
실행해봤더니 3초 길어서 0.5초로 수정함
근데 문제가 생김
"클릭했을 때 낙하"되게 하려고 앞 5개의 과일은 리지드바디를 없앴단 말이야? ( 앞 5개 과일만 '클릭'으로 생성 나머지는 합성으로 생성)
근데 합성하면 합성 위치에 그대로 있는 경우가 생김...
합성 결과가 앞 5개 과일에 해당해서 생기는 문제였음 ㅠ
그래서 Combine.cs를 수정해줌 다음 단계 객체 생성 후 리지드바디가 없으면 추가해주는 걸로!
[ Combine.cs ]
private void OnCollisionEnter2D(Collision2D collision)
{
if ( string.Compare(this.gameObject.name, collision.gameObject.name) == 0 )
{
isCombined = true;
Combine combine = collision.gameObject.GetComponent<Combine>();
if (combine.isCombined)
{
return;
}
else
{
Destroy(collision.gameObject);
Destroy(this.gameObject);
instance = Instantiate(nextLevel, transform.position, transform.rotation);
// 합성된 과일에 리지드바디가 없는 경우 추가
if( instance.GetComponent<Rigidbody2D>() == null)
{
instance.AddComponent<Rigidbody2D>();
}
StartCoroutine("CombineWait"); // 너무 빨리 합성돼서 0.5초 기다리도록 추가해줌
}
}
}
오 이제 진짜 잘됨
위치 조정 + 낙하는 이렇게 생각보다 쉽게 끝 ~~
'Unity > 게임' 카테고리의 다른 글
[Unity] 수박 게임 만들기 - 그 외 수정사항 (0) | 2024.02.02 |
---|---|
[Unity] 수박 게임 만들기 - 과일 생성 관련 수정 사항 (0) | 2024.02.02 |
[Unity] 수박 게임 만들기 - Game Over UI 만들기 (0) | 2024.02.02 |
[Unity] 수박 게임 만들기 - 점수 갱신 (0) | 2024.02.01 |
[Unity] 수박 게임 만들기 - 합치기 (2) | 2024.01.30 |