본문 바로가기

유니티 3D기본(Roll A Ball)

19. 스테이지 이동

Item 5개를 먹고 노란색 골인 지점에 들어가면 다음 스테이지로 넘어가는 로직을 구현해 보겠습니다.

 

다음 스테이지로 넘어가는 기준은 Item 5개를 먹었는가? 인데, 게임 전반에 대한 로직 관리는 보통 gameManager 라는 스크립트를 따로 만들어 관리합니다.

 

Hierarchy에서 빈 오브젝트를 만들어 GameManager이라 이름을 붙이고 GameManager 스크립트를 만들어 넣어 주겠습니다.

 

그리고 이 안에 다음과 같은 코드를 주어 현재 Stage 번호와, 먹어야하는 Item 갯수를 적어주겠습니다.

 

소스코드

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

public class GameManager : MonoBehaviour
{

    public int totaltemCount; //먹어야 하는 아이템 갯수
    public int stage; //스테이지 번호

    void Awake()
    {
        stage = 0;
    }

}

 

 

다음으로, 골인 지점을 하나 만듭니다.

 

그리고 Goal 오브젝트에 onTrigger를 체크해주고, Player의 스크립트에서 onTrigger 함수를 작성해줍니다.

여기서 Item을 5개 먹었는지 안먹었는지 조건문으로 나눠, 5개를 먹었다면 다음 Stage로 넘어가게 할 것입니다.

다음 Stage로 넘어간다는 건, 다음 Scene을 로드한다는 뜻입니다. 다음 Scene을 로드하는 LoadScene 메서드를 사용하려면 상단에 SceneManagement를 적어줘야합니다.

 

GameManager의 오브젝트를 가져와 사용하려면 맵핑을 해야합니다.

public으로 선언한 변수는 Inspector에서 바로 수정할 수 있습니다. GameManager 오브젝트를 드래그 앤 드랍해서 맵핑해주세요.

이렇게 하면 gm 변수에 GameManager 오브젝트가 담겨 타 스크립트에서 GameManager에 접근할 수 있게 됩니다.

 

소스코드

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement; //Scene과 관련된 메서드를 사용할 수 있습니다.

public class PlayerBall : MonoBehaviour
{
    Rigidbody rigid;
    AudioSource audio; 
    public GameManager gm; //GameManager 오브젝트 가져오기
    public float jumpPower;
    bool isJumping;
    public int itemCount;

    void Awake()
    {
        rigid = GetComponent<Rigidbody>();
        audio = GetComponent<AudioSource>(); 
        jumpPower = 30;
        isJumping = false;
        itemCount = 0;
    }

    void FixedUpdate()
    {
        float x = Input.GetAxisRaw("Horizontal");
        float z = Input.GetAxisRaw("Vertical");
        Vector3 move = new Vector3(x, 0, z);

        rigid.AddForce(move, ForceMode.Impulse);

    }

    void Update()
    {
        if (Input.GetButtonDown("Jump") && !isJumping)
        {
            isJumping = true;
            rigid.AddForce(new Vector3(0, jumpPower, 0), ForceMode.Impulse);
        }
    }

    void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.tag == "Floor")
        {
            isJumping = false;
        }
    }
    void OnTriggerEnter(Collider other)
    {
        if (other.tag == "Item")
        {
            itemCount++;
            audio.Play();
            other.gameObject.SetActive(false);
        }
        else if(other.tag == "Finish")
        {
            if (gm.totaltemCount == itemCount) //먹어야 하는 Item 개수와 현재 먹은 Item 개수가 같다면
            {
                gm.stage++; //스테이지 + 1
                SceneManager.LoadScene("Stage" + gm.stage); //Scene 이름을 매개변수로 주기
            }
            else { //Item을 다 먹지 못했다면
                SceneManager.LoadScene("Stage" + gm.stage); //현재 스테이지 다시 시작
            }
        }

    }
}

 

LoadScene 메서드는 매개변수로 Scene의 이름을 넘겨주면 됩니다. 

 

결과

 

'유니티 3D기본(Roll A Ball)' 카테고리의 다른 글

21. UI 만들기  (0) 2021.10.27
20. Scene 추가  (0) 2021.10.27
18. 카메라 이동으로 플레이어 따라가기  (0) 2021.10.26
17. 오디오 넣고 재생하기  (0) 2021.10.25
16. 아이템 먹기 구현  (0) 2021.10.24