게임 개발 로그
개발 노트 #6 본문



0. 구현
- 랜덤 요소
// WashingAre private int GetRandomHpCount() { // TODO: 수식 수정 int count = UnityEngine.Random.Range(3, level * 3); return count; } private int GetRandomCreateCount() { // TODO: 수식 수정 int count = UnityEngine.Random.Range(1, level + 1); return count; } IEnumerator ICreatePlates(int createCnt) { for (int i = 0; i < createCnt; i++) { if (platesQueue.Count == 0) yield break; Plate plate = platesQueue.Dequeue(); // TODO: random plate.Activate(GetRandomHpCount()); plates.Add(plate); selectPlate = plate; yield return new WaitForSeconds(0.2f); } createPlateCoroutine = null; } private void OnAddPlate(EventParam param) { if (selectPlate == null || selectPlate.CurHp == selectPlate.MaxHp) AddPlate(GetRandomCreateCount()); else PutInPlate(GetRandomCreateCount()); }
- 주문 성공 / 설거지 가득 참 이벤트
- 해당하는 이벤트 타입과 Param 클래스를 추가함
public enum EEventType { CorrectOrder, // 추가 FullDishState, // 추가 Max } public class FullDishParam : EventParam // 추가 { public bool isFullDish; public FullDishParam(bool isFullDish) { this.isFullDish = isFullDish; } }
- 주문 성공: OrderInspector 에서 EventBusManager.Instance.Publish(EEventType.CorrectOrder);를 발생시킴.
- 설거지 가득 참: WashingArea에서 아래와 같은 이벤트를 발생시킴.
if (IsFullDish()) EventBusManager.Instance.Publish(EEventType.FullDishState, new FullDishParam(IsFullDish()));
- 설거지 성공/실패 진동, 이펙트
- 설거지 성공 이펙트
- WashingUI 하위에 RippleEffect를 둬서 성공 시에 RippleEffect를 Play.

- 설거지 실패 진동 효과
private void Update() { MoveIndicator(); if (Input.GetKeyDown(KeyCode.Return)) { if (coWrongEffect == null) // coWrongEffect가 실행 중 아닐 때만 설거지 시도 가능 { if (IsWashingSuccess()) { EventBusManager.Instance.Publish(EEventType.SuccessWash, new WashEventParam(decreaseAmount)); successEffect.Play(); } else coWrongEffect = StartCoroutine(WrongAnswerEffect()); } } } // 진동하는 효과 코루틴 IEnumerator WrongAnswerEffect() { float curTime = 0; Vector2 temp = actionZone.anchoredPosition; wrongImage.gameObject.SetActive(true); while ( curTime <= 1.0f ) { curTime += Time.deltaTime; actionZone.anchoredPosition = temp; actionZone.anchoredPosition += new Vector2(0, UnityEngine.Random.Range(-3, 3)); yield return null; } wrongImage.gameObject.SetActive(false); coWrongEffect = null; }
1. 문제점
- 게임이 반복될 때마다 동일한 이벤트가 쌓이는 문제
- 시간을 관리하는 GameDirector에서 게임이 오버됐을 때 이벤트 버스를 초기화하는 방식으로 수정함.
// GameDirector.cs if (playTime <= 0) { DisplayResultScore(); isGameOver = true; EventBusManager.Instance.Clear(); }
99. 노션 링크
https://www.notion.so/2024-11-18-9050eddb11a54a7fb0657d710fc2807d