// Update is called once per frame void Update() { if (seekOn) { obj1.SeekAndArrive(obj2.transform.position); } if (fleeOn) { obj1.Flee(obj3.transform.position); } if (wanderOn) { obj1.Wander(); } if (pursuitOn) { obj1.Pursuit(obj2.transform.position, obj2script.velocity); } if (evadeOn) { obj1.Evade(obj3.transform.position, obj3script.velocity); } /* if (leaderFollowOn) * { * obj1.LeaderFollow(obj2script.velocity, obj2.transform.position); * }*/ }
private void Reposition(GameObject targetObject, IAiStateMachine stateMachine, float deltaTime) { var targetPosition = targetObject.transform.position; float distance = Vector3.Distance(targetPosition, stateMachine.MoverComponent.CurrentPosition); bool isInAttackRange = distance <= attackDistance; bool canAttack = _attackTimer > attackInterval; bool isClose = distance < minDistanceToMaintain; bool isFar = distance > maxDistanceToMaintain; bool isTooFar = distance > stateMachine.FieldOfViewComponent.Radius; bool canSeeTarget = stateMachine.FieldOfViewComponent.GameObjectsInView.Contains(TargetObject); if (isTooFar || !canSeeTarget) { TargetObject = null; } //if low on life go to flee state if (canAttack && isInAttackRange) { //go to attack state Attack(TargetObject); } if (isClose) { _direction += SteeringBehaviour.Flee(targetPosition, _direction, stateMachine.MoverComponent) * deltaTime; } else if (isFar) { _direction += SteeringBehaviour.Seek(targetPosition, _direction, stateMachine.MoverComponent) * deltaTime; } else { var direction = SteeringBehaviour.Seek(targetPosition, _direction, stateMachine.MoverComponent).normalized; stateMachine.MoverComponent.MoveDirection(direction); _direction = SteeringBehaviour.Arriving(stateMachine.MoverComponent, _direction, targetPosition, maxDistanceToMaintain, .05f); } //arrival behaviour //attack //roam around }