-
[Unity] 스테이지 클리어 조건 Delegate로 구현쾌락없는 책임 (공부)/Unity 2022. 3. 27. 16:53반응형
개요
스테이지 해금 조건에는 여러가지가 있을 수 있습니다. 저의 경우 퍼즐 게임을 제작하면서 맵 내에 있는 코인을 전부 먹어야 클리어 되는 조건을 만들고 있었습니다. 이전에 개발을 한다면 각 스테이지마다 코인수, 흭득 함수를 따로따로 만들어서 하거나 Find 등을 사용했을 텐데 Delegate(스크립트에서 Action)을 사용해서 간단하고 여러군데 쓸 수 있는 방법을 사용했고 이를 기록하려고 포스팅을 했습니다.
각 동전에 Delegate(Action)을 넣어서 사용하자
< 동전 스크립트>
using System.Collections; using System.Collections.Generic; using UnityEngine; using System; public class Coin : MonoBehaviour { public event Action CoinGetEvent = null; private void OnTriggerEnter2D(Collider2D other) { if(other.CompareTag("Player")) { if(CoinGetEvent != null) CoinGetEvent(); //Destroy(this.gameObject); this.gameObject.SetActive(false); } } }
<스테이지 클리어에 사용되는 깃발>
using System.Collections; using System.Collections.Generic; using UnityEngine; public class CoinMapFlag : MonoBehaviour { [SerializeField] private GameObject CoinPrefab; [SerializeField] private Transform[] coinPositions; private SpriteRenderer sr; private Collider2D coll; private int coinCount; void Start() { coll = GetComponent<BoxCollider2D>(); sr = GetComponent<SpriteRenderer>(); SetFlag(false); coinCount = coinPositions.Length; for(int i = 0; i < coinCount; i++) { GameObject coin = Instantiate(CoinPrefab, coinPositions[i].position, Quaternion.identity); coin.GetComponent<Coin>().CoinGetEvent += CoinGetCallBack; } } private void CoinGetCallBack() { coinCount--; if(coinCount > 0) return; SetFlag(true); } private void SetFlag(bool input) { coll.enabled = input; sr.color = (input) ? new Color(1f, 1f, 1f, 1f) : new Color(1f, 1f, 1f, 0.5f); } }
일단 배경에 대해서 설명하면 '스테이지 클리어를 위해서는 깃발에 도달해야 하고', '깃발은 코인들을 다 먹어야 활성화가 된다' 입니다.
그래서 깃발에서 각 동전들을 프리팹에서 생성할 때 각 위치에 생성을 해 주면서 각 Coin 스크립트에 있는 event Action에 깃발 스크립트의 함수 CoinGetCallBack을 넣어줬습니다. 그리고 그 Acion을 동전 흭득할 때 사용하면서 클리어 조건을 확인할 수 있게 했습니다.
이거 쓰니깐 확실히 의존성도 줄어들고 코드도 깔끔, 기능을 넣기도 쉬워서 나름 만족하고 있습니다.
반응형'쾌락없는 책임 (공부) > Unity' 카테고리의 다른 글