게임의 핵심 요소 중 지형과 플레이어 움직임은 구현 완료하였으니, 남은 것들은 아래와 같다.
가장 먼저 도착지점 생성 및 도착 관련 처리부터 작업하였다. FinishLine이라는 이름으로 빈 오브젝트를 생성하고, 자식 오브젝트로 2D sprite 중 Circle, Square 형태를 추가하여 간단하게 도착지점 이미지를 만들었다.
이제 플레이어 캐릭터가 해당 도착지점을 통과하는 순간 이루어지는 처리들(이펙트 및 효과음 재생, 레벨 재시작)들을 구현해야 한다.
코드 작업에 앞서, 이펙트와 효과음을 먼저 작업해 준다.
FinishLine 오브젝트에 AudioSource 컴포넌트를 추가하고, 자식 오브젝트로 Effect - Particle System도 추가해 준다.
효과음의 경우 이따 작업할 OnTriggerEnter2D에서 재생 처리만 해주면 되기 때문에, AudioSource 컴포넌트의 AudioClip에 도착 시 효과음으로 사용할 소스만 추가해주면 끝이다.
이펙트도 마찬가지로 형태만 설정해주고, OnTriggerEnter2D 메소드에서 재생하는 형태로 구현한다.
아까 FinishLine의 자식 오브젝트로 생성해둔 particle system에서 이펙트 설정을 진행하는데, Finish Effect 항목 하위의 각 요소들은 간단하게 아래와 같은 기능을 한다.
- Duration: 이펙트 유지 시간
- Looping: 지속 시간 만료 후 반복 여부
- Starting Lifetime: 이펙트 생성 후 사라지기까지의 시간
- Start Speed: 이펙트 사출 속도
- Play on Awake: 플레이와 동시에 이펙트 출력 여부
그밖에 Emission 항목 하위에서는 이펙트가 사출되는 형태를 변경할 수 있으며, Finish Effect와 Emission의 요소들을 통해 아래처럼 이펙트를 설정해 주었다.
이제 설정해둔 이펙트와 효과음을 스크립트를 통해 동작시키기만 하면 된다.
FinishLine이라는 이름으로 스크립트를 생성하고, FinishLine의 컴포넌트로 추가해준다.
도착 지점의 경우 플레이어와 충돌하지 않고, 통과하면서 특정 처리들이 이루어지기 때문에 OnTriggerEnter2D 메소드를 이용해서 코드 작업을 진행한다.
당연하게도 아까 생성해둔 FinishLine 오브젝트에 RigidBody2D 컴포넌트를 추가해주어야 하며, 플레이어와 충돌하지 않고 처리가 이루어져야하기 때문에 Is Trigger 값을 true로 설정해준다.
코드 작업은 아래와 같이 진행하였다.
// 씬 리로드를 위해 SceneManagement 사용
using UnityEngine.SceneManagement;
// 씬 리로드까지 딜레이 설정
[SerializeField] float LoadTime = 1f;
// 이펙트 효과 변수 선언
[SerializeField] ParticleSystem finishEffect;
// 게임 종료 여부를 확인하는 boolean 변수 선언 및 초기화
bool hasFinished = false;
void OnTriggerEnter2D(Collider2D other)
{
// 태그와 게임 종료 여부를 확인해서 도착 처리 진행
if (other.tag == "Player" && !hasFinished)
{
// 이펙트, 효과음 출력후 잠시 뒤 씬 리로드
finishEffect.Play();
GetComponent<AudioSource>().Play();
Invoke("ReloadScene", LoadTime);
}
}
void ReloadScene()
{
// 각 씬의 인덱스는 File - Build Settings 메뉴에서 확인 가능
SceneManager.LoadScene(0);
}
이렇게 도착지점 도달 시 이루어지는 처리들도 모두 구현하였다.