Пример #1
0
    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;
    }
Пример #2
0
    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
    }