Coding Feature.

[Unity 3D] 3D 퐁 만들기 #2 점수 시스템, Scene 매니저, Ball 속도 상승 구현 본문

Toy Project/MICRO-PONG [Unity3D]

[Unity 3D] 3D 퐁 만들기 #2 점수 시스템, Scene 매니저, Ball 속도 상승 구현

codingfeature 2024. 1. 18. 23:12

우선, 점수 시스템을 구현하겠습니다.

 

점수는 플레이어가 공을 한 번 튕길때마다 +1을 해주는 방식으로 구현하려고 합니다.

 

그리고 점수는 +1이 될 때마다 화면에 큼지막하게 표시되다가 천천히 사라지도록 해보겠습니다.

 

우선 Canvas와 Text 게임 오브젝트를 만들었습니다.

 

그리고 게임 매니저 스크립트에 public int score 변수를 선언해줍니다.

 

그 뒤 Player 게임 오브젝트에 플레이어 스크립트를 다음과 같이 작성해주었습니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class PlayerScript : MonoBehaviour
{
    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Ball"))
        {
            GameManager.Instance.score += 1;
            StartCoroutine(ShowScore());
        }
    }

    IEnumerator ShowScore()
    {
        yield return null;
        GameManager.Instance.scoreText.GetComponent<Text>().text = "" + GameManager.Instance.score;

        float text_alpha = 1.0f;
        while(text_alpha > 0.0f)
        {
            Color new_color = GameManager.Instance.scoreText.GetComponent<Text>().color;
            new_color.a = text_alpha;
            GameManager.Instance.scoreText.GetComponent<Text>().color = new_color;

            text_alpha -= 0.01f;
            yield return new WaitForSeconds(0.01f);
        }
    }
}

 

플레이어 오브젝트와 Ball 이 닿았을 때 게임 매니저의 score을 +1 시켜주고 ShowScore이라는 코루틴을 호출시킵니다.

 

여기서 코루틴을 사용한 이유는,

Update() 함수와 별개로 코루틴을 호출시켜서 화면의 글자가 점차 사라지는 효과를 연출하기 위해서였습니다.

 

ShowScore 함수는 처음 점수를 String으로 만들어주고 Text의 color 속성 중 alpha 값을 처음에는 1로 설정한 뒤에 whille문을 0.01초씩 간격마다 반복 실행하여 점차 알파 값을 낮추게 됩니다.

 

따라서 위 함수가 호출될때마다 공이 플레이어에게 닿을 때마다 글자가 처음 나타나고 조금씩 사라지게 됩니다.

 

 

그리고 Scene Manager를 구현했습니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using scenemanager = UnityEngine.SceneManagement.SceneManager;

public class SceneManager : MonoBehaviour
{
    private static SceneManager instance;

    public static SceneManager Instance
    {
        get
        {
            return instance;
        }
    }

    private void Awake()
    {
        if (instance)
        {
            Destroy(instance);
            return;
        }

        instance = this;
        DontDestroyOnLoad(this.gameObject);
    }
    public void LoadScene(string sceneName)
    {
        scenemanager.LoadSceneAsync(sceneName);
    }

    public void QuitGame()
    {
        Application.Quit();
    }

    public void ResetScene()
    {
        scenemanager.LoadSceneAsync(scenemanager.GetActiveScene().buildIndex);
    }
}

 

 

그 다음 공을 튕길때마다 속도가 점점 상승하는 것을 구현하겠습니다.

 

우선 게임 매니저에 ballSpeedIncrement 변수를 추가해서 개발 도중 값을 수정 가능하도록 했습니다.

그리고 Ball 스크립트에 어떤 값을 인자로 넘겨주면 속도를 더해주는 함수를 선언했습니다.

 

public class BallScript : MonoBehaviour
{
    public float ballSpeed;
..
    public void AddBallSpeed(float value)
    {
        ballSpeed += value;
    }
}

 

이 함수는 Player 스크립트에서 공을 튕길때마다 호출되도록 하겠습니다.

 

public class PlayerScript : MonoBehaviour
{
    GameObject ball;
    private void Awake()
    {
        ball = GameObject.Find("Ball");
    }
    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Ball"))
        {
            GameManager.Instance.score += 1;

            ball.GetComponent<BallScript>().AddBallSpeed(GameManager.Instance.ballSpeedIncrement);
            StartCoroutine(ShowScore());
        }
    }
	..
}

 

 

 

그리고 프로젝트 아이디어 몇 개가 더 생각나서 트렐로에 추가하였습니다.

 

 

그 다음 메인 메뉴, 게임 오버 화면과 효과음, 배경음악을 관리할 사운드 매니저를 구현하겠습니다!