コード例 #1
0
ファイル: AIController.cs プロジェクト: alexschacher/TheGame
    private void SetDisposition(EntityOLD e, EntityOLD.Disposition d)
    {
        KeyValuePair <EntityOLD, EntityOLD.Disposition> newEntry = new KeyValuePair <EntityOLD, EntityOLD.Disposition>(e, d);

        RemoveNearbyEntity(e);
        nearbyEntities.Add(newEntry);
    }
コード例 #2
0
ファイル: Swipe.cs プロジェクト: alexschacher/TheGame
    void OnTriggerEnter(Collider collider)
    {
        EntityOLD entity = collider.gameObject.GetComponentInParent <EntityOLD>();

        if (entity != null)
        {
            if (entity.IsVulnerable() && (targets.Contains(entity) || damageAny == true))
            {
                if (entity.GetComponent <AIController>() != null)
                {
                    entity.TriggerEventDamagedByEntity(originEntity);
                }
                entity.ModifyHealth(-damage);
                entity.CommandSufferPushback(originEntity.transform.position);
            }
        }

        else
        {
            Destructable destructable = collider.gameObject.GetComponent <Destructable>();

            if (destructable != null)
            {
                destructable.Damage(damage);
            }
        }
    }
コード例 #3
0
ファイル: AIController.cs プロジェクト: alexschacher/TheGame
 public void RemoveNearbyEntity(EntityOLD e)
 {
     nearbyEntities.RemoveAll(kvp => kvp.Key.Equals(e));
     if (targetEntity == e)
     {
         targetEntity = null;
     }
 }
コード例 #4
0
ファイル: AIController.cs プロジェクト: alexschacher/TheGame
    void Awake()
    {
        thisEntity = GetComponent <EntityOLD>();
        thisEntity.eventDamagedByEntity += ReactToTriggerDamagedByEntity;
        entityScan = GetComponentInChildren <EntityScan>();

        AI_idle.SetEntity(thisEntity);
        AI_run.SetEntity(thisEntity);
        AI_attack.SetEntity(thisEntity);

        currentBehaviorState = BehaviorState.Idling;
    }
コード例 #5
0
    public override void Behave(EntityOLD targetEntity)
    {
        thisEntity.CommandSetMovementVector(GetMovementVector(targetEntity));

        if (Vector3.Distance(targetEntity.transform.position, thisEntity.transform.position) < distanceToSwipe)
        {
            if (Vector3.Angle(thisEntity.GetMovementVector(), targetEntity.transform.position - thisEntity.transform.position) < 45)
            {
                thisEntity.CommandAttack();
            }
        }
    }
コード例 #6
0
ファイル: AIController.cs プロジェクト: alexschacher/TheGame
    /************ List of KeyValuePair<Entity, Disposition> ******************/

    public List <EntityOLD> GetNearbyEnemiesAndHostiles(EntityOLD e)
    {
        List <EntityOLD> listOfEnemiesAndHostiles = new List <EntityOLD>();

        listOfEnemiesAndHostiles = listOfEnemiesAndHostiles.Union <EntityOLD>(
            e.GetComponent <AIController>().
            GetNearbyEntitiesOfDisposition(EntityOLD.Disposition.Enemy)).
                                   ToList <EntityOLD>();

        listOfEnemiesAndHostiles = listOfEnemiesAndHostiles.Union <EntityOLD>(
            e.GetComponent <AIController>().
            GetNearbyEntitiesOfDisposition(EntityOLD.Disposition.Hostile)).
                                   ToList <EntityOLD>();

        return(listOfEnemiesAndHostiles);
    }
コード例 #7
0
 public override void Behave(EntityOLD targetEntity)
 {
     if (Time.time > timeToSwitch)
     {
         if (isMoving)
         {
             thisEntity.CommandSetMovementVector(StopMoving());
             timeToSwitch = Time.time + Random.Range(minStopTime, maxStopTime);
             isMoving     = false;
         }
         else
         {
             thisEntity.CommandSetMovementVector(SetRandomMovementVector());
             timeToSwitch = Time.time + Random.Range(minMoveTime, maxMoveTime);
             isMoving     = true;
         }
     }
 }
コード例 #8
0
ファイル: EntityOLD.cs プロジェクト: alexschacher/TheGame
    private void HurtEntityOnTouch(Collision collision)
    {
        EntityOLD touchedEntity = collision.collider.GetComponentInParent <EntityOLD>();

        if (touchedEntity != null)
        {
            if (GetComponent <AIController>() != null)
            {
                if (GetComponent <AIController>().GetNearbyEnemiesAndHostiles(this).Contains(touchedEntity))
                {
                    if (touchedEntity.GetComponent <AIController>() != null)
                    {
                        touchedEntity.TriggerEventDamagedByEntity(this);
                    }
                    touchedEntity.ModifyHealth(-10f);
                    touchedEntity.CommandSufferPushback(transform.position);
                }
            }
        }
    }
コード例 #9
0
ファイル: AI_Run.cs プロジェクト: alexschacher/TheGame
 public override void Behave(EntityOLD targetEntity)
 {
     thisEntity.CommandSetMovementVector(GetMovementVector(targetEntity));
 }
コード例 #10
0
ファイル: AI_Run.cs プロジェクト: alexschacher/TheGame
 private Vector3 GetMovementVector(EntityOLD targetEntity)
 {
     return(-(new Vector3(targetEntity.transform.position.x - thisEntity.transform.position.x,
                          0,
                          targetEntity.transform.position.z - thisEntity.transform.position.z).normalized));
 }
コード例 #11
0
ファイル: AIController.cs プロジェクト: alexschacher/TheGame
 public void AddNearbyEntity(EntityOLD e)
 {
     nearbyEntities.Add(new KeyValuePair <EntityOLD, EntityOLD.Disposition>(e, thisEntity.GetDisposition(e.GetAlignment())));
 }
コード例 #12
0
ファイル: EntityOLD.cs プロジェクト: alexschacher/TheGame
 public void TriggerEventDamagedByEntity(EntityOLD e)
 {
     eventDamagedByEntity.Invoke(e);
 }
コード例 #13
0
 void Start()
 {
     entity = GetComponent <EntityOLD>();
 }
コード例 #14
0
ファイル: AIController.cs プロジェクト: alexschacher/TheGame
 public EntityOLD.Disposition GetDisposition(EntityOLD e)
 {
     return(nearbyEntities.First(kvp => kvp.Key == e).Value);
 }
コード例 #15
0
 public virtual void SetEntity(EntityOLD entity)
 {
     thisEntity = entity;
 }
コード例 #16
0
ファイル: AIController.cs プロジェクト: alexschacher/TheGame
    /****************** Misc *************************/

    private void ReactToTriggerDamagedByEntity(EntityOLD e)
    {
        SetDisposition(e, EntityOLD.Disposition.Hostile);
    }
コード例 #17
0
ファイル: AIController.cs プロジェクト: alexschacher/TheGame
    private void ChooseTargetAndDetermineBehaviorState()
    {
        EntityOLD closestHostile     = null;
        float     totalHostileThreat = 0f;

        // Look for hostiles
        foreach (KeyValuePair <EntityOLD, EntityOLD.Disposition> kvp in nearbyEntities)
        {
            if (kvp.Value == EntityOLD.Disposition.Hostile)
            {
                totalHostileThreat += kvp.Key.GetThreatLevel();

                if (closestHostile == null)
                {
                    closestHostile = kvp.Key;
                }
            }
        }

        // Determine based on threat whether to run or attack,
        // With a 1% chance to attack when they would normally run
        if (totalHostileThreat > thisEntity.GetThreatBraveness() &&
            Random.Range(0f, 1f) > chanceToAttackInsteadOfRun)
        {
            currentBehaviorState = BehaviorState.Running;
        }
        else
        {
            currentBehaviorState = BehaviorState.Attacking;
        }

        // If hostile found, target them
        if (closestHostile != null)
        {
            targetEntity = closestHostile;
            return;
        }
        // No hostiles found...

        EntityOLD closestEnemy     = null;
        float     totalEnemyThreat = 0f;

        // Look for enemies
        foreach (KeyValuePair <EntityOLD, EntityOLD.Disposition> kvp in nearbyEntities)
        {
            if (kvp.Value == EntityOLD.Disposition.Enemy)
            {
                totalEnemyThreat += kvp.Key.GetThreatLevel();

                if (closestEnemy == null)
                {
                    closestEnemy = kvp.Key;
                }
            }
        }

        // Determine based on threat whether to run or attack
        if (totalEnemyThreat > thisEntity.GetThreatBraveness() &&
            Random.Range(0f, 1f) > chanceToAttackInsteadOfRun)
        {
            currentBehaviorState = BehaviorState.Running;
        }
        else
        {
            currentBehaviorState = BehaviorState.Attacking;
        }

        // If hostile found, target them
        if (closestEnemy != null)
        {
            targetEntity = closestEnemy;
            return;
        }

        // No hostiles or enemies found, don't target anyone
        currentBehaviorState = BehaviorState.Idling;
        targetEntity         = null;
    }
コード例 #18
0
ファイル: Swipe.cs プロジェクト: alexschacher/TheGame
 public void SetOriginEntity(EntityOLD entity)
 {
     originEntity = entity;
 }
コード例 #19
0
 public abstract void Behave(EntityOLD targetEntity);
コード例 #20
0
ファイル: AIController.cs プロジェクト: alexschacher/TheGame
 public bool IsEntityInNearbyEntities(EntityOLD e)
 {
     return(nearbyEntities.Any(kvp => kvp.Key == e));
 }