Example #1
0
    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);
        }
    }