} //Move 상태 AI void HoldStateAction() { //그룹이 없는 상태 -> 식사가 끝나고 이동을 마친 상태 if (myGroup == null) { //지불자이면 카운터의 대기열에 서게 됨. if (isPayer) { currentState = G_STATE.PAY; } //지불자가 아니면 게임 오브젝트 제거(퇴장) else { Destroy(gameObject); } return; } GameObject[] groundList = myTable.GetComponent <AccessPositionOfObject>().GetAllGround(); for (int i = 0; i < groundList.Length; i++) { if (RayCastGround(transform.position) == groundList[i]) { myGround = groundList[i]; currentState = G_STATE.SIT; if (myGroup.GetComponent <GuestAction>().currentState == G_STATE.SIT) { //일행도 앉아있다면 테이블의 상태를 USING(1)로 전환 myTable.GetComponent <TableStateManager>().stateOfTable = T_STATE.USING; } groundList[i].GetComponent <GroundUnit>().SetAbsolutePassable(false); //손님이 자리잡은 땅을 절대 지나갈 수 없게 함 } } } //Hold 상태 AI
void MoveStateAction() { if (isMoving && path != null) { //경로가 존재하며 이동 명령을 받은 경우 if (counter >= 0) { //목적지 도달까지 thisPosition = transform.position; if (path[counter].GetPosition() != thisPosition) { //이동 iTween.MoveTo(gameObject, iTween.Hash("x", path[counter].GetPosition().x, "y", path[counter].GetPosition().y, "speed", moveSpeed, "easetype", iTween.EaseType.linear)); } else { counter--; } } //목적지 도달 시 else { isMoving = false; path.Clear(); currentState = G_STATE.HOLD; } } if (path == null) { counter = -1; isMoving = false; } } //Move 상태 AI
// Use this for initialization void Start() { timer = 0.0f; waitForOrder = false; prevState = G_STATE.MOVE; counterToPay = GameObject.Find("CounterSprite"); }
} //Hold 상태 AI void SitStateAction() { timer += Time.deltaTime; if (timer >= timeToOrderSec) //일정 시간이 지나면 주문 { timer = 0; currentState = G_STATE.ORDER; } } //Sit 상태 AI
public void ShowActionMarker(G_STATE _state) { switch (_state) { //식사 상태 이미지 적용 case G_STATE.EAT: { myImg.sprite = eatingImg; break; } //대기 상태 이미지중에서 임의로 선택하여 적용 case G_STATE.SIT: { myImg.sprite = waitingImg[Random.Range(0, waitingImg.Length)]; //이 테이블의 그룹에 속한 모든 손님들이 똑같이 SIT상태가 되어야만 적용 List <GameObject> guestGroup = transform.parent.GetComponentInChildren <TableStateManager>().guestGroup; for (int i = 0; i < guestGroup.Count; i++) { if (guestGroup[i].GetComponent <GuestAction>().currentState == G_STATE.SIT) { continue; } myImg.sprite = null; } break; } case G_STATE.WAIT: { myImg.sprite = waitingImg[Random.Range(0, waitingImg.Length)]; break; } //주문 상태 이미지 적용 case G_STATE.ORDER: myImg.sprite = orderImg; break; default: myImg.sprite = null; myImg.enabled = false; break; } if (myImg.sprite != null) { myImg.enabled = true; } }
void Update() { curState = GetComponentInParent <GuestAction>().currentState; switch (curState) { case STATE.MOVE: MoveAnimation(); break; case STATE.HOLD: StopAnimation(); break; } }
void Update() { switch (currentState) { case G_STATE.MOVE: //이동 처리 MoveStateAction(); break; case G_STATE.HOLD: //목표 지점까지 이동 완료 (Move 다음 행동 분기점) HoldStateAction(); break; case G_STATE.SIT: //착석 SitStateAction(); break; case G_STATE.ORDER: //주문 요청 OrderStateAction(); break; case G_STATE.EAT: EatStateAction(); break; case G_STATE.PAY: PayStateAction(); break; } if (prevState != currentState) { if (myTable != null) { myTable.transform.parent .GetComponentInChildren <TableActMarker>().ShowActionMarker(currentState); } prevState = currentState; } }
} //Order 상태 AI void EatStateAction() //Eat 상태 AI { timer += Time.deltaTime; if (timer >= timeToEatSec) { //방금 식사가 완료된 상태 if (myTable != null) { TableStateManager table = myTable.GetComponent <TableStateManager>(); table.DecideWhoPay(); table.stateOfTable = T_STATE.DIRTY; currentState = G_STATE.MOVE; table.guestGroup.Clear(); table.transform.parent.GetComponentInChildren <TableActMarker>().ShowActionMarker(currentState); myMenus = table.GetOrderMenus(); myTable = null; myGroup = null; myGround.GetComponent <GroundUnit>().SetAbsolutePassable(true); } //값을 지불한 상태(PayAtCounter 스크립트 참조) else { currentState = G_STATE.MOVE; } GameObject moveToGround = null; if (isPayer) { moveToGround = counterToPay.GetComponent <PayAtCounter>().EnqueueGuestForPay(gameObject); MoveThisGround(moveToGround); } else { moveToGround = RayCastGround(GameObject.Find("GuestSpawn").transform.position); MoveThisGround(moveToGround); } } }
public void SetCurrentState(G_STATE _state) { currentState = _state; }