private Gene CreateNewActionGene(ClimberGenetics genetics, Gene previousGene)
    {
        Gene     actionGene = null;
        GeneType actionType = RandomGeneType(new[] {
            GeneType.GrabAction,
            GeneType.ReleaseAction,
            GeneType.SwingAction,
            GeneType.NonAction,
        });

        if (actionType == GeneType.GrabAction)
        {
            Vector3 localPoint = Vector3.zero;
            int     index      = Random.Range(0, 4);

            if (index == 0)
            {
                localPoint = new Vector3(-0.5f, -0.5f, 0f);
            }
            else if (index == 1)
            {
                localPoint = new Vector3(0.5f, -0.5f, 0f);
            }
            else if (index == 2)
            {
                localPoint = new Vector3(0.5f, 0.5f, 0f);
            }
            else if (index == 3)
            {
                localPoint = new Vector3(-0.5f, 0.5f, 0f);
            }

            actionGene = new GrabActionGene(localPoint);
        }
        else if (actionType == GeneType.ReleaseAction)
        {
            actionGene = new ReleaseActionGene();
        }
        else if (actionType == GeneType.SwingAction)
        {
            BodyShapeGene bodyShapeGene     = (BodyShapeGene)genetics.Chromosome[0];
            Vector3       localApplyAtPoint = new Vector3(
                Random.Range(-bodyShapeGene.Width * 0.5f, bodyShapeGene.Width * 0.5f),
                Random.Range(-bodyShapeGene.Height * 0.5f, bodyShapeGene.Height * 0.5f),
                0f);
            int   direction = Random.Range(0, 2) == 0 ? -1 : 1;
            float strength  = Random.Range(MinSwingStrength, MaxSwingStrength);

            actionGene = new SwingActionGene(localApplyAtPoint, direction, strength);
        }
        else if (actionType == GeneType.NonAction)
        {
            actionGene = new NonActionGene(Random.Range(MinNonActionTime, MaxNonActionTime));
        }

        return(actionGene);
    }
示例#2
0
    private void ProcessActions()
    {
        if (nextActionTime > Time.fixedTime)
        {
            return;
        }

        Gene actionGene = actionGenes[currentActionIndex];

        if (actionGene.Type == GeneType.GrabAction)
        {
            GrabActionGene grabActionGene = (GrabActionGene)actionGene;

            if (grabJoint == null && transform.position.y > 0)
            {
                grabJoint      = gameObject.AddComponent <HingeJoint>();
                grabJoint.axis = new Vector3(0f, 0f, 1f);
                grabJoint.enablePreprocessing = false;
                grabJoint.anchor = grabActionGene.LocalPoint;
                Pin.SetActive(true);
                Pin.transform.position = transform.TransformPoint(grabActionGene.LocalPoint);
            }
        }
        else if (actionGene.Type == GeneType.ReleaseAction)
        {
            if (grabJoint != null)
            {
                Destroy(grabJoint);
                grabJoint = null;
                Pin.SetActive(false);
            }
        }
        else if (actionGene.Type == GeneType.SwingAction)
        {
            SwingActionGene swingActionGene = (SwingActionGene)actionGene;

            if (grabJoint != null)
            {
                Vector3 worldPosition = transform.TransformPoint(swingActionGene.LocalPoint);
                Vector3 localNormal   = new Vector3((float)swingActionGene.Direction, 0f, 0f);
                Vector3 worldNormal   = transform.TransformDirection(localNormal);
                Vector3 worldForce    = worldNormal * swingActionGene.Strength;

                body.AddForceAtPosition(worldForce, worldPosition);
            }
        }
        else if (actionGene.Type == GeneType.NonAction)
        {
            NonActionGene nonActionGene = (NonActionGene)actionGene;

            nextActionTime = Time.fixedTime + nonActionGene.Time;
        }

        currentActionIndex = (currentActionIndex + 1) % actionGenes.Count;
    }
    private void MutateGene(ClimberGenetics genetics, Gene gene)
    {
        if (gene.Type == GeneType.BodyShape)
        {
            BodyShapeGene bodyShapeGene = (BodyShapeGene)gene;

            bodyShapeGene.Width  += bodyShapeGene.Width * Random.Range(-MutationStrength, MutationStrength);
            bodyShapeGene.Height += bodyShapeGene.Height * Random.Range(-MutationStrength, MutationStrength);
        }
        else if (gene.Type == GeneType.GrabAction)
        {
            if (Random.Range(0f, 1f) < MutationStrength)
            {
                GrabActionGene grabActionGene = (GrabActionGene)gene;
                Vector3        localPoint     = Vector3.zero;
                int            index          = Random.Range(0, 4);

                if (index == 0)
                {
                    localPoint = new Vector3(-0.5f, -0.5f, 0f);
                }
                else if (index == 1)
                {
                    localPoint = new Vector3(0.5f, -0.5f, 0f);
                }
                else if (index == 2)
                {
                    localPoint = new Vector3(0.5f, 0.5f, 0f);
                }
                else if (index == 3)
                {
                    localPoint = new Vector3(-0.5f, 0.5f, 0f);
                }

                grabActionGene.LocalPoint = localPoint;
            }
        }
        else if (gene.Type == GeneType.ReleaseAction)
        {
            // No properties to mutate
        }
        else if (gene.Type == GeneType.SwingAction)
        {
            SwingActionGene swingActionGene = (SwingActionGene)gene;
            BodyShapeGene   bodyShapeGene   = (BodyShapeGene)genetics.Chromosome[0];
            float           localX          = swingActionGene.LocalPoint.x + swingActionGene.LocalPoint.x * Random.Range(-MutationStrength, MutationStrength);
            float           localY          = swingActionGene.LocalPoint.y + swingActionGene.LocalPoint.y * Random.Range(-MutationStrength, MutationStrength);

            swingActionGene.LocalPoint = new Vector3(
                Mathf.Clamp(localX, -bodyShapeGene.Width * 0.5f, bodyShapeGene.Width * 0.5f),
                Mathf.Clamp(localY, -bodyShapeGene.Height * 0.5f, bodyShapeGene.Height * 0.5f),
                swingActionGene.LocalPoint.z);

            if (Random.Range(0f, 1f) < MutationStrength)
            {
                swingActionGene.Direction = Random.Range(0, 2) == 0 ? -1 : 1;
            }

            swingActionGene.Strength = Mathf.Clamp(
                swingActionGene.Strength + swingActionGene.Strength * Random.Range(-MutationStrength, MutationStrength),
                MinSwingStrength,
                MaxSwingStrength);
        }
        else if (gene.Type == GeneType.NonAction)
        {
            NonActionGene nonActionGene = (NonActionGene)gene;

            nonActionGene.Time = Mathf.Clamp(
                nonActionGene.Time + nonActionGene.Time * Random.Range(-MutationStrength, MutationStrength),
                MinNonActionTime,
                MaxNonActionTime);
        }
    }