GameManager 스크립트 생성하고 Game Manager라는 이름으로 게임매니저를 만든 후에 컴포넌트로 추가해준다.
public class GameManager : MonoBehaviour
{
public Dongle lastDongle;
public void TouchDown()
{
lastDongle.Drag();
}
public void TouchUp()
{
lastDongle.Drop();
}
}
기존 터치패드의 버튼 Event Trigger를 게임 매니저의 TouchDown, TouchUp 함수로 변경해준다.
Dongle Group이라는 오브젝트를 만들고 위치를 0, 8, 0으로 수정해서 해당 위치에서 동글이만들어지도록 구현한다.
프리팹의 트랜스폼은 0, 0, 0으로 초기화해야한다.
Dongle GetDongle()
{
//동글 프리팹 복사해서 가져옴, 이 때 부모는 동글 그룹으로 설정
GameObject instant = Instantiate(donglePrefab, dongleGroup);
Dongle instantDongle = instant.GetComponent<Dongle>();
return instantDongle;
}
Instantiate의 반환은 GameObject형이다. Dongle 형태로 얻고 싶으면 instant라는 게임 오브젝트에 넣어놓고 해당 오브젝트에서 GetComponent로 동글을 가져와야 한다.
public class GameManager : MonoBehaviour
{
public Dongle lastDongle;
public GameObject donglePrefab; //동글 프리팹
public Transform dongleGroup; //동글이 생성될 위치
private void Start()
{
NextDongle();
}
Dongle GetDongle()
{
//동글 프리팹 복사해서 가져옴, 이 때 부모는 동글 그룹으로 설정
GameObject instant = Instantiate(donglePrefab, dongleGroup);
Dongle instantDongle = instant.GetComponent<Dongle>();
return instantDongle;
}
void NextDongle()
{
//생성된 동글을 가져와 new Dongle로 지정
Dongle newDongle = GetDongle();
lastDongle = newDongle;
StartCoroutine(WaitNext()); //대기후 NextDongle을 실행하는 코루틴 시작
}
IEnumerator WaitNext()
{
while(lastDongle != null)
{
yield return null; //한 프레임을 대기한다.
}
yield return new WaitForSeconds(2.5f); //2.5초를 대기한다
NextDongle();
}
public void TouchDown()
{
if (lastDongle == null) //lastDongle이 없으면 실행하지 않음
return;
lastDongle.Drag();
}
public void TouchUp()
{
if (lastDongle == null) //lastDongle이 없으면 실행하지 않음
return;
lastDongle.Drop();
lastDongle = null; //드랍하면서 보관용도로 저장해둔 변수는 null로 비운다.
}
}
위처럼 로직을 구현하면 실행하는 순서가 다음과 같다.
이제 동글을 복사해야하기 때문에 코루틴으로 lastDongle이 null이 될때까지 대기하도록 구현한다.
void NextDongle()
{
//생성된 동글을 가져와 new Dongle로 지정
Dongle newDongle = GetDongle();
lastDongle = newDongle;
StartCoroutine(WaitNext()); //대기후 NextDongle을 실행하는 코루틴 시작
}
IEnumerator WaitNext()
{
while(lastDongle != null)
{
yield return null; //한 프레임을 대기한다.
}
yield return new WaitForSeconds(2.5f); //2.5초를 대기한다
NextDongle();
}
이렇게 수정하면 위 6번 과정 이후에 7번 과정이 추가된다.
yield 없이 무한루프를 돌리면 유니티가 멈춰버린다. 무한 루프로 대기시키고 싶으면 루프안에 반드시 yeild를 넣어주어야 한다.
다양한 레벨로 동직 스프라이터를 바꿔주기위해 동글 프리팹에 animator 프리팹을 추가 후에 AcDongle 컨트롤러를 연결한다.
애니메이터 창을 살펴보면 레벨 파라미터에 따라 해당하는 레벨로 애니메이션이 실행되도록 구현이 되어있다.
Level 0, Level 1 애니메이션이 없으므로 새로 생성해보자. 애니메이션 폴더에 Level 0 Animation을 생성한다. 이제 애니메이터 창에서 Level 0을 선택한후 모션에 우리가 방금 생성한 Level 0을 추가한다.
이제 하이어라키 창의 Dongle을 산텍헤 동글을 컨트롤하도록 애니메이션을 작성해보자.
레벨 1도 동일하게 새로 애니메이션 생성 후 애니메이터 창에서 Level 1을 눌러 Motion에 새로 생성한 level1로 설정해준다.
이제 Dongle 스크립트를 수정해 애니메이터 컴포넌트를 받아오고 동글이 활성화 될때마다 레벨에 맞는 애니메이션이 실행되도록 설정해준다.
Animator anim; //애니메이션
void Awake()
{
rigid = GetComponent<Rigidbody2D>();
anim = GetComponent<Animator>();
}
void OnEnable()
{
anim.SetInteger("Level", level);
}
좀 랜덤하게 동글이 생성되도록 게임 매니저에서 level을 랜덤하게 설정하도록 구현한다.
void NextDongle()
{
//생성된 동글을 가져와 new Dongle로 지정
Dongle newDongle = GetDongle();
lastDongle = newDongle;
lastDongle.level = Random.Range(0, 3); //레벨 0, 1, 2 에서 랜덤하게 생성되도록 구현
lastDongle.gameObject.SetActive(true); //레벨 설정 후 활성화
StartCoroutine(WaitNext()); //대기후 NextDongle을 실행하는 코루틴 시작
}
게임 프레임이 너무 비정상적으로 높아 실제로 인게임에서는 버벅거리는 느낌이 발생한다. 게임 매니저에서 프레임을 잡아주도록 수정한다.
private void Awake()
{
Application.targetFrameRate = 60; //프레임을 60으로 고정
}
이후에 동글 프리팹의 리지드바디 2D의 interpolate 속성을 interpolate로 설정해준다.
interpolate : 이전 프레임을 비교하여 움직임을 부드럽게 보정해준다.