게임 개발 로그

레스토랑 대소동: 개발 노트 #13 본문

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

레스토랑 대소동: 개발 노트 #13

03:00am 2024. 11. 27. 21:06

 

0. 구현 화면

Perfectzone에 움직임 추가
설거지 그릇의 Hp UI 추가. 최상단 오브젝트의 위치로 옮김
제출 실패 시 그릇 진동 + 머터리얼 컬러 변경 추가
설거지 그릇이 꽉 찼을 경우 '깨끗한 접시가 부족해요' 문구가 팝업 UI로 출력

 

 

 

문제 및 해결 방법

문제 0. 최상단 그릇 위치에 따른 PlateHpUI 위치 수정

  • Plate.cs
    // isSelected, 최상단의 오브젝트에 Collision Event가 발생하면 UI 위치도 변경되도록 함.
    void OnCollisionEnter(Collision col)
    {
        StartCoroutine(IOffPlateKinematic());
        if (isSelected)
            Managers.Instance.Event.Publish(EEventType.SetPlateHpPosition);
    }

 

  • WashingArea.cs
    • void SetSelectPlateHpPosition(EventParam param)
      • hp ui의 위치를 바꿔 준다. 이때 주의할 점 = selectPlate.transform.position의 위치를 ui로 넘긴다.
	// 설거지 그릇이 0개면 hp ui를 비활성화함. 
    // 그게 아니라면 최상단 오브젝트를 찾아서 그 오브젝트의 isSelected를 true로 해줌.
    void SelectPlate()
    {
        if (plates.Count == 0)
        {
            washingUI.plateHp.gameObject.SetActive(false);
            return;
        }
        if (selectPlate != null)
            selectPlate.isSelected = false;
        selectPlate = plates[0];
        for (int i = 1; i < plates.Count; i++)
        {
            if (selectPlate.GetComponent<Transform>().position.y < plates[i].GetComponent<Transform>().position.y)
                selectPlate = plates[i];
        }
        selectPlate.isSelected = true;
    }


    // EEventType.SetPlateHpPosition 가 Publish 되었을 경우 이 함수가 호출됨.
    // hp ui의 위치를 바꿔 준다. 이때 주의할 점 = selectPlate.transform.position의 위치를 ui로 넘긴다.
    public void SetSelectPlateHpPosition(EventParam param)
    {
        if (washingUI.plateHp == null) 
            return;
        washingUI.plateHp.gameObject.SetActive(true);
        washingUI.SetPlateHpPosition(selectPlate.transform.position);
    }

 

 

  • WashingUI.cs
    • 스크린 좌표로 변경하지 않는 이유: Canvas의 Render Mode가 Screen to Space - Camera이기 때문.
    // 오브젝트의 위치를 전달받아 스크린 좌표로 "변경하지 않고" 그대로 transform.position을 해준다.
    public void SetPlateHpPosition(Vector3 position)
    {
        Vector3 pos = position;
        plateHp.transform.position = pos;
        pos = plateHp.rectTransform.anchoredPosition;
        pos.y += 150;
        plateHp.rectTransform.anchoredPosition = pos;
    }

 

 

 

문제 2. 콤보 이벤트 시 그릇 모두 삭제 후 새로 생성되는 문제

  • OrderInspector.cs
    • 기존 Combo든 아니든 EEventType.CorrectOrder를 Publish했기 때문에 모두 삭제한 후에 CorrectOrder 이벤트가 전해져서 설거지 그릇이 추가되는 현상이 나타났음.
  protected void SuccessOrder(int index, bool isComobo)
  {
      Customer customer = orderController.GetCustomer(index);
      if(customer != null)
      {
        customer.DeActivate();

        // 변경된 부분 (기존에는 조건 없이 무조건 실행)
        if (!isComobo)
        {
            Managers.Instance.Event.Publish(EEventType.CorrectOrder);
            gameDirector.IncreaseSuccessCount(cusFoodCount);
        }
        orderController.RemoveCustomer(index);
        DataMessenger.Instance.successCustomer++;
      }
  }

 

  • WashingArea.cs
    • EEventType.OnComboEvent 를 받는 함수를 추가함.
    • 모두 삭제된 후 설거짓거리가 또 추가되는 현상이 종종 발생하기에 createPlateCoroutine이 진행 중이라면 Stop해주는 부분을 추가함.
    private void OnComboEvent(EventParam param)
    {
        if (createPlateCoroutine != null)
            StopCoroutine(createPlateCoroutine);

        foreach (Plate plate in plates)
        {
            plate.DeActivate();
            platesQueue.Enqueue(plate);
            washingUI.FillHpFull();
        }
        Managers.Instance.Event.Publish(EEventType.FullDishState, new FullDishParam(false));
        plates.Clear();
        washingUI.plateHp.gameObject.SetActive(false);
    }