본문 바로가기
공부/유니티

유니티3D 공부(Part 1 - 5, Part 1 END) 씬 전환하기, 타이틀 화면, 승리, 패배 씬 추가

by 라이티아 2024. 9. 26.

대학 과제를 풀지 못하는 나를 보며

이번 글에서는 타이틀, 승리, 패배를 구현하게 된다

 

이전 글에서는 적이 플레이어를 추적하고 애니메이션을 재생하게 만들었다

 

이제 타이틀을 만들기 위해서 새로운 씬을 만든다

빈 씬을 하나 만들어 주었다

바닥은 게임에서 사용하는 것과 동일하니, 기존 씬의 plane을 가져온다

 

여기에 유니티짱을 프리팹 상태로 가져온다

이제 여기에 UI를 이용하여 타이틀 이름을 적어준다

책에서는 이미지가 있는데, 그냥 TextMeshPro 로 처리하겠다

 

UI - Text-TextMeshPro를 생성한다

그러면 이렇게 생성되는데, 위치를 잡고 필요한 글자를 적어준다

대충 이렇게 된다

 

왠지 모르겠는데, 책에서는 여기서 딱히 뭔가 없이 끝나버린다

 

 

대충 의도한데로 생성해 보겠다

 

우선 지금 상태를 보면

그냥 아무것도 없는 허공 상태이다

 

이걸 좀 멋지게 꾸며보자

 

우선 유니티짱의 얼굴을 강조하도록 카메라를 이동시킨다

이제 여기에 애니메이션을 넣어서 뭔가 자세를 취하도록 해준다

애니메이터를 만들어 적당한 자세를 넣어주고, 살짝 위치를 보정해주면

뭔가 있어보이는 무언가를 만들 수 있다

 

이제 마우스를 누르면 게임을 시작하도록 스크립트를 짜준다

 

우선 씬을 사용하기 위해서 빌드 세팅에서 필요한 씬을 넣어준 뒤

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

public class Title : MonoBehaviour
{
    void Start()
    {
        
    }

    void Update()
    {
        if(Input.GetMouseButtonDown(0))
        {
            SceneManager.LoadScene("SampleScene");
        }
    }
}

이렇게 코드를 넣어준다

 

마우스를 클릭하면 지정한 씬으로 넘어가는 구조이다

 

테스트를 해보자

그냥 저냥 잘 굴러가는걸 확인할 수 있다

 

이제 이것에 연장선으로 패배와 승리도 씬을 만들어 연결하면 된다

 

상황에 맞는 텍스트를 넣어준 뒤

 

이제 상황에 맞게 애니메이션을 넣어야 하는데, 각각 애니메이터를 넣는 방식도 있지만, 좀 더 효율적으로 관리하기 위해서 파라미터를 사용한다

기존에 사용한 title용 애니메이터에 승리, 패배 애니메이션을 추가한 뒤

 

Anystate에서 트랜지션을 넣어서 관리한다

각 애니메이션을 관리할 파라미터를 만들고, equal로 확인한다

 

이제 유니티짱의 애니메이션을 관리할 스크립트를 만든다

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

public class SetAni : MonoBehaviour
{
    public int ani = 0;
    Animator animator;
    void Start()
    {
        animator = GetComponent<Animator>();
        animator.SetInteger("ani", ani);
    }
}

이렇게 하면, 유니티에서 간편하게 애니메이션을 설정할 수 있다

 

.........

아아아아악!!!

 

플레이어의 애니메이션을 잘못 건들였다....

 

이럴때는 아직 push하지 않은 git에서 암전히 들고와주면 된다

고마워요 Github!!

 

이제 플레이어의 애니메이션이였던 애니메이터를 승리, 패배씬의 유니티짱에게 넣어준다

 

 

 

언제나 그렇듯 버그가 생겼다

계속해서 애니메이션 첫 0.몇초가 반복되는 현상이 발생했다

뭔가 anystate에서 문제가 있는 것 같은데, 그냥 단순하게 해결해 보자

 

직접 play 하도록 변경하면 된다

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

public class SetAni : MonoBehaviour
{
    public int ani = 0;
    Animator animator;
    void Start()
    {
        animator = GetComponent<Animator>();
        if(ani == 1) animator.Play("JUMP01");
        else if(ani == 2) animator.Play("DAMAGED01");
    }
}

이렇게 직접 실행하도록 변경한다

그러면 트랜스퍼 없이도 애니메이션을 재생할 수 있다

이상없이 작동한다

 

이제 이걸 기존의 플레이 공간에서 이어지도록 하면 된다

플레이어의 스크립트를 수정한다

void Update()
    {
        Vector3 direction = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));

        if(direction.sqrMagnitude > 0.01f)
        {
            Vector3 forward = Vector3.Slerp
            (
                transform.forward, direction, rotationSpeed * Time.deltaTime / Vector3.Angle(transform.forward, direction)
            );
            transform.LookAt(transform.position + forward);
        }
        characterController.Move(direction * moveSpeed * Time.deltaTime);

        animator.SetFloat("Speed", characterController.velocity.magnitude);

        if(GameObject.FindGameObjectsWithTag("Coin").Length == 0)
        {
            //Application.LoadLevel(Application.loadedLevel);
            //SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
            SceneManager.LoadScene("Win");
            //Debug.Log("scence reload");
        }
    }

    void OnTriggerEnter(Collider other)
    {
        if(other.tag == "Coin") Destroy(other.gameObject);
        if(other.tag == "Enemy") SceneManager.LoadScene("Defeat");
    }

코인을 다 먹을시, 적과 충돌할시에 각 씬으로 이동하도록 연결한다

 

이렇게 해서 코인먹기 게임을 완성했다

 

전체적인 흐름을 보면 이렇게 된다

 

 

뭔가 완벽하게 새롭지는 않지만, 그래도 많은걸 배울 수 있었던 챕터였다

 

 

다음 챕터가 기대된다

 

 

 

사용된 모든 유니티 파일, 코드는 본 깃에 정리되어 있다

 

GitHub - NoNamed02/Unity3D_Study_to_UnityChan

Contribute to NoNamed02/Unity3D_Study_to_UnityChan development by creating an account on GitHub.

github.com