Beispiel #1
0
    public DynamicEvade(Kinematic _character, Kinematic _target, float _maxAcceleration, float _maxPrediction)
    {
        character       = _character;
        target          = _target;
        maxAcceleration = _maxAcceleration;
        maxPrediction   = _maxPrediction;

        df = new DynamicFlee(_character, _target, _maxAcceleration);
    }
Beispiel #2
0
    public SteeringOutput Separation()
    {
        Kinematic cotm = new Kinematic()
        {
            position = getNeighborhoodCenter(prepareNeighourhood())
        };

        Debug.DrawLine(character.position, cotm.position, Color.blue);


        DynamicFlee df = new DynamicFlee(character, cotm, maxAcceleration);

        return(df.getSteering());
    }
        public void ManageAI(MovementAI ai, Rigidbody2D character)
        {
            Kinematic characterKinematic = KinematicAdapter.FromRigidbody2DToKinematic(character);
            Kinematic targetKinematic    = new Kinematic();
            Algorithm algorithm          = new DynamicNone();

            switch (ai.aiAlgorithm)
            {
            case AIAlgorithm.DynamicSeek:
                targetKinematic = KinematicAdapter.FromRigidbody2DToKinematic(ai.target);
                algorithm       = new DynamicSeek(characterKinematic, targetKinematic, ai.maxSpeed);
                break;

            case AIAlgorithm.DynamicFlee:
                targetKinematic = KinematicAdapter.FromRigidbody2DToKinematic(ai.target);
                algorithm       = new DynamicFlee(characterKinematic, targetKinematic, ai.maxSpeed);
                break;

            case AIAlgorithm.DynamicArrive:
                targetKinematic = KinematicAdapter.FromRigidbody2DToKinematic(ai.target);
                algorithm       = new DynamicArrive(characterKinematic, targetKinematic, ai.maxAcceleration, ai.maxSpeed, ai.targetRadius, ai.slowRadius, ai.timeToTarget);
                break;

            case AIAlgorithm.DynamicAlign:
                targetKinematic = KinematicAdapter.FromRigidbody2DToKinematic(ai.target);
                algorithm       = new DynamicAlign(characterKinematic, targetKinematic, ai.maxRotation, ai.maxAngularAcceleration,
                                                   ai.targetRadius, ai.slowRadius, ai.timeToTarget);
                break;

            case AIAlgorithm.DynamicVelocityMatch:
                targetKinematic = KinematicAdapter.FromRigidbody2DToKinematic(ai.target);
                algorithm       = new DynamicVelocityMatch(characterKinematic, targetKinematic, ai.maxAcceleration, ai.timeToTarget);
                break;
            }
            SteeringOutput steering = algorithm.getSteering();

            steering.Apply(characterKinematic, ai.lookWhereYoureGoing, ai.maxSpeed, Time.deltaTime);
            KinematicAdapter.UpdateRigidbody2DWithKinematic(character, characterKinematic);
        }
 void Awake()
 {
     dynamicFlee = new DynamicFlee(GetComponent <Rigidbody>(), getTargetPosition(), magnitude);
 }
Beispiel #5
0
    void Update()
    {
        Camera  camera        = GameObject.FindGameObjectWithTag("MainCamera").GetComponent <Camera>();
        Vector3 PointInWorld  = new Vector3();
        var     buttonClicked = false;

        if (Input.GetKeyDown(KeyCode.Mouse0))
        {
            var mousePos = Input.mousePosition;
            mousePos.z    = CAMERA_Y;
            PointInWorld  = camera.ScreenToWorldPoint(mousePos);
            buttonClicked = true;
            Debug.Log("world point: " + PointInWorld);
        }

        foreach (var character in this.Characters)
        {
            BlendedMovement    movement  = (BlendedMovement)character.Movement;
            MovementWithWeight fleeClick = movement.Movements.Find(x => x.Movement.Name == "Flee");

            if (buttonClicked)
            {
                var distanceToPoint = (character.KinematicData.position - PointInWorld).magnitude;

                if (distanceToPoint < FLEE_RADIUS)
                {
                    var dynamicFlee = new DynamicFlee()
                    {
                        Character       = character.KinematicData,
                        Target          = new KinematicData(),
                        MaxAcceleration = MAX_ACCELERATION
                    };

                    if (fleeClick != null)
                    {
                        movement.Movements.Remove(fleeClick);
                    }

                    dynamicFlee.Target.position   = PointInWorld;
                    dynamicFlee.Target.position.y = character.KinematicData.position.y;

                    movement.Movements.Add(new MovementWithWeight(dynamicFlee, 7));
                }
            }
            else
            {
                var distanceToPoint = (character.KinematicData.position - PointInWorld).magnitude;

                if (distanceToPoint > FLEE_RADIUS)
                {
                    if (fleeClick != null)
                    {
                        movement.Movements.Remove(fleeClick);
                    }
                }
            }


            this.UpdateMovingGameObject(character);
        }
    }
Beispiel #6
0
    public SteeringOutput ObstacleFlee()
    {
        DynamicFlee sb = new DynamicFlee(agent.k, target.k, maxAcceleration);

        return(ObstacleAvoidance(sb));
    }
Beispiel #7
0
    public SteeringOutput TempObstacleFlee(NPCController newTarget)
    {
        DynamicFlee sb = new DynamicFlee(agent.k, newTarget.k, maxAcceleration);

        return(ObstacleAvoidance(sb));
    }