유니티를 통해 개발을 하다보면 씬(Scene) 하나에 모든걸 담기 어렵고
비효율적인 순간이 종종 있다.
그래서 씬을 나누고 작업하면 씬들끼리 연결을 해줘야하는데
유니티 에는 SceneManager 라는 클래스가 존재하고 씬을 이동하는 순간에
SceneManager.LoadScene(" 원하는 씬 "); 메서드를 통해
원하는 씬으로이동이 가능하다.
씬이 이동하고 다른 씬이 호출 될 때 마다 발생하는 이벤트를 사용할 수 도 있는데
SceneManager.sceneLoaded += 원하는 메서드; 를 통해
씬이 이동 될 때 원하는 메서드를 실행 시킬 수 있다.
그래서 다른 씬으로 이동 했을 때 해당 씬이 어떤 씬인지 보여주는 코드로 만들어봤다.
using System.Collections;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using TMPro;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class EnterScene : MonoBehaviour
{
public Image AreaImage; // 텍스트의 배경
public TextMeshProUGUI AreaText; // 해당 씬에 보여지는 텍스트
private string AreaInfo; // 해당 씬의 정보를 담을 문자
public float WaitTime = 3f; // 씬에 텍스트가 보여지는 시간
public float DisableTime = 1f; // 점차 사라지는 표현을 위한 시간
Coroutine _co; //코루틴 선언
private void Awake()
{
SceneManager.sceneLoaded += Enter; // 처음 씬이 호출 될 때 Enter메서드가 호출됨
}
private void OnEnable()
{
SceneManager.sceneLoaded += Enter; // 비활성화 -> 활성화 되는 순간 Enter메서드가 호출됨
_co = StartCoroutine(FadeOutImage()); // 코루틴을 시작하고 선언해둔 코루틴에 담아둠
}
private void OnDisable()
{
if (_co != null)
{
StopCoroutine(_co); // 실행중인 코루틴이 있다면 비활성화 될 때 코루틴을 멈춤
}
SceneManager.sceneLoaded -= Enter; // 이벤트에서 해제시킴
}
private void Enter(Scene scene, LoadSceneMode mode)
{
if (scene.name == "HuntingGround") // 씬 체크후 정보담기
{
AreaInfo = "사냥터";
}
else if (scene.name == "Village")
{
AreaInfo = "마을";
}
AreaText.text = AreaInfo; // 담긴 정보를 텍스트로 넣어주기
gameObject.SetActive(true);
}
private IEnumerator FadeOutImage()
{
Color color = AreaImage.color; // 이미지의 색을 변경해주기 위한 변수
color.a = 1f; // 이미지의 시작 alpha값 초기화
AreaImage.color = color; // 이미지에 변경값 넣어주기
AreaText.alpha = 1f; // 텍스트의 시작 alpha값 초기화
yield return new WaitForSeconds(WaitTime); // 정해둔 시간 만큼 기다림
float _elapsedTime = 0f;
while (_elapsedTime < DisableTime)
{
// alpha 값이 1 -> 0 으로 _elapsedTime / DisableTime에 비례해서 변경됨
color.a = Mathf.Lerp(1f, 0f, _elapsedTime / DisableTime);
AreaText.alpha = Mathf.Lerp(1f, 0f, _elapsedTime / DisableTime);
AreaImage.color = color; // 이미지에 변경값 넣어주기
_elapsedTime += Time.deltaTime;
yield return null;
}
gameObject.SetActive(false);
_co = null; // 코루틴이 끝나면 null로 변경
}
}
위의 코드를 적용시킨 모습
반응형
'Today I Learned' 카테고리의 다른 글
[내일배움캠프] 실전 프로젝트 - 24.02.01 (0) | 2024.02.01 |
---|---|
[내일배움캠프] 실전 프로젝트 - ##>24.@1/31~ (0) | 2024.01.31 |
[내일배움캠프] 기술면접 연습 -람다식(Lambda Expression) (0) | 2024.01.29 |
[내일배움캠프] 실전 프로젝트 - 코드리뷰 (0) | 2024.01.26 |
[내일배움캠프] 실전 프로젝트 - Terrain으로 맵 만들어보기 (1) | 2024.01.25 |