private void OnFollowEnter() { navAgent.isStopped = false; state = DogState.Follow; subState = DogSubState.FollowPath; startLookAtTime = float.MaxValue; animator.PlayWalk(); Repath(followOffset); }
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(); } }
private void OnPatrolEnter() { navAgent.isStopped = false; state = DogState.Patrol; subState = DogSubState.PatrolGotoInteractable; Vector3 targetPos = needsObjects[currentNeedsObjectIndex].transform.position; navAgent.SetDestination(targetPos); animator.PlayWalk(); }
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); }
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(); } }
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(); } }