게임 개발 로그
레스토랑 대소동: 개발 노트 #13 본문
0. 구현 화면
문제 및 해결 방법
문제 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로 넘긴다.
- void SetSelectPlateHpPosition(EventParam param)
// 설거지 그릇이 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);
}
'게임 개발 > 레스토랑 대소동' 카테고리의 다른 글
레스토랑 대소동: 클래스 다이어그램 (0) | 2024.12.16 |
---|---|
레스토랑 대소동: 개발 노트 #12 (0) | 2024.11.27 |
레스토랑 대소동: 개발 노트 #11 (0) | 2024.11.24 |
레스토랑 대소동: 개발 노트 #10 (0) | 2024.11.24 |
레스토랑 대소동: 개발 노트 #9 (0) | 2024.11.24 |