// Used by wander to change the ghost's angle IEnumerator ChangeAngle() { while (movementState == MovementState.Wander) { MovementUtilityWander.changeDirection(this); yield return(new WaitForSeconds(timeBetweenAngleChange)); } }
// Moves the ghost according to its state private void move() { if (angleChangeCoroutine != null && movementState != MovementState.Wander) { StopCoroutine(angleChangeCoroutine); isWanderCoRunning = false; } switch (movementState) { case MovementState.Pursuit: // Pursue the closest object MovementUtilityArrive.SteerArrive(this, closestResettableObject.transform.position); break; case MovementState.Return: // Return the carried object MovementUtilityArrive.SteerArrive(this, carriedObject.OriginalPosition); // Drop the object if we're close enough to its original position if (Vector3.Distance(transform.position, carriedObject.OriginalPosition) < itemDropDistance) { ghostObjectInteraction.DropPickup(); // These are now handled by the reseter //carriedObject.GetComponent<Rigidbody>().useGravity = true; //carriedObject.GetComponent<Collider>().isTrigger = false; carriedObject = null; isCarryingObject = false; } break; case MovementState.AvoidingWall: // Pursue the closest object MovementUtilitySeek.SteerSeek(this, wallNormal); targetRotation = transform.rotation.eulerAngles; break; case MovementState.Wander: MovementUtilityWander.WanderForward(this); if (!isWanderCoRunning) { angleChangeCoroutine = StartCoroutine(ChangeAngle()); } isWanderCoRunning = true; break; } }