示例#1
0
 public virtual void StartPatternWith(BehaviourAI ai, SenseMemoryFactory.SMData data)
 {
     isRunning = true;
     ai.SetSpeed(patternType.precedence);
     ai.currentPattern = this;
     ai.CurrentData    = data;
 }
示例#2
0
    public override void UpdatePattern(BehaviourAI ai, SenseMemoryFactory.SMData data)
    {
        base.UpdatePattern(ai, data);

        if (ai.DestinationReached(0.1f))
        {
            if (spotsToCheck > 0)
            {
                spotsToCheck--;
                Vector3 point = GetSurveyPoint(ai);
                ai.agent.SetDestination(point);
            }
            else
            {
                // remove inspection point
                ai.sMF.inspectionPoints.RemoveAt(0);

                // exit behaviour if no more inspection points
                if (ai.sMF.inspectionPoints.Count < 1)
                {
                    KillPattern(ai);
                    return;
                }
            }
        }
    }
    public void StrafeCycle(BehaviourAI ai, SenseMemoryFactory.SMData data)
    {
        // get target
        ai.playerTarget = data.targets[0];
        // get destination
        Vector3 moveTarget = ai.transform.position + Random.insideUnitSphere * strafeLength;

        // choose closer strafe target each time
        while (Vector3.Distance(moveTarget, data.targets[0].position) > Vector3.Distance(ai.transform.position, data.targets[0].position))
        {
            moveTarget = ai.transform.position + Random.insideUnitSphere * strafeLength;
            Debug.Log("strafeMoveTargetChanged");
        }
        // set destination.y
        moveTarget.y = moveHeight;
        // start height lerp method
        ai.HoverHeight(moveTarget.y);

        //Debug.Log("Strafing");
        //GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        //sphere.transform.position = moveTarget;
        //sphere.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);


        ai.agent.SetDestination(moveTarget);
        // shoot
        ai.ShootAt(data.targets[0]);
    }
 public override void UpdatePattern(BehaviourAI ai, SenseMemoryFactory.SMData data)
 {
     if (ai.DestinationReached(0.5f))
     {
         if (investigationPoint == ai.sMF.targetLastSeen)
         {
             Debug.Log("TLS set to Vector3.zero");
             ai.sMF.targetLastSeen = Vector3.zero;
             KillPattern(ai);
             return;
         }
         else if (investigationPoint == data.inspectionPoints[0])
         {
             Debug.Log("inspectionPoint removed");
             ai.sMF.inspectionPoints.RemoveAt(0);
             if (ai.sMF.inspectionPoints.Count < 1)
             {
                 KillPattern(ai);
                 return;
             }
         }
         else
         {
             Debug.Log("InvestigationPoint is set to strange value... (InvestigatePattern)");
         }
     }
 }
    public override Pattern ChoosePattern(SenseMemoryFactory.SMData senseData)
    {
        // NOTE: generate random number between 0 and currentHealth * 2;
        // this number replaces health.currentHealth in all ifs below
        // same for distance

        Pattern p = null;

        if (health.currentHealth > 85)
        {
            if (senseData.distance < 20)
            {
                // Strafe Fire
                p = patterns[1];
            }
            else
            {
                // Charge Fire
                p = patterns[0];
            }
        }
        else if (health.currentHealth > 30)
        {
            // Cover shoot
            p = patterns[2];
        }
        else
        {
            // Retreat
            p = patterns[3];
        }
        return(p);
    }
    public override Pattern ChoosePattern(SenseMemoryFactory.SMData senseData)
    {
        Pattern p = null;

        // Return Patrol Pattern (Only Naive Pattern)
        p = patterns[0];
        return(p);
    }
    public override Pattern ChoosePattern(SenseMemoryFactory.SMData senseData)
    {
        Pattern p = null;
        // Randomize investigate and Survey Pattern execution
        int random = UnityEngine.Random.Range(0, patterns.Count);

        p = patterns[random];
        return(p);
    }
示例#8
0
    public override void StartPatternWith(BehaviourAI ai, SenseMemoryFactory.SMData data)
    {
        base.StartPatternWith(ai, data);
        // reset spotcheck count
        spotsToCheck = spotChecks;

        Vector3 surveyPoint = GetSurveyPoint(ai);

        ai.agent.SetDestination(surveyPoint);
    }
    public override void StartPatternWith(BehaviourAI ai, SenseMemoryFactory.SMData data)
    {
        base.StartPatternWith(ai, data);

        // get target
        investigationPoint = data.targetLastSeen != Vector3.zero ? data.targetLastSeen : data.inspectionPoints[0];

        // move to position & start coroutine to rotate to player
        ai.agent.SetDestination(investigationPoint);
    }
    public override void StartPatternWith(BehaviourAI ai, SenseMemoryFactory.SMData data)
    {
        base.StartPatternWith(ai, data);
        // stop navMesh from setting rotation
        ai.agent.updateRotation = false;
        // give target to AI
        ai.playerTarget = data.targets[0];
        // tell ai to look at target
        ai.lookAtTarget = true;

        StrafeCycle(ai, data);
    }
示例#11
0
 //Func<Vector3, Vector3> GetDestinationInTotem()
 //{
 //    Func<Vector3, Vector3> fn = (v) =>
 //    {
 //        if (!localTotem)
 //        {
 //            return v;
 //        }
 //        Vector3 totemPos = localTotem.transform.position;
 //        float destinationDist = Vector3.Distance(totemPos, v);
 //        if (destinationDist > localTotem.radius)
 //        {
 //            // position + direction.normalized * radius 0 shortens destination to point on totem radius
 //            return totemPos + (v - totemPos).normalized * localTotem.radius;
 //        }
 //        return v;
 //    };
 //    return fn;
 //}
 public void TryExecutePattern(Pattern incomingPattern, SenseMemoryFactory.SMData _data)
 {
     if (ai.debugBehaviour)
     {
         string debug = _data.inspectionPoints.Count > 0 ? string.Format(BaneTools.ColorString("iPs: " + _data.inspectionPoints.Count + ", tLS: " + _data.targetLastSeen + ", tars: " + _data.targets.Count, Color.yellow)) : "iPs: " + _data.inspectionPoints.Count + ", tLS: " + _data.targetLastSeen + ", tars: " + _data.targets.Count;
         Debug.Log(debug);
     }
     //remove currentPattern if it has stopped
     if (currentPattern && !currentPattern.isRunning)
     {
         currentPattern = null;
     }
     // if there is no pattern running
     if (!currentPattern)
     {
         if (ai.debugBehaviour)
         {
             Debug.Log(string.Format(BaneTools.ColorString("NEW Pattern: " + incomingPattern + ", OLD Pattern ended", Color.red)));
         }
         incomingPattern.StartPatternWith(ai, _data);
         currentPattern = incomingPattern;
         return;
     }
     // if incoming pattern is different and current pattern is interuptable
     if (incomingPattern != currentPattern && currentPattern.isInteruptable)
     {
         if (ai.debugBehaviour)
         {
             Debug.Log(string.Format(BaneTools.ColorString("NEW Pattern: " + incomingPattern + ", OLD Pattern: " + currentPattern, Color.green)));
         }
         currentPattern.KillPattern(ai);
         incomingPattern.StartPatternWith(ai, _data);
         currentPattern = incomingPattern;
         return;
     }
     // if precedence matters for current pattern && incoming has higher or equal precedence, run incoming
     if (currentPattern.notePrecedence && incomingPattern.patternType.precedence >= currentPattern.patternType.precedence)
     {
         if (ai.debugBehaviour)
         {
             Debug.Log(string.Format(BaneTools.ColorString("NEW Pattern: " + incomingPattern + ", OLD Pattern: " + currentPattern, Color.green)));
         }
         currentPattern.KillPattern(ai);
         incomingPattern.StartPatternWith(ai, _data);
         currentPattern = incomingPattern;
         return;
     }
     if (ai.debugBehaviour)
     {
         Debug.Log("Update Pattern: " + currentPattern);
     }
     currentPattern.UpdatePattern(ai, _data);
 }
示例#12
0
    void CoverShootCycle(BehaviourAI ai, SenseMemoryFactory.SMData data)
    {
        Transform enemyTarget = data.targets[0];

        // get cover point
        coverPoint = ai.GetAvoidanceWaypoint(data.targets[0].position);

        // move to cover point
        ai.agent.SetDestination(coverPoint);

        // fire while moving
        ai.ShootAt(enemyTarget);
    }
示例#13
0
    public override void StartPatternWith(BehaviourAI ai, SenseMemoryFactory.SMData data)
    {
        base.StartPatternWith(ai, data);

        //ai.Crouch(true);

        // look at player while moving
        ai.playerTarget         = data.targets[0];
        ai.agent.updateRotation = false;
        ai.lookAtTarget         = true;

        // Covershoot sequence
        CoverShootCycle(ai, data);
    }
示例#14
0
    // Initialisation - runs once when pattern begins
    public override void StartPatternWith(BehaviourAI ai, SenseMemoryFactory.SMData data)
    {
        base.StartPatternWith(ai, data);

        if (wayPoints.Count == 0)
        {
            GetWaypointsFrom(ai);
        }

        // Transform(s) of the current waypoint in the waypoints array.
        Vector3 point = GetRandomEnRoutePos(wayPoints[waypointIndex].position, ai);

        // Agent destination (move to current waypoint position).
        ai.agent.SetDestination(point);
    }
示例#15
0
    public override Decider DeciderBasedOn(SenseMemoryFactory.SMData data)
    {
        // if no direct/indirect evidence of adversaries
        bool condition = (data.inspectionPoints.Count == 0 && data.targets.Count == 0 && data.targetLastSeen == Vector3.zero);

        if (condition)
        {
            //Debug.Log(this.GetType().Name + ", passed");
            return(this);
        }
        else
        {
            // return empty set of patterns (basically null state)
            return(null);
        }
    }
示例#16
0
    override public Decider DeciderBasedOn(SenseMemoryFactory.SMData _data)
    {
        // if direct evidence of enemies
        bool condition = (_data.targets.Count > 0);

        if (condition)
        {
            //Debug.Log(this.GetType().Name + ", passed");
            // return set of combat patterns
            return(this);
        }
        else
        {
            // return empty set of patterns (basically null state)
            return(null);
        }
    }
示例#17
0
    override public Decider DeciderBasedOn(SenseMemoryFactory.SMData _data)
    {
        // if no direct evidence but some indirect evidence of enemies
        bool condition = (_data.targets.Count == 0 && (_data.inspectionPoints.Count > 0 || (_data.targetLastSeen != Vector3.zero || _data.targetLastSeen != Vector3.zero)));

        if (condition)
        {
            //Debug.Log(this.GetType().Name + ", passed");
            // return set of suspicious patterns
            return(this);
        }
        else
        {
            // return empty set of patterns (basically null state)
            return(null);
        }
    }
示例#18
0
    // Gets called when pattern is re-called (is cheaper due to if check)
    public override void UpdatePattern(BehaviourAI ai, SenseMemoryFactory.SMData data)
    {
        base.UpdatePattern(ai, data);
        // If we're close enough to the waypoint...
        if (ai.DestinationReached(0.1f))
        {
            // if agent has reached final destination waypoint pos
            if (Vector3.Distance(wayPoints[waypointIndex].position, ai.transform.position) < 0.5f)
            {
                waypointIndex = Random.Range(0, wayPoints.Count);
            }
            // Transform(s) of the current waypoint in the waypoints array.
            Vector3 point = GetRandomEnRoutePos(wayPoints[waypointIndex].position, ai);

            // Agent destination (move to current waypoint position).
            ai.agent.SetDestination(point);
        }
    }
示例#19
0
    public override void UpdatePattern(BehaviourAI ai, SenseMemoryFactory.SMData data)
    {
        base.UpdatePattern(ai, data);
        if (data.targets.Count == 0)
        {
            switch (playerChecks)
            {
            // 1st check:
            case 0:
                ai.agent.SetDestination(data.targetLastSeen);       // look for target
                Debug.Log("CS check: " + playerChecks);
                break;

            // 2nd check:
            case 1:
                ai.agent.SetDestination(coverPoint);                // return to cover
                Debug.Log("CS check: " + playerChecks);
                break;

            // 3rd check:
            case 2:
                ai.agent.SetDestination(data.targetLastSeen);       // look for target
                Debug.Log("CS check: " + playerChecks);
                break;

            // 4th/Final check:
            case 3:
                KillPattern(ai);                                    // End Behaviour
                Debug.Log("CS check: " + playerChecks);
                return;

            default:
                KillPattern(ai);
                Debug.Log("CS check: " + playerChecks);
                return;
            }
            playerChecks++;
        }
        else
        {
            playerChecks = 0;
            CoverShootCycle(ai, data);
        }
    }
示例#20
0
 public override void UpdatePattern(BehaviourAI ai, SenseMemoryFactory.SMData data)
 {
     if (data.targets.Count != 0)
     {
         retreatPoint = ai.GetAvoidanceWaypoint(data.targets[0].position);
         ai.agent.SetDestination(retreatPoint);
     }
     if (ai.DestinationReached(0.1f))
     {
         if (!rotated)
         {
             retreatPoint = ai.transform.position + (data.targetLastSeen - ai.transform.position).normalized;
             ai.agent.SetDestination(retreatPoint);
             rotated = true;
         }
         else
         {
             KillPattern(ai);
             rotated = false;
             return;
         }
     }
 }
示例#21
0
    public override void StartPatternWith(BehaviourAI ai, SenseMemoryFactory.SMData data)
    {
        base.StartPatternWith(ai, data);
        // closest target (FoV script orders targets in list)
        Transform target = data.targets[0];

        // Go toward player target
        ai.agent.SetDestination(target.position);

        if (ai.isGuard)
        {
            if (ai.hand)
            {
                ai.hand.LookAt(target.position);
            }
            else
            {
                Debug.Log("You need to asign the AI Hand Transform component to aim the gun");
            }
        }
        // fire
        ai.ShootAt(target);
    }
示例#22
0
    // this lambda needs to be passed to pattern being executed (to constrain position to totem radius)
    //Func<Vector3, Vector3> GetDestinationInTotem()
    //{
    //    Func<Vector3, Vector3> fn = (v) =>
    //    {
    //        if (!localTotem)
    //        {
    //            return v;
    //        }
    //        Vector3 totemPos = localTotem.transform.position;
    //        float destinationDist = Vector3.Distance(totemPos, v);
    //        if (destinationDist > localTotem.radius)
    //        {
    //            // position + direction.normalized * radius 0 shortens destination to point on totem radius
    //            return totemPos + (v - totemPos).normalized * localTotem.radius;
    //        }
    //        return v;
    //    };
    //    return fn;
    //}

    // Wrapper Method that allocates data to each of the AI Modes - Conditions for
    // execution are defined at the top of each respective Mode class
    public void MakeDecisionFrom(SenseMemoryFactory.SMData senseData)
    {
        // SelectMany() makes 1 list out of all the pattern lists (derived/transformed from deciders) that pass the condition (based on SMData)
        //List<Pattern> relevantPatterns = deciders.SelectMany(d => d.DeciderBasedOn(data)).ToList();

        Decider relevantDecider = null;
        Pattern pattern         = null;

        // run each decider through it's bool test for relevence based on senses
        foreach (Decider d in deciders)
        {
            if (d.DeciderBasedOn(senseData) != null)
            {
                relevantDecider = d;
                break;
            }
        }

        if (relevantDecider != null)
        {
            // tell decider to run specific conditions to choose one of it's patterns
            pattern = relevantDecider.ChoosePattern(senseData);
        }
        else
        {
            Debug.Log("No relevant Decider chosen! (MakeDecisionFrom() method)");
            return;
        }


        //Pattern pattern = pM.SelectPattern(relevantPatterns);
        if (pattern)
        {
            pM.TryExecutePattern(pattern, senseData);
        }
        //TurnOffDecidersBasedOn(pattern);
    }
示例#23
0
 public override void StartPatternWith(BehaviourAI ai, SenseMemoryFactory.SMData data)
 {
     base.StartPatternWith(ai, data);
     retreatPoint = ai.GetAvoidanceWaypoint(data.targets[0].position);
     ai.agent.SetDestination(retreatPoint);
 }
示例#24
0
 public virtual void UpdatePattern(BehaviourAI ai, SenseMemoryFactory.SMData data)
 {
 }
示例#25
0
 public override void UpdatePattern(BehaviourAI ai, SenseMemoryFactory.SMData data)
 {
     StartPatternWith(ai, data);
 }
示例#26
0
 public abstract Pattern ChoosePattern(SenseMemoryFactory.SMData senseData);
示例#27
0
 //public abstract List<Pattern> DeciderBasedOn(SenseMemoryFactory.SMData data);
 public abstract Decider DeciderBasedOn(SenseMemoryFactory.SMData senseData);
 public override void UpdatePattern(BehaviourAI ai, SenseMemoryFactory.SMData data)
 {
     StrafeCycle(ai, data);
 }