예제 #1
0
    public override void Write(Data data)
    {
        if (!(data is DataNest))
        {
            return;
        }
        DataNest dataNest = data as DataNest;

        bool exist = false;
        int  index = 0;

        foreach (DataNest d in nests)
        {
            if (d.nest == dataNest.nest)
            {
                exist = true;
                break;
            }
            ++index;
        }

        if (exist)
        {
            if (dataNest.RegistrationDate >= nests[index].RegistrationDate)
            {
                Replace(new DataNest(dataNest), index);
            }
        }
        else
        {
            nests.Add(new DataNest(dataNest));
        }
    }
예제 #2
0
    public override float CalculateDesirability(Agent agent, bool requested)
    {
        DesirabilitiesConfig desirabilitiesConfig = GameManager.Instance.DesirabilitiesConfig;

        DataNest dataNest = agent.Memory.Nests.Read().FirstOrDefault(data => data.nest.SpecieID == agent.Creature.SpecieID);

        if (dataNest == null)
        {
            return(0);
        }

        float distanceFromNest = Vector3.Distance(agent.transform.position, dataNest.nest.transform.position);

        if (distanceFromNest > desirabilitiesConfig.ReachNestConsiderationMaxDistance)
        {
            distanceFromNest = desirabilitiesConfig.ReachNestConsiderationMaxDistance;
        }

        float desirability = desirabilitiesConfig.ReachNestDesirabilityByDistance.Evaluate(distanceFromNest / desirabilitiesConfig.ReachNestConsiderationMaxDistance)
                             * desirabilitiesConfig.ReachNestDesirabilityTwicker;

        if (agent.Thinking.ActiveGoal?.GetType() == typeof(GoalEvade))
        {
            desirability *= desirabilitiesConfig.ReachNestConfirmationBias;
        }

        return(desirability);
    }
예제 #3
0
    public void RemoveByKey(Nest key)
    {
        DataNest element = nests.Find(data => data.nest == key);

        if (element != null)
        {
            nests.Remove(element);
        }
    }
예제 #4
0
    public override void Activate()
    {
        base.Activate();

        DataNest dataNest = owner.Memory.Nests.Read().FirstOrDefault(data => data.nest.SpecieID == owner.Creature.SpecieID);

        if (dataNest == null)
        {
            status = GoalStatus.Failed;
            return;
        }

        Vector3 nestPos = dataNest.nest.transform.position;
        Vector2 randPos = Random.insideUnitCircle;

        AddSubgoal(new GoalSeek(owner, nestPos + new Vector3(randPos.x, 0, randPos.y) * 10));
    }
    public override void Activate()
    {
        base.Activate();

        DataNest dataNest = owner.Memory.Nests.Read().FirstOrDefault(data => data.nest.SpecieID == owner.Creature.SpecieID);

        if (dataNest == null)
        {
            status = GoalStatus.Failed;
            return;
        }

        DesirabilitiesConfig desirabilitiesConfig = GameManager.Instance.DesirabilitiesConfig;

        float distWithNest = dataNest != null?Vector3.Distance(owner.transform.position, dataNest.nest.transform.position) : 0;

        float wantDistWithNest = desirabilitiesConfig.SlepConsiderationMinNestDistance + (desirabilitiesConfig.SlepConsiderationMaxNestDistance - desirabilitiesConfig.SlepConsiderationMinNestDistance)
                                 * desirabilitiesConfig.SleepToNestDesirabilityBySociability.Evaluate(owner.Creature.Traits.Sociability.Value);

        wantDistWithNest = Random.Range(desirabilitiesConfig.SlepConsiderationMinNestDistance, wantDistWithNest);
        Vector2 randPos = Random.insideUnitCircle;

        AddSubgoal(new GoalSeek(owner, dataNest.nest.transform.position + new Vector3(randPos.x, 0, randPos.y) * wantDistWithNest));
    }
예제 #6
0
    public override void Process()
    {
        IReadOnlyCollection <DataNest> nests = owner.Memory.Nests.Read();
        DataNest nestData       = null;
        float    distanceToNest = Mathf.Infinity;

        foreach (DataNest data in nests)
        {
            if (!data.nest)
            {
                continue;
            }
            Nest nest = data.nest;
            if (visited.Contains(nest))
            {
                continue;
            }

            if (!nest.gameObject.activeSelf)
            {
                continue;
            }

            if (!speciesSeeked.Contains(nest.SpecieID))
            {
                continue;
            }

            //ne pas prendre en compte les nest food imédiatement vue.
            //if(Time.time - data.RegistrationDate > 1f) continue;

            float distanceToSource = Vector3.Distance(owner.transform.position, nest.transform.position);
            if (distanceToSource < distanceToNest)
            {
                nestData       = data;
                distanceToNest = distanceToSource;
            }
        }

        if (nestData != null)
        {
            if (target != nestData.nest)
            {
                target = nestData.nest;
                owner.Steering.SetDestination(target.transform.position);
                owner.Steering.Behavior = eSteeringBehavior.Seek;
            }
            else if (owner.Steering.IsArrivedToDestination)
            {
                visited.Add(target);
                target = null;
            }
            else if (target == null)
            {
                status = GoalStatus.Failed;
            }
        }
        else
        {
            status = GoalStatus.Failed;
        }
    }
예제 #7
0
 public DataNest(DataNest dataNest) : base(expirationTime - (Time.time - dataNest.RegistrationDate))
 {
     this.nest = dataNest.nest;
 }