https://ko.wikipedia.org/wiki/%EC%8B%B1%EA%B8%80%ED%84%B4_%ED%8C%A8%ED%84%B4
싱글턴 패턴 - 위키백과, 우리 모두의 백과사전
싱글턴 패턴 위키백과, 우리 모두의 백과사전.
ko.wikipedia.org
싱글턴 패턴(Singleton pattern)을 따르는 클래스는, 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameManager
{
private static GameManager instance;
public bool isGameOver = false;
private GameManager()
{
}
public static GameManager GetInstance()
{
if (GameManager.instance == null)
{
GameManager.instance = new GameManager();
}
return GameManager.instance;
}
}
씬전환시 오브젝트 유지하기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class App : MonoBehaviour
{
private void Awake()
{
DontDestroyOnLoad(this.gameObject);
}
void Start()
{
SceneManager.LoadScene("LogoScene");
}
}
| 씬전환시 오브젝트 유지하기 DontDestroyOnLoad(this.gameObject); |
유니티 액션을 이용한 이벤트 전달, 싱글턴 객체 리턴
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public class GameDirector : MonoBehaviour
{
public UnityAction onGameover;
void Update()
{
if (GameManager.GetInstance().isGameOver) return;
this.time -= Time.deltaTime;
if (this.time <= 0)
{
GameManager.GetInstance().isGameOver = true;
Debug.Log("------------ GAME OVER ------------");
this.onGameover();
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameMain : MonoBehaviour
{
public GameDirector gameDirector;
public void Init(GameEnums.eItemType selectedItemType)
{
this.gameDirector.onGameover = () => {
this.ShowPopupResult();
};
}
private void ShowPopupResult()
{
this.uIPopupResult.Show();
}
}
| 유니티 액션을 이용한 이벤트 전달 using UnityEngine.Events; public class GameDirector : MonoBehaviour { public UnityAction onGameover; void Update() { this.onGameover(); } } -------------------------------------------------- 이벤트 호출 public class GameMain : MonoBehaviour { public GameDirector gameDirector; public void Init() { this.gameDirector.onGameover = () => { this.ShowPopupResult(); }; } private void ShowPopupResult() { this.uIPopupResult.Show(); } } |
씬전환 효과 (페이드 인, 페이드 아웃 wiht DOTween)
코루틴 구현과 DOTween 구현
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;
using UnityEngine.SceneManagement;
public class LogoMain : MonoBehaviour
{
public Image dimSprite;
public AnimationCurve curve;
public float duration = 1f;
private float delta = 0;
//Start는(만) StartCoroutine없이 실행할 수 있음
IEnumerator Start()
{
//Test
Show();
yield return new WaitForSeconds(3);
this.Hide();
}
public void Show()
{
DOTween.ToAlpha(() => dimSprite.color, x => dimSprite.color = x, 0, 1)
.SetEase(Ease.InQuad).OnComplete(() =>
{
Debug.Log("Show Complete");
});
//StartCoroutine(ShowRoutine());
}
//https://easings.net/ko
//https://docs.unity3d.com/ScriptReference/AnimationCurve.Evaluate.html
//https://m.blog.naver.com/dmknight/220662002178
private IEnumerator ShowRoutine()
{
var color = this.dimSprite.color;
while (true)
{
this.delta += Time.deltaTime;
float alpha = Mathf.Lerp(1, 0, curve.Evaluate(this.delta / this.duration));
color.a = alpha;
this.dimSprite.color = color;
Debug.Log(alpha);
if (alpha <= 0)
{
break;
}
yield return null;
}
Debug.Log("Show Complete");
}
public void Hide()
{
DOTween.ToAlpha(() => dimSprite.color, x => dimSprite.color = x, 1, 1)
.SetEase(Ease.InQuad).OnComplete(() =>
{
Debug.Log("show complete");
SceneManager.LoadScene("TitleScene");
});
}
}
씬전환시 데이터 전달
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class LobbyMain : MonoBehaviour
{
public Button[] btns; //메뉴 버튼
public Button btnStart; //시작 버튼
private GameEnums.eItemType selectedItemType = GameEnums.eItemType.None;
void Start()
{
for (int i = 0; i < this.btns.Length; i++)
{
var btn = this.btns[i];
var idx = i;
btn.onClick.AddListener(() => {
this.selectedItemType = (GameEnums.eItemType)idx;
});
}
this.btnStart.onClick.AddListener(() => {
Debug.LogFormat("Click: {0}", this.selectedItemType);
//SceneManager.LoadScene("GameScene");
AsyncOperation operation = SceneManager.LoadSceneAsync("GameScene");
operation.completed += (AsyncOperation obj) => {
var gameMain = GameObject.FindObjectOfType<GameMain>();
gameMain.Init(this.selectedItemType);
};
});
}
}
| AsyncOperation operation = SceneManager.LoadSceneAsync("GameScene"); operation.completed += (AsyncOperation obj) => { var gameMain = GameObject.FindObjectOfType<GameMain>(); gameMain.Init(this.selectedItemType); }; SceneManager.LoadSceneAsync https://docs.unity3d.com/kr/530/ScriptReference/SceneManagement.SceneManager.LoadSceneAsync.html AsyncOperation https://docs.unity3d.com/kr/530/ScriptReference/AsyncOperation.html AsyncOperation .completed https://docs.unity3d.com/ScriptReference/AsyncOperation-completed.html |
1. 싱글톤 클래스를 만들 수 있는가?
2. 비동기 씬로드를 할 수 있는가?
3. 씬전환시 데이터를 전달할 수 있는가?
4. 대리자/이벤트를 사용할 수 있는가?
'Unity > 게임 엔진 응용 프로그래밍' 카테고리의 다른 글
| [Cinemachine] 시네머신 카메라 구성, Follow Cam 만들기 (0) | 2021.11.30 |
|---|---|
| [Unity] 데이터 테이블 로드하기 (0) | 2021.10.22 |
| [Unity 3D] MiniRPG : 랜덤한 위치에 몬스터 생성 (0) | 2021.10.22 |
| [Unity 3D] MiniRPG : 몬스터와 전투 (0) | 2021.10.20 |
| [Unity 3D] MiniRPG : 캐릭터 공격 애니메이션 (0) | 2021.10.19 |