void Update() { //if (transform.rotation.eulerAngles.z > 90 && transform.rotation.eulerAngles.z < 270) Kill(); //if (transform.position.x < -0.2f) //{ // net.SetFitness(-999); // net.SetTimeAlive(-999); // Kill(); //} if (dontReward) { return; } if (netInitalized && manager.Countdown > 0) { if (_shouldPunish < 0) { _shouldPunish = 0; } float[] inputs = { HeadTransform.rotation.z, LeftArmTransform.rotation.z, RightArmTransform.rotation.z, LeftLegTransform.rotation.z, LeftFootTransform.rotation.z, RightLegTransform.rotation.z, RightFootTransform.rotation.z, _shouldPunish > 0f ? 100f : 0f, transform.position.x, Chest.transform.rotation.z, Chest.velocity.x, Chest.velocity.y, LeftLeg.velocity.x, LeftLeg.velocity.y, LeftLeg.angularVelocity, LeftFoot.velocity.x, LeftFoot.velocity.y, LeftFoot.angularVelocity, RightLeg.velocity.x, RightLeg.velocity.y, RightLeg.angularVelocity, RightFoot.velocity.x, RightFoot.velocity.y, RightFoot.angularVelocity, Vector2.Distance(new Vector2(transform.position.x, 0), new Vector2(WoD.Pos, 0)) }; float[] neurons = net.FeedForward(inputs); //HeadTransform.Rotate(Vector3.forward , neurons[(int)Neuron.Head]); //LeftArmTransform.Rotate(Vector3.forward , neurons[(int)Neuron.LeftArm]); //RightArmTransform.Rotate(Vector3.forward , neurons[(int)Neuron.RightArm]); //LeftLegTransform.Rotate(Vector3.forward , neurons[(int)Neuron.LeftLeg]); //LeftFootTransform.Rotate(Vector3.forward , neurons[(int)Neuron.LeftFoot]); //RightLegTransform.Rotate(Vector3.forward , neurons[(int)Neuron.RightLeg]); //RightFootTransform.Rotate(Vector3.forward , neurons[(int)Neuron.RightFoot]); //ChestTransform.Rotate(Vector3.forward , neurons[(int)Neuron.Torso]); Head.AddTorque(neurons[(int)Neuron.Head] * 5f, ForceMode2D.Force); LeftArm.AddTorque(neurons[(int)Neuron.LeftArm] * 5f, ForceMode2D.Force); RightArm.AddTorque(neurons[(int)Neuron.RightArm] * 5f, ForceMode2D.Force); LeftLeg.AddTorque(neurons[(int)Neuron.LeftLeg] * 20f, ForceMode2D.Force); LeftFoot.AddTorque(neurons[(int)Neuron.LeftFoot] * 20f, ForceMode2D.Force); RightLeg.AddTorque(neurons[(int)Neuron.RightLeg] * 20f, ForceMode2D.Force); RightFoot.AddTorque(neurons[(int)Neuron.RightFoot] * 20f, ForceMode2D.Force); Chest.AddTorque(neurons[(int)Neuron.Torso] * 5f, ForceMode2D.Force); if (_shouldPunish > 0) { if (killTimerValue > 0) { killTimerValue -= Time.deltaTime; } else { Kill(); } } else { net.SetFitness(transform.position.x * 2); killTimerValue = killTimer; } net.SetTimeAlive(timeAlive); currentScore = net.GetFitness(); lastPosition = transform.position.x; if (WoD.Pos >= transform.position.x) { Kill(); } } timeAlive += Time.deltaTime; }
private void FixedUpdate() { if (Controller == null) { return; } if (!IsMenuPlayer && GameplayManager.Instance != null && !GameplayManager.Instance.IsGameRunning) { return; } UpdateLeg(LegLeft, Controller.LeftStick.Vector, Controller.LeftTrigger, Controller.LeftBumper); UpdateLeg(LegRight, Controller.RightStick.Vector, Controller.RightTrigger, Controller.RightBumper); { // pick up items var tryEquipLeft = Controller.LeftStickButton.IsPressed && !LegLeft.TryEquip; // disallow simultaneous equip var tryEquipRight = !tryEquipLeft && Controller.RightStickButton.IsPressed && !LegRight.TryEquip; if (tryEquipLeft || tryEquipRight) { var availableItems = new List <Shoe>(); var itemFilter = new ContactFilter2D(); itemFilter.SetLayerMask(LayerMask.GetMask("Pickups")); foreach (var zone in ItemPickupZones) // query pickup zones { var colliders = new Collider2D[5]; var count = zone.OverlapCollider(itemFilter, colliders); for (int i = 0; i < count; i++) { var shoe = colliders[i].GetComponent <Shoe>(); if (shoe.IsEquipped) { continue; // skip already equipped shoes } availableItems.Add(shoe); // accumulate into list } } if (availableItems.Count > 0) { Leg targetLeg; if (tryEquipLeft) { targetLeg = LegLeft; } else { targetLeg = LegRight; } var toePos = targetLeg.ToePos; var closest = availableItems .OrderBy(shoe => Vector2.Distance(shoe.transform.position, toePos)) .First(); targetLeg.EquipShoe(closest); targetLeg.TryEquip = true; } } // only reset hold status to false here: allow player to pre-emptively hold equip button if (!Controller.LeftStickButton.IsPressed) { LegLeft.TryEquip = false; } if (!Controller.RightStickButton.IsPressed) { LegRight.TryEquip = false; } } #if false { // head stabilization // angular velocity (omega) var omega = Head.angularVelocity; var omegaTarget = 0; var omegaStabilizer = Mathf.Sign(omegaTarget - omega); // orientation (theta) var dirFacing = Head.transform.up; var dirUpright = Vector2.up; if (Controller.LeftTrigger || Controller.RightTrigger) // user head tilt { var rollDir = Controller.LeftTrigger.Value - Controller.RightTrigger.Value; dirUpright = Quaternion.Euler(0, 0, rollDir * HeadTiltThetaMax) * dirUpright; } var thetaStabilizer = Vector2.SignedAngle(dirFacing, dirUpright) / 180; // interpolate between stabilizers to create dynamic equilibrium omega = Mathf.Abs(omega); omega *= HeadStabilizerCurve; Head.AddTorque(HeadTorqueMax * Mathf.Lerp(thetaStabilizer, omegaStabilizer, omega / (omega + 1))); } #endif }