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); }
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); } }