미리 만들어놓고 소개해드리기가 정말 송구스럽습니다.
1. 데드라인 오브젝트 추가
앞서 소개한 바닥, 좌우 벽과 같은 방법으로 데드라인을 추가해줍니다.
색상은 자유롭게 변경하시면 되고 투명도만 좀 조절해주면 더욱 그럴싸해집니다.
참고로 투명도는 스프라이트 컬러를 누르고 4번째 A부분을 조절하시면 됩니다.
그리고 라인에 콜라이더2D 컴포넌트를 추가해주시고 IsTrigger에 체크해주세요.
IsTrigger는 물체가 충돌하지 않고 통과하게 됩니다.
2. 과일 오브젝트 추가 및 프리팹화
과일 에셋은 에셋스토어에서 무료로 받아서 사용했습니다.
해당 과일이 이 게임의 핵심입니다.
물리기반 게임이기 때문에 당연히 RigidBody2D가 들어가고,
구체이기 때문에 Circle Collider2D를 생성해 충돌영역을 설정해줍니다.
그리고 바로 프리팹화를 진행해주겠습니다.
우선 프로젝트창에 프리팹을 담아줄 Prefabs 폴더를 생성해주고,
폴더에 해당 과일 오브젝트를 끌어다 놓으면 자동 프리팹화가 진행됩니다.
3. 마우스 포인터를 이용한 이동
또 이 게임의 핵심인 마우스 포인터를 이용한 과일 오브젝트 이동입니다.
1) 화면을 터치하면서 좌우로 움직이면 그에 따라 과일이 이동합니다. 그리고 화면 밖으로 나갈 수 있으니
이동제한을 걸어둡니다.
2) 과일이 나올 스폰 오브젝트를 생성해줍니다.
3) 화면에서 손가락을 떼면 과일의 물리작용이 발동되고 그대로 떨어지도록 해줍니다.
1)
과일 오브젝트를 담당할 스크립트를 하나 생성해줍니다.
이 마우스 포인터에 대한 내용은 골드메탈님께 배웠습니다.
public class Fruits : MonoBehaviour
{
public Rigidbody2D rigid;
void Start()
{
// 처음 생성되면 떨어지지 않아야함.
rigid.simulated = false;
}
void Update()
{
if (isDrag)
{
// 마우스 포지션 받아오고
Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
// 위치제한값은 콜라이더 위치와 과일의 반지름을 대충 계산.
float leftLine = -2.7f + transform.localScale.x / 2;
float rightLine = 2.7f - transform.localScale.x / 2;
if(mousePos.x < leftLine)
{
mousePos.x = leftLine;
}
else if (mousePos.x > rightLine)
{
mousePos.x = rightLine;
}
// y,z값 고정.
mousePos.y = 5.5f;
mousePos.z = 0;
transform.position = mousePos;
}
}
public void Drag()
{
isDrag = true;
}
public void Drop()
{
isDrag = false;
rigid.simulated = true;
}
}
이 후 씬에 Touch를 담당할 이미지를 하나 생성해주겠습니다.
핵심은 터치패드 이미지에 Event Trigger 컴포넌트입니다.
여기서 포인터 다운(화면을 누르고 있을 때 발동)
포인터 업(화면에서 터치를 뗄 때 발동)
을 추가해주고 과일 스크립트의 IsDrag함수와 IsDrop함수를 각각 넣어줍니다.
해당 스크립트는 과일 오브젝트에 있으니 끌어다 놓으면 됩니다.
만약 이미 프리팹을 넣다가 실패하신다면 맞습니다. 실패합니다.
연결이 안되실겁니다. 이유는 현재 프리팹은 씬에 존재하지 않기 때문입니다. 찾을 수가 없는 것이죠.
일단 프리팹을 풀고 진행해도 뒤에선 똑같은 상황이 발생합니다.
이 부분은 조금 있다가 해결하겠습니다.
먼저 과일 생성 오브젝트를 만들어주겠습니다.
2)
FruitSpawner라는 스크립트를 만들어주었고,
이 스크립트는 과일이 스폰되는 상황에 대한 부분을 담당합니다.
public class FruitsSpawner : MonoBehaviour
{
public Fruits lastFruit;
public GameObject prfFruit;
// 과일 인스턴스 생성.
Fruits GetFruit()
{
// 이 게임오브젝트는 과일오브젝트이고, 과일스폰오브젝트 위치에서 생김.
GameObject objCircle = Instantiate(prfFruit, this.gameObject.transform);
// 과일 인스턴스를 받으며 해당 Fruit스크립트를 가짐.
Fruits instantCircle = objCircle.GetComponent<Fruits>();
return instantCircle;
}
public void NextFruit()
{
// 과일 인스턴스를 받음.
Fruits newCircle = GetFruit();
// 현재 생성된 과일.
lastFruit = newCircle;
// 코루틴 사용.
StartCoroutine("WaitNextCircle");
}
IEnumerator WaitNextCircle()
{
// 생성된 과일이 아직 떨어지지 않았다면 하지마.
while (lastFruit != null)
{
yield return null;
}
// 1초뒤에 NextFruit함수 호출.
yield return new WaitForSeconds(1.0f);
NextFruit();
}
}
이러면 설정해놓은 과일 스폰 오브젝트 위치에서 과일 인스턴스가 생성됩니다.
그리고 그 과일은 Fruit스크립트를 가지고 있으니 마우스 포인터에 반응합니다.
바로바로 생성되면 엉킬 수가 있으니 lastCircle에 넣어주고 lastCircle을 뱉어줍니다.
그리고 1초뒤에 다시 새로운 과일이 생성되는 코드입니다.
여기까지 했다면 아까 해결하지 못한 부분을 해결할 차례입니다.
3)
게임 전체를 관장해줄 GameManager 스크립트를 생성해줍니다.
여기서 터치 다운, 업 작업도 해줄 것입니다.
public class GameManager : MonoBehaviour
{
public FruitsSpawner fruitsSpawner;
public bool checkCircle;
// 화면을 누르고 있을 때 호출.
public void TouchDown()
{
// 생성된 구체가 없다면 리턴.
if (!checkCircle)
return;
// 생성된 구체가 있다면 화면을 누른채 드래그 가능.
fruitsSpawner.lastFruit.Drag();
}
// 화면에서 손을 뗄 때 호출.
public void TouchUp()
{
// 생성된 구체가 없다면 리턴.
if (!checkCircle)
return;
// 생성된 구체가 있다면 해당 구체 드랍.
fruitsSpawner.lastFruit.Drop();
// 다시 체크구체 복구.
checkCircle = false;
// 써클스포너의 생성 구체를 비워놔야 그 다음 구체 생성 가능.
fruitsSpawner.lastFruit = null;
}
}
TouchDown함수에서 Drag를,
TouchUp함수에서 Drop을 담당해줍니다.
그리고 다음 사진과 같이 게임매니저 스크립트를 가진 게임매니저 오브젝트를 연결시켜주고,
각 기능에 맞는 함수를 연결해줍니다.
설명이 다소 지저분하고 어지러웠습니다.
만들면서 작성했어야했는데 죄송합니다.
좀 더 신중하도록 하겠습니다.
감사합니다.
'Unity > Unity 물리기반 Merge게임 프로젝트(수박라이크)' 카테고리의 다른 글
[Unity 게임 프로젝트] 물리기반 머지게임(5) - 오디오 시스템 추가 (0) | 2024.04.29 |
---|---|
[Unity 게임 프로젝트] 물리기반 머지게임(4) - 점수 계산 기능, 게임 시작/종료 UI추가 (0) | 2024.04.29 |
[Unity 게임 프로젝트] 물리기반 머지게임(3) - 오브젝트 합치기, 애니메이션 (0) | 2024.04.29 |
[Unity 게임프로젝트] 물리기반 머지게임(1) - 모바일 설정, 배경화면 및 콜라이더 오브젝트 추가 (0) | 2024.04.23 |