Exemplo n.º 1
0
 private void OnFollowEnter()
 {
     navAgent.isStopped = false;
     state           = DogState.Follow;
     subState        = DogSubState.FollowPath;
     startLookAtTime = float.MaxValue;
     animator.PlayWalk();
     Repath(followOffset);
 }
Exemplo n.º 2
0
    private void Patrol()
    {
        if (!shouldFollow && needsFilling == null)
        {
            //Patrol to first object in the needs list
            //Once there sniff it (check if it is empty)
            //If it is empty, lead owner back to object
            //If it is not empty, patrol to next object in list
            switch (subState)
            {
            case DogSubState.PatrolGotoInteractable:
            {
                if (!navAgent.pathPending && navAgent.remainingDistance <= sniffDistance)
                {
                    GetComponent <Rigidbody>().constraints = RigidbodyConstraints.FreezeAll;
                    subState           = DogSubState.PatrolSniff; //dog checks out object
                    navAgent.isStopped = true;
                    animator.CycleWalk();                         //called once to get to sniff animation
                    sniffTimeEnd = Time.time + sniffTime;
                }
                break;
            }

            case DogSubState.PatrolSniff:     //dog checks out object
            {
                if (Time.time >= sniffTimeEnd)
                {
                    GetComponent <Rigidbody>().constraints = RigidbodyConstraints.None;
                    if (needsObjects[currentNeedsObjectIndex].isEmpty())
                    {
                        needsFilling = needsObjects[currentNeedsObjectIndex];         //if empty save reference to lead owner back to it
                        OnLeadEnter();
                    }
                    else
                    {
                        currentNeedsObjectIndex++;
                        currentNeedsObjectIndex = currentNeedsObjectIndex % needsObjectCount;
                        Vector3 targetPos = needsObjects[currentNeedsObjectIndex].transform.position;
                        navAgent.SetDestination(targetPos);
                        subState = DogSubState.PatrolGotoInteractable; //dog will go to next object
                    }
                    animator.CycleWalk();                              //called twice to get back to original walk animation
                    animator.CycleWalk();
                    navAgent.isStopped = false;
                }

                break;
            }
            }
        }
        else
        {
            OnPatrolExit();
            OnLeadEnter();
        }
    }
Exemplo n.º 3
0
    private void OnPatrolEnter()
    {
        navAgent.isStopped = false;
        state    = DogState.Patrol;
        subState = DogSubState.PatrolGotoInteractable;
        Vector3 targetPos = needsObjects[currentNeedsObjectIndex].transform.position;

        navAgent.SetDestination(targetPos);
        animator.PlayWalk();
    }
Exemplo n.º 4
0
    private void OnLeadEnter()
    {
        navAgent.isStopped = false;
        state           = DogState.Lead;
        subState        = DogSubState.GoToOwner;
        startLookAtTime = float.MaxValue;
        animator.PlayWalk();
        Vector3 direction = (needsFilling.transform.position - owner.position).normalized;

        direction *= goToFarmerDistance;
        Repath(direction);
    }
Exemplo n.º 5
0
    private void Lead()
    {
        if (!shouldFollow && needsFilling != null)
        {
            //Go to owner
            //Get owner to follow
            //Lead them back to object that needs filling
            //Once having successfully lead the farmer and watched them fillUp, continue patrolling

            Vector3 ownerPosition = owner.transform.position;
            switch (subState)
            {
            case DogSubState.GoToOwner:
            {
                if ((transform.position - ownerPosition).magnitude <= goToFarmerDistance)
                {
                    subState = DogSubState.LeadLookat;
                    // stop nav here
                }
                else if ((ownerPosition - latestTargetPos).magnitude >= repathDistance)
                {
                    //close distance with owner
                    Vector3 direction = (needsFilling.transform.position - owner.position).normalized;
                    direction *= goToFarmerDistance;
                    Repath(direction);
                }
                else
                {
                    int i = 0;
                }

                break;
            }

            case DogSubState.LeadLookat:
            {
                Bark();
                if ((transform.position - ownerPosition).magnitude > repathDistance)
                {
                    subState = DogSubState.GoToOwner;

                    Vector3 direction = (needsFilling.transform.position - owner.position).normalized;
                    direction *= goToFarmerDistance;
                    Repath(direction);
                }
                else if ((transform.position - ownerPosition).magnitude <= leadDistance)
                {
                    subState = DogSubState.LeadPath;
                    Repath(needsFilling.transform.position - transform.position);
                }
                else
                {
                    Vector3 targetDir = owner.transform.position - transform.position;
                    LookAtTarget(targetDir);
                }

                break;
            }

            case DogSubState.LeadPath:
            {
                if ((ownerPosition - needsFilling.transform.position).magnitude < goToFarmerDistance)
                {
                    subState = DogSubState.LeadFillUp;
                }
                else if ((transform.position - ownerPosition).magnitude > goToFarmerDistance)
                {
                    subState = DogSubState.LeadLookat;
                }
                break;
            }

            case DogSubState.LeadFillUp:
            {
                if ((transform.position - ownerPosition).magnitude > goToFarmerDistance)
                {
                    subState = DogSubState.LeadLookat;
                }
                else
                {
                    if (needsFilling.isEmpty())
                    {
                        Vector3 targetDir = needsFilling.transform.position - transform.position;
                        LookAtTarget(targetDir);
                    }
                    else
                    {
                        //Keep patrolling
                        OnLeadExit();
                        OnPatrolEnter();
                    }
                }

                break;
            }
            }
        }
        else
        {
            OnLeadExit();
            OnFollowEnter();
        }
    }
Exemplo n.º 6
0
    private void Follow()
    {
        if (shouldFollow)
        {
            Vector3 ownerPosition = owner.transform.position;
            Vector3 ownerForward  = owner.transform.forward;
            switch (subState)
            {
            case DogSubState.FollowPath:
            {
                if ((latestTargetPos - ownerPosition).magnitude >= repathDistance ||
                    Vector3.Angle(latestTargetFront, ownerForward) >= repathAngle)
                {
                    Repath(followOffset);
                }

                else if (!navAgent.pathPending && navAgent.remainingDistance <= followDistanceReached)
                {
                    animator.PlayFullBodyState(States.AnimalFullBody.Idle);
                    latestTargetFront = ownerForward;
                    latestTargetPos   = ownerPosition;
                    startLookAtTime   = Time.time + lookAtDelay;
                    subState          = DogSubState.FollowWait;
                }

                if (Time.time >= startLookAtTime)
                {
                    subState = DogSubState.FollowLookAt;
                }
                break;
            }

            case DogSubState.FollowWait:
            {
                if (Time.time >= startLookAtTime)
                {
                    subState = DogSubState.FollowLookAt;
                }

                if ((transform.position - ownerPosition).magnitude >= lookAtExitDistance ||
                    Vector3.Angle(latestTargetFront, ownerForward) >= lookAtExitAngle)
                {
                    startLookAtTime = float.MaxValue;
                    Repath(followOffset);
                    animator.PlayWalk();
                    subState = DogSubState.FollowPath;
                }

                break;
            }

            case DogSubState.FollowLookAt:
            {
                Vector3 targetDir = owner.transform.position - transform.position;
                LookAtTarget(targetDir);

                if ((transform.position - ownerPosition).magnitude >= lookAtExitDistance ||
                    Vector3.Angle(latestTargetFront, ownerForward) >= lookAtExitAngle)
                {
                    startLookAtTime = float.MaxValue;
                    Repath(followOffset);
                    animator.PlayWalk();
                    subState = DogSubState.FollowPath;
                }
                break;
            }
            }
        }
        else
        {
            OnFollowExit();
            OnPatrolEnter();
        }
    }