어제에 이어 오늘 원하는 기능을 모두 구현해 응용 게임을 완성했다. 다만 기능들을 더 좋은 방향으로 구현할 수 있는지 나중에 더 공부해보고 확인할 필요가 있다고 느꼈다.
오늘한 작업
Rtan - Energy
Rtan 캐릭터에 Energy 오브젝트가 닿으면 캐릭터의 이동속도가 n초동안 빨라지는 효과 부여
n초 동안 캐릭터의 이동속도가 늘었다가 다시 돌아와야해서 이 기능을 구현하기 위해 코루틴(Coroutine)을 알아보고 이용해보았다.

IEnumerator _Coroutine()
{
기능
yield return new WaitForSeconds();
} private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.CompareTag("Energy"))
{
Destroy(collision.gameObject);
StartCoroutine(EnergyBuff(buffTime));
}
}
IEnumerator EnergyBuff(float buffTime)
{
rtanSpeed = 0.1f;
yield return new WaitForSeconds(buffTime); // buffTime만큼 기다린다.
rtanSpeed = 0.05f;
}

public GameObject hpBar;
void Update()
{
hpBar.GetComponent<Image>().fillAmount = life / 10.0f;
}
// GameManager
public void Recovery(float plusLife)
{
life += plusLife;
if (life >= 10.0f) life = 10.0f;
lifeTxt.text = life.ToString();
}
// Heart
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.CompareTag("Ground"))
{
Destroy(gameObject);
}
if (collision.gameObject.CompareTag("Player"))
{
Destroy(gameObject);
GameManager.Instance.Recovery(plusLife);
}
}


1) 최고기록 저장
2) Try again 버튼
3) 최고기록 시간 아래 R 버튼 : ResetScore 버튼. 이번판 점수로 최고기록 설정. ResetScoreBtn에서 PlayerPrefs의 데이터를 모두 지우면 기록을 저장하는 로직이 GameManager의 Update에서 실행되기 때문에 현재 점수가 최고기록으로 저장된다.
// GameManager
void GameOver()
{
isPlay = false;
Time.timeScale = 0.0f;
nowScoreTxt.text = time.ToString("N2");
if (PlayerPrefs.HasKey(key))
{
float best = PlayerPrefs.GetFloat(key);
if (best < time)
{
PlayerPrefs.SetFloat(key, time);
bestScoreTxt.text = time.ToString("N2");
}
else
{
bestScoreTxt.text = best.ToString("N2");
}
}
else
{
PlayerPrefs.SetFloat(key, time);
bestScoreTxt.text = time.ToString("N2");
}
endPanel.SetActive(true);
}
// RetryBtn
public class RetryBtn : MonoBehaviour
{
public void Retry()
{
SceneManager.LoadScene("MainScene");
}
}
// ResetScoreBtn
public class ResetScoreBtn : MonoBehaviour
{
public Text bestScoreTxt;
public void ResetScore()
{
PlayerPrefs.DeleteAll();
}
}