게임 개발 로그
개발 노트 #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