Ejemplo n.º 1
0
    private void IdentifySimilarCreature()
    {
        TargetCreature = null;                          // Reference to the script of the closest creature
        GameObject target     = null;
        float      similarity = Mathf.Infinity;

        ColliderCloud = Physics.OverlapSphere(_myTransform.position, (float)_lineOfSight);

        if (ColliderCloud.Length == 0)
        {
            target = null;
            return;
        }

        foreach (Collider col in ColliderCloud)
        {
            var currentCollider = col.transform.gameObject;             // Reference of the current collider
            if (currentCollider && currentCollider.gameObject.name == "root" && currentCollider != _myCreature.Root.gameObject)
            {
                _otherCreature = currentCollider.transform.parent.GetComponent <Creature>();
                var currentSimilarity = GeneticsUtilities.CheckSimilarColour(_myCreature.ChromosomeComposition, _otherCreature.ChromosomeComposition);

                if (currentSimilarity < similarity)
                {
                    target     = currentCollider.transform.parent.gameObject;
                    similarity = currentSimilarity;
                }

                Vector3 locationDifference = currentCollider.transform.position - _myTransform.position;
                if (locationDifference.magnitude < (float)_creatureMateRange)
                {
                    _otherCreature = currentCollider.transform.parent.GetComponent <Creature>();
                    Genitalia otherGenital = _otherCreature.Genital.GetComponent <Genitalia>();

                    if (_myCreature.State != Creature.CurrentState.PersuingMate &&
                        _otherCreature.State != Creature.CurrentState.PersuingMate)
                    {
                    }
                    else
                    {
                        _collisionHandler.ObserveColliders(_myCreature.Genital.gameObject, otherGenital.gameObject);
                        _otherCreature.ChangeState(Creature.CurrentState.Mating);
                        _myCreature.ChangeState(Creature.CurrentState.Mating);
                    }

                    similarity = currentSimilarity;
                }
            }

            DistanceToGoal = 0F;
            Goal           = null;
            if (!target)
            {
                continue;
            }
            TargetCreature = target.GetComponent <Creature>();
            Goal           = TargetCreature.Root;
            DistanceToGoal = DistanceUntilGoal();
        }
    }