void UpdateState() { switch (m_state) { case CuboState.IDLE: break; case CuboState.MOVING_TO_EMPTY: if (m_navAgent.velocity.magnitude < unmovingVelocityThreshold) { if (!m_isUnmoving) { m_lastUnmovedTime = Time.time; m_isUnmoving = true; } if (Time.time >= m_lastUnmovedTime + unmovingTimeCutoff) { SwitchState(CuboState.IDLE); } } else { m_isUnmoving = false; } break; case CuboState.MOVING_TO_WORK: NegaCube negaCube = m_orderableTarget.GetComponent <NegaCube>(); if (negaCube != null && Vector3.Distance(m_moveTarget, transform.position) <= negaCube.sacrificeDist) { m_orderableTarget.OnWork(this); SwitchState(CuboState.IDLE); } if (Vector3.Distance(m_moveTarget, transform.position) < workTargetDistance) { m_orderableTarget.OccupyWorkTarget(m_workTarget); SwitchState(CuboState.WORKING); } break; case CuboState.WORKING: transform.rotation = Quaternion.Slerp(transform.rotation, m_workTarget.obj.transform.rotation, workRotSnapLerp * Time.deltaTime); if (Time.time > m_lastWorkTime + workCooldown) { m_orderableTarget.OnWork(this); m_lastWorkTime = Time.time; if (m_orderableTarget.GetComponent <NegaCube>() == null) { OnDoWork(); } } break; default: throw new UnityException("Unrecognized cubo state: " + m_state); } }