게임 개발 로그

개발 노트 #6 본문

게임 개발/레스토랑 대소동

개발 노트 #6

03:00am 2024. 11. 19. 18:52

 

 

주문 성공 시 설거지 추가
설거지 실패 시 UI 진동 이펙트

 

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

'게임 개발 > 레스토랑 대소동' 카테고리의 다른 글

레스토랑 대소동: 개발 노트 #8  (1) 2024.11.20
개발 노트 #7  (1) 2024.11.19
개발 노트 #5  (2) 2024.11.11
개발 노트 #4  (2) 2024.11.11
개발 노트 #3  (0) 2024.11.11