20240822 TIL-2

Sungchan Ahn(안성찬)·2024년 8월 22일

내일배움캠프

목록 보기
15/104

1, 2주차 응용 게임 만들어보기 (떨어지는 칼 피하는 게임) - 2일차

어제에 이어 오늘 원하는 기능을 모두 구현해 응용 게임을 완성했다. 다만 기능들을 더 좋은 방향으로 구현할 수 있는지 나중에 더 공부해보고 확인할 필요가 있다고 느꼈다.

오늘한 작업

  • Rtan - Energy
    Rtan 캐릭터에 Energy 오브젝트가 닿으면 캐릭터의 이동속도가 n초동안 빨라지는 효과 부여
    n초 동안 캐릭터의 이동속도가 늘었다가 다시 돌아와야해서 이 기능을 구현하기 위해 코루틴(Coroutine)을 알아보고 이용해보았다.

    • 코루틴(Coroutine) : 유니티 스크립트는 기본적으로 한 프레임에 모든 작업이 처리되고 다음 프레임으로 넘어가기 때문에 여러 프레임에 걸쳐 일어나는 동작에 대응하기 어렵다. 이럴 때 코루틴을 이용한다. 아래와 같은 형태로 사용하며 StartCoroutine(_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;
    }
  • HpBar

    그림과 같이 Life에 따라 하트모양의 HpBar가 변하는 기능을 fillamount를 이용해 만들어보았다.
	public GameObject hpBar;
	void Update()
	{
		hpBar.GetComponent<Image>().fillAmount = life / 10.0f;
	}
  • Rtan - Heart
    Rtan이 Heart 오브젝트와 닿으면 life가 증가. life의 상한은 10
// 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);
        }
    }

  • EndPanel

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();
    }
}
profile
게임 개발 기록

0개의 댓글