private void YieldRewards() { // sudden deaths if (BallOut() || PoleOut()) { statistics.AddOut(); ResetPole(); // EndEpisode(); } if (BallRest()) { // Debug.Log("Ball rests"); AddReward(BallRestPenalty); statistics.AddRest(); SpawnTheBall(); // EndEpisode(); } // Rewards AddReward(BallContact()); //for precise kicks towards the goal AddReward(AimingAccuracy()); AddReward(TargetApproximation()); //try to penalty heavy rotation AddReward(HeavyRotation()); if (_ballColliders.touchedHomeZone) { // Debug.Log("penalty area"); AddReward(LameDefensePenalty); _ballColliders.touchedHomeZone = false; } // if (SlowDownTheBall()) // AddReward(0.3f); // Toooor if (_ballColliders.touchedTarget) { AddReward(Goal); _ballColliders.ResetValues(); EndEpisode(); } // doh, own goal if (_ballColliders.touchedSelfGoal) { AddReward(SelfGoal); _ballColliders.ResetValues(); EndEpisode(); } }
public override void OnActionReceived(float[] vectorAction) { // Actions, size = 1 //weil nur Drehung der einen Achse, würde ich sagen. Vector3 controlSignal = Vector3.zero; controlSignal.x = vectorAction[0] * 200; pole.AddTorque(controlSignal); // sudden deaths if (BallOut()) { Debug.Log("Out!"); EndEpisode(); } if (BallRest()) { EndEpisode(); } // Rewards if (_ballColliders.touchedHomeZone) { // Debug.Log("Strafraum"); SetReward(-0.3f); _ballColliders.touchedHomeZone = false; } if (SlowDownTheBall()) { SetReward(0.3f); } // Reached target if (_ballColliders.touchedTarget) { // Debug.Log("Toooor"); SetReward(1.0f); _ballColliders.ResetValues(); EndEpisode(); } // Tor kassiert if (_ballColliders.touchedSelfGoal) { // Debug.Log("EIGENTOR"); SetReward(-1.0f); _ballColliders.ResetValues(); EndEpisode(); } cumulativeReward.text = GetCumulativeReward().ToString("R"); }