1. 오브젝트 합치기(Merge)
두 개의 같은 모양의 과일 오브젝트가 닿으면
하나는 업그레이드되서 다음 과일 모양으로,
다른 하나는 사라지는 기능을 구현하려합니다.
합쳐지는 중에 같은 모양의 과일이 닿을 수도 있으니
합쳐지지 않고 있는 과일끼리만 합쳐지게 만들어보겠습니다.
합쳐지는 기능은
OnCollisionStay2D를 사용.
합쳐지는 중인 과일은
bool값으로 처리.
public class Fruits : MonoBehaviour
{
public SpriteRenderer spriteRenderer;
// 다음 레벨의 과읾 모양을 담은 리스트.
public List<Sprite> listSprite;
// 합쳐지는 중인지 판별.
public bool isMerge;
// 해당 과일의 레벨로 같은 모양의 과일인지 판별.
public int level;
void OnCollisionStay2D(Collision2D collision)
{
// 닿은 오브젝트가 해당 태그를 가지고 있다면
if (collision.gameObject.tag == "Circle")
{
Fruits other = collision.gameObject.GetComponent<Fruits>();
// 해당 오브젝트와 닿은 오브젝트의 레벨이 같고,
// 둘 다 합쳐지는 중이 아니고,
// 레벨이 최대 레벨이 아니라면
if (level == other.level && !isMerge && !other.isMerge && level < 6)
{
// 두 오브젝트의 포지션 값 받아와서,
float thisX = gameObject.transform.position.x;
float thisY = gameObject.transform.position.y;
float otherX = other.transform.position.x;
float otherY = other.transform.position.y;
// 해당 옵젝의 높이가 닿은 옵젝의 높이보다 높거나
// 높이가 같을 때 왼쪽에 있다면,
if (thisY > otherY || (thisY == otherY && thisX > otherX))
{
// 합쳐라.
Merge(other.transform.position);
// 사라져라.
other.gameObject.SetActive(false);
// 남은 해당 옵젝은 레벨업.
LevelUp();
}
}
}
}
// 합치는 함수.
public void Merge(Vector3 otherPos)
{
// 합쳐지는 중으로 바꿔주고,
isMerge = true;
// 물리엔진 꺼서 원하는 방향으로 이동하게끔 만들어준다.
rigid.simulated = false;
StartCoroutine(MergeRoutine(otherPos));
}
IEnumerator MergeRoutine(Vector3 otherPos)
{
// 해당 과일은 Lerp를 사용해서 닿은 과일 포지션으로 쏙 들어가게 만들어준다.
transform.position = Vector3.Lerp(transform.position, otherPos, 1f);
yield return null;
// 다시 합쳐지는 중을 해체하고, 물리엔진도 작동.
isMerge = false;
rigid.simulated = true;
}
// 레벨업
public void LevelUp()
{
// 레벨업 도중에 합쳐지지 중 작동.
isMerge = true;
// 움직이지마.
rigid.velocity = Vector2.zero;
rigid.angularVelocity = 0;
StartCoroutine("LevelUpRoutine");
}
IEnumerator LevelUpRoutine()
{
// 크기 업그레이드.
float scaleX = transform.localScale.x + 0.35f;
float scaleY = transform.localScale.y + 0.35f;
transform.localScale = new Vector3(scaleX, scaleY, 1);
yield return new WaitForSeconds(0.2f);
// 0.2초 뒤에 레벨업.
level++;
// 레벨업을 하면 레벨에 맞는 과일모양으로 Sprite 교체.
for (int i = 1; i < listSprite.Count; i++)
{
if (i == level)
{
spriteRenderer.sprite = listSprite[i];
}
}
}
2. 애니메이션
과일 등장 애니메이션을 추가해보았습니다.
먼저 과일 프리팹에 Animator를 추가해주었습니다.
Level0 과일이 등장하는 애니메이션을 추가하겠습니다.
오브젝트의 사이즈는 0에서 원래 크기로 나오게 만들어줬습니다.
그리고 애니메이션의 Loop Time을 해제해야 등장할 때 한번만 실행됩니다.
'Unity > Unity 물리기반 Merge게임 프로젝트(수박라이크)' 카테고리의 다른 글
[Unity 게임 프로젝트] 물리기반 머지게임(5) - 오디오 시스템 추가 (0) | 2024.04.29 |
---|---|
[Unity 게임 프로젝트] 물리기반 머지게임(4) - 점수 계산 기능, 게임 시작/종료 UI추가 (0) | 2024.04.29 |
[Unity 게임 프로젝트] 물리기반 머지게임(2) - 데드라인 오브젝트 추가, 과일 오브젝트 추가 및 프리팹화, 마우스 포인터를 이용한 오브젝트 이동 및 이동제 (0) | 2024.04.23 |
[Unity 게임프로젝트] 물리기반 머지게임(1) - 모바일 설정, 배경화면 및 콜라이더 오브젝트 추가 (0) | 2024.04.23 |