포탈을 밟으면 이동하고, 화면이 어두워졌다 밝아지는 효과를 위해 Fade In / Out 효과를 주었다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class FadeScript : MonoBehaviour
{
public Image Panel;
float time = 0f;
float F_time = 1f;
public void Fade()
{
StartCoroutine(FadeFlow());
}
IEnumerator FadeFlow()
{
Panel.gameObject.SetActive(true);
time = 0f;
Color alpha = Panel.color;
while (alpha.a < 1f)
{
time += Time.deltaTime / F_time;
alpha.a = Mathf.Lerp(0, 1, time);
Panel.color = alpha;
yield return null;
}
time = 0f;
yield return new WaitForSeconds(1f);
while (alpha.a > 0f)
{
time += Time.deltaTime / F_time;
alpha.a = Mathf.Lerp(1, 0, time);
Panel.color = alpha;
yield return null;
}
Panel.gameObject.SetActive(false);
yield return null;
}
}
화면이 전환되면서 어두워졌다가 밝아지는 효과로
Fade Out → 전환 → Fade In 한다.
아래는 참고한 영상
https://www.youtube.com/watch?v=NYdLInZVsAM
그러나 DOTween 사용을 위해 방식을 변경하였다. (아래 작성)
PortalForDemo.cs
private void OnTriggerEnter2D(Collider2D other)
{
Debug.Log($"충돌 : {other.name}");
if (other.CompareTag("Player"))
{
Debug.Log("플레이어는 포탈에 들어갔습니다.");
Managers.Scene.LoadNextScene();
}
}
우선 첫번째로 포탈이동
오브젝트와 트리거 이벤트 발생시
LoadNextScene을 호출하면서 씬을 전환한다.
using System.Collections;
using System.Collections.Generic;
using UnityEditor.Timeline.Actions;
using UnityEngine;
using UnityEngine.SceneManagement;
public class SceneManagerEx : IManager
{
public SceneBase CurrentScene => GameObject.FindObjectOfType<SceneBase>(); // 현재 씬 정보 반환
public int SceneNum => SceneManager.GetActiveScene().buildIndex; // 현재 씬 번호 반환
private FadeScript fade;
public void Init()
{
fade = GameObject.FindObjectOfType<FadeScript>();
}
public void Clear()
{
}
public void LoadScene(Defines.SceneType sceneType)
{
if (sceneType == Defines.SceneType.None)
{
Debug.LogWarning("Invalid SceneType");
return;
}
Managers.Clear();
SceneManager.LoadScene(sceneType.ToString());
}
private IEnumerator CorLoadNextScene()
{
if (fade == null)
{
fade = GameObject.FindObjectOfType<FadeScript>();
}
if (fade != null)
{
fade.Fade();
yield return new WaitForSeconds(fade.Ftime);
}
LoadScene();
}
public void LoadNextScene()
{
Managers.Instance.StartCoroutine(CorLoadNextScene());
}
public void LoadScene()
{
int nextSceneNum = SceneNum + 1;
Managers.Clear();
SceneManager.LoadScene(nextSceneNum);
Debug.Log(nextSceneNum);
}
}
코루틴 메서드(CorLoadNextScene)을 통해 fade null 체크를 하고 null이면 FadeScript를 찾고
null이 아닐경우 Fade() 함수 호출, fade.Ftime 만큼 코루틴 실행 후 LoadScene을 해준다.
빈 오브젝트를 만든뒤 fade in, out 효과를
Light 2D 효과를 이용하여 구현한다. (Light Type → Global)
private Light2D light2d;
public float Ftime = 1f; // 페이드가 몇 초간 지속될지 정하는 값
private void Start()
{
DontDestroyOnLoad(gameObject);
if (light2d == null)
{
light2d = GetComponent<Light2D>();
}
}
public void FadeIn()
{
Color color = light2d.color;
DOTween.To(() => color, x => light2d.color = x, Color.white, Ftime);
}
public void Fade()
{
Color color = light2d.color;
DOTween.To(() => color, x => light2d.color = x, Color.black, Ftime).OnComplete(() => FadeIn());
}
포탈을 타고 다음씬을 넘어가더라도 데이터가 파괴되지 않고
그대로 갈 수 있도록 DonDestoryOnLoad(gameObject)를 해준다.
이후 fade out 효과를 위해 color 변수에 light2d.color 값을 넣어주고
Ftime 만큼 black으로 변환되서 완료되면 Fade In 메서드를 호출해 Fade In 효과가 발생하는 방식
아래는 참고자료
https://m.blog.naver.com/dooya-log/221320177107
[Asset] Unity3D 'DOTween' 1 : 기본 기능과 팁
+23.07.26 내용 수정 및 보완 [ DOTween ] 오브젝트의 애니메이션 혹은 부드러운 값 변경 시 기존의 유...
blog.naver.com
'개발일지 > 최종프로젝트' 카테고리의 다른 글
241220(금) [플레이어 상태 및 UI(HP 체력)] (0) | 2024.12.20 |
---|---|
241218(수) [Prefab 동적생성하기] (0) | 2024.12.18 |
241216(월) [공격 기능, 몬스터에게 데미지 주기] (1) | 2024.12.16 |
241211(수) [버그, 내일 할것] (0) | 2024.12.11 |
241210(화) [NPC 대화 업데이트] (1) | 2024.12.10 |