V2.5 Change reward function

Add chart Toggle to turn on reward chart real time in game.
Add enemy num changer, now can change enemy num in game.
Change facing to enemy reward function, while facing center line far from enemy will not get reward any more.
This commit is contained in:
2022-12-09 18:53:53 +09:00
parent f9b806de02
commit 9b2ba7fb46
10 changed files with 1821 additions and 218 deletions
@@ -144,8 +144,15 @@ public class FreeFlyCamera : MonoBehaviour
private void Update()
{
if (Input.GetKey(KeyCode.M))
_active = !_active;
if (!_active)
{
Cursor.lockState = _wantedMode = CursorLockMode.None;
Cursor.visible = (CursorLockMode.Locked != _wantedMode);
return;
}
SetCursorState();
+60
View File
@@ -0,0 +1,60 @@
using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
public class HUDController : MonoBehaviour
{
public bool chartOn = false;
public Toggle chartOnToggleObj;
public TMP_InputField chartOnTimeOutInputObj;
public TMP_InputField enemyNumInputObj;
public float chartOnTimeOut = 1;
public int enemyNum= 3;
public float chartOnTimeOutDefault = 120f;
private float chatOntimeStart = 0;
private void Update()
{
if (chartOn)
{
if (Time.time - chatOntimeStart >= chartOnTimeOut )
{
chartOn = false;
chartOnToggleObj.isOn = false;
}
}
}
public void onChartOnToggleChange()
{
chatOntimeStart = Time.time;
chartOn = chartOnToggleObj.isOn;
}
public void onEnemyNumTextChange()
{
try
{
enemyNum = Math.Abs(int.Parse(enemyNumInputObj.GetComponent<TMP_InputField>().text));
}
catch (NullReferenceException)
{
enemyNum = 3;
}
}
public void onChartTimeOutTextChange()
{
try
{
chartOnTimeOut = Math.Abs(int.Parse(chartOnTimeOutInputObj.GetComponent<TMP_InputField>().text));
}
catch (NullReferenceException)
{
chartOnTimeOut = chartOnTimeOutDefault;
}
}
}
+11
View File
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 10f34b6fb217eff4e9be2bfe7044f132
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+1 -1
View File
@@ -1 +1 @@
{"count":1,"self":68.6533376,"total":73.8963627,"children":{"InitializeActuators":{"count":16,"self":0.0020016,"total":0.0020016,"children":null},"InitializeSensors":{"count":16,"self":0.0015004999999999999,"total":0.0015004999999999999,"children":null},"AgentSendState":{"count":3437,"self":0.0406625,"total":0.1679606,"children":{"CollectObservations":{"count":27496,"self":0.0937596,"total":0.0937596,"children":null},"WriteActionMask":{"count":27496,"self":0.0085214,"total":0.0085214,"children":null},"RequestDecision":{"count":27496,"self":0.0250171,"total":0.0250171,"children":null}}},"DecideAction":{"count":3437,"self":0.051228499999999996,"total":0.051228499999999996,"children":null},"AgentAct":{"count":3437,"self":5.0198247999999994,"total":5.0198249,"children":null}},"gauges":{"AKMAgent.CumulativeReward":{"count":18,"max":2136.51074,"min":-6861.4585,"runningAverage":-3835.49414,"value":2136.51074,"weightedAverage":-1836.73022}},"metadata":{"timer_format_version":"0.1.0","start_time_seconds":"1670446861","unity_version":"2021.3.14f1","command_line_arguments":"C:\\Program Files\\Unity\\Hub\\Editor\\2021.3.14f1\\Editor\\Unity.exe -projectpath C:\\Users\\UCUNI\\OneDrive\\Unity\\ML-Agents\\Aimbot-ParallelEnv -useHub -hubIPC -cloudEnvironment production -licensingIpc LicenseClient-UCUNI -hubSessionId 65c82a90-7486-11ed-899f-f7f93bed2228 -accessToken K6WsTHUI33yXzJI3wDtPXzHPZq5eLKSYBLKbLhzh7nc00ef","communication_protocol_version":"1.5.0","com.unity.ml-agents_version":"2.0.1","scene_name":"InGame","end_time_seconds":"1670446934"}}
{"count":1,"self":7.6010208,"total":7.7934259,"children":{"InitializeActuators":{"count":16,"self":0.001499,"total":0.001499,"children":null},"InitializeSensors":{"count":16,"self":0.001,"total":0.001,"children":null},"AgentSendState":{"count":138,"self":0.002006,"total":0.0155275,"children":{"CollectObservations":{"count":1104,"self":0.010023899999999999,"total":0.010023899999999999,"children":null},"WriteActionMask":{"count":1104,"self":0.0015048,"total":0.0015048,"children":null},"RequestDecision":{"count":1104,"self":0.0019928,"total":0.0019928,"children":null}}},"DecideAction":{"count":138,"self":0.0055068,"total":0.0055068,"children":null},"AgentAct":{"count":138,"self":0.1678665,"total":0.1678665,"children":null}},"gauges":{},"metadata":{"timer_format_version":"0.1.0","start_time_seconds":"1670578612","unity_version":"2021.3.14f1","command_line_arguments":"C:\\Program Files\\Unity\\Hub\\Editor\\2021.3.14f1\\Editor\\Unity.exe -projectpath C:\\Users\\UCUNI\\OneDrive\\Unity\\ML-Agents\\Aimbot-ParallelEnv -useHub -hubIPC -cloudEnvironment production -licensingIpc LicenseClient-_qjpya-1B8A6Gvs6pbjAv -hubSessionId 13566e90-76f5-11ed-81d5-5bc0486f82d5 -accessToken qw1R29ZQd77wYz840DIgO8Mcql8NgyzciHRCP0pk3Ls00ef","communication_protocol_version":"1.5.0","com.unity.ml-agents_version":"2.0.1","scene_name":"InGame","end_time_seconds":"1670578620"}}
+1589 -62
View File
File diff suppressed because it is too large Load Diff
+25 -42
View File
@@ -29,6 +29,7 @@ public class AgentWithGun : Agent
public GameObject SceneBlockContainerObj;
public GameObject EnvironmentUIControlObj;
public GameObject TargetControllerObj;
public GameObject HUDObj;
public Camera thisCam;
[Header("GetAxis() Simulate")]
@@ -52,7 +53,6 @@ public class AgentWithGun : Agent
// environment
private int shoot = 0;
private float lastShootTime = 0.0f;
private int nowEnemyNum = 0;
private int enemyKillCount = 0;
private Vector3 killEnemyPosition;
private int step = 0;
@@ -60,6 +60,7 @@ public class AgentWithGun : Agent
public bool defaultTPCamera = true;
private bool gunReadyToggle = true;
private string myTag = "";
private float lastEnemyFacingDistance = 0f; // record last enemy facing minimum distance
// scripts
private RaySensors rayScript;
private CharacterController PlayerController;
@@ -68,6 +69,7 @@ public class AgentWithGun : Agent
private SceneBlockContainer blockContainer;
private EnemyContainer eneContainer;
private TargetController targetCon;
private HUDController hudController;
[System.NonSerialized] public int finishedState;
@@ -78,13 +80,14 @@ public class AgentWithGun : Agent
blockContainer = SceneBlockContainerObj.GetComponent<SceneBlockContainer>();
EnvUICon = EnvironmentUIControlObj.GetComponent<EnvironmentUIControl>();
targetCon = TargetControllerObj.GetComponent<TargetController>();
hudController = HUDObj.GetComponent<HUDController>();
rayScript = GetComponent<RaySensors>();
PlayerController = this.transform.GetComponent<CharacterController>();
// Environment parameters
lockMouse = paramContainer.lockMouse;
Damage = paramContainer.Damage;
fireRate = paramContainer.fireRate;
enemyNum = paramContainer.enemyNum;
enemyNum = hudController.enemyNum;
lockCameraX = paramContainer.lockCameraX;
lockCameraY = paramContainer.lockCameraY;
//initialize remainTime
@@ -291,6 +294,7 @@ public class AgentWithGun : Agent
{
float thisReward = 0;
bool isFacingtoEnemy = false;
float enemyFacingDistance = 0f;
Ray ray = thisCam.ScreenPointToRay(new Vector3(thisCam.pixelWidth / 2, thisCam.pixelHeight / 2, 0));
if (targetCon.targetTypeInt == (int)TargetController.Targets.Free)
{
@@ -320,10 +324,21 @@ public class AgentWithGun : Agent
// Debug.DrawRay(transform.position, projection, Color.blue);
// Debug.DrawRay(thisEnemy.transform.position, verticalToRay, Color.magenta);
}
enemyFacingDistance = projectionDis.Min();
if(enemyFacingDistance <= lastEnemyFacingDistance)
{
// closing to enemy
thisReward = 1 / MathF.Sqrt(paramContainer.facingInviewEnemyDisCOEF * enemyFacingDistance + 0.00001f);
}
else
{
thisReward = 0;
}
// enemy in view Reward
thisReward = 1 / MathF.Sqrt(paramContainer.facingInviewEnemyDisCOEF* projectionDis.Min()+0.00001f);
lastEnemyFacingDistance = enemyFacingDistance;
if (thisReward >= paramContainer.facingReward) thisReward = paramContainer.facingReward; // limit
Debug.Log("ninimum = " + thisReward);
if (thisReward <= -paramContainer.facingReward) thisReward = -paramContainer.facingReward; // limit
// Debug.Log("ninimum = " + thisReward);
}
}
else if(targetCon.targetTypeInt == (int)TargetController.Targets.Attack)
@@ -343,41 +358,6 @@ public class AgentWithGun : Agent
}
return thisReward;
}
// getEnemyNum 获取现场除了自己以外的敌人数量
int getEnemyNum()
{
int enemyNum = 0;
GameObject[] EnemyGameObjs;
EnemyGameObjs = GameObject.FindGameObjectsWithTag("Enemy");
//遍历所有Enemy
foreach (GameObject EnemyObj in EnemyGameObjs)
{
Vector3 thisEnemyPosition = EnemyObj.transform.localPosition;
Vector3 thisEnemyScale = EnemyObj.transform.localScale;
Vector3 MyselfPosition = transform.localPosition;
//探测到Agent为自己时的处理
if (thisEnemyPosition == MyselfPosition)
{
//Debug.Log("OH It's me");
}
else
{
enemyNum += 1;
}
}
return enemyNum;
}
// enemyNumDiff 获取与上一把相比敌人数量的区别
int enemyNumDiff()
{
int diff = 0;
int nowEnemyNum = getEnemyNum();
diff = enemyNum - nowEnemyNum;
return diff;
}
// ------------Reward--------------
// rewardCalculate 计算本动作的Reward
@@ -433,9 +413,8 @@ public class AgentWithGun : Agent
//thisAgentObj.name = thisAgentObj.GetInstanceID().ToString();
targetCon.rollNewScene();
paramContainer.resetTimeBonusReward();
nowEnemyNum = getEnemyNum(); // Reset Enemy number
// give default Reward to Reward value will be used.
if (paramContainer.chartOn)
if (hudController.chartOn)
{
EnvUICon.initChart();
}
@@ -491,10 +470,14 @@ public class AgentWithGun : Agent
float endReward = 0f;
(finishedState, sceneReward, endReward) = targetCon.checkOverAndRewards();
float thisRoundReward = rewardCalculate(sceneReward+ endReward,Mouse_X);
if (paramContainer.chartOn)
if (hudController.chartOn)
{
EnvUICon.updateChart(thisRoundReward);
}
else
{
EnvUICon.removeChart();
}
//Debug.Log("reward = " + thisRoundReward);
if (finishedState != (int)TargetController.EndType.Running)
{
+15 -1
View File
@@ -12,6 +12,7 @@ public class EnvironmentUIControl : MonoBehaviour
public GameObject ParameterContainerObj;
public GameObject GroundCanvasObj;
public GameObject chartObj;
public GameObject HUDObj;
public TextMeshProUGUI remainTimeText;
public TextMeshProUGUI targetTypeText;
public TextMeshProUGUI winLoseText;
@@ -21,6 +22,7 @@ public class EnvironmentUIControl : MonoBehaviour
private LineChart realTimeRewardChart = null;
private TargetController targetController;
private ParameterContainer paramContainer;
private HUDController hudController;
private Image gaugeImg;
private float overTime = 0f;
private int step = 0;
@@ -32,6 +34,7 @@ public class EnvironmentUIControl : MonoBehaviour
targetController = TargetControllerObj.GetComponent<TargetController>();
paramContainer = ParameterContainerObj.GetComponent<ParameterContainer>();
gaugeImg = gaugeImgObj.GetComponent<Image>();
hudController = HUDObj.GetComponent<HUDController>();
}
// Update is called once per frame
@@ -51,6 +54,10 @@ public class EnvironmentUIControl : MonoBehaviour
}
public void updateChart(float reward)
{
if (hudController.chartOn && realTimeRewardChart == null)
{
initChart();
}
step += 1;
realTimeRewardChart.AddXAxisData(Convert.ToString(step));
realTimeRewardChart.AddData(0, reward);
@@ -58,7 +65,7 @@ public class EnvironmentUIControl : MonoBehaviour
public void initChart()
{
if (paramContainer.chartOn && realTimeRewardChart == null)
if (hudController.chartOn && realTimeRewardChart == null)
{
Vector3 chartPos = new Vector3(-210f, 90f, 0f) * GroundCanvasObj.transform.localScale.x;
realTimeRewardChart = chartObj.AddComponent<LineChart>();
@@ -68,6 +75,13 @@ public class EnvironmentUIControl : MonoBehaviour
realTimeRewardChart.AddSerie<Line>("Rewards");
}
public void removeChart()
{
GameObject.Destroy(realTimeRewardChart);
realTimeRewardChart = null;
}
// show result in UI
public void showResult(int resultState)
{
@@ -17,11 +17,9 @@ public class ParameterContainer : MonoBehaviour
public bool lockMouse = false;
public float Damage = 50; // damage to enemy
public float fireRate = 0.5f;
public int enemyNum = 3;
public int timeLimit = 30;
public bool lockCameraX = false;
public bool lockCameraY = true;
public bool chartOn = false;
public bool spawnAgentInAllMap = false;
public int spinRecordMax = 20;
public float spinPenaltyThreshold = 50;
+7 -4
View File
@@ -9,6 +9,7 @@ public class TargetController : MonoBehaviour
{
public GameObject EnvironmentObj;
public GameObject AgentObj;
public GameObject HUDObj;
public GameObject SceneBlockContainerObj;
public GameObject EnemyContainerObj;
public GameObject ParameterContainerObj;
@@ -61,6 +62,7 @@ public class TargetController : MonoBehaviour
private ParameterContainer paramCon;
private CharacterController agentCharaCon;
private WorldUIController worldUICon;
private HUDController hudCon;
// Start is called before the first frame update
void Start()
@@ -81,6 +83,7 @@ public class TargetController : MonoBehaviour
agentCharaCon = AgentObj.GetComponent<CharacterController>();
paramCon = ParameterContainerObj.GetComponent<ParameterContainer>();
worldUICon = WorldUIObj.GetComponent<WorldUIController>();
hudCon = HUDObj.GetComponent<HUDController>();
freeProb = 1 - attackProb - gotoProb - defenceProb;
targetNum = (int)Targets.Num;
if (freeProb < 0)
@@ -128,7 +131,7 @@ public class TargetController : MonoBehaviour
blockCont.destroyBlock();
blockCont.createNewBlock(targetTypeInt, randBlockType, targetPosition, group1Tag, group2Tag);
enemyCont.destroyAllEnemys();
enemyCont.randomInitEnemysExcept(paramCon.enemyNum, targetPosition, sceneSize);
enemyCont.randomInitEnemysExcept(hudCon.enemyNum, targetPosition, sceneSize);
blockCont.thisBlock.initBlock(EnvironmentObj);
// set startDistance
firstRewardFlag = true;
@@ -150,7 +153,7 @@ public class TargetController : MonoBehaviour
blockCont.destroyBlock();
blockCont.createNewBlock(targetTypeInt, randBlockType, targetPosition, group1Tag, group2Tag);
enemyCont.destroyAllEnemys();
enemyCont.randomInitEnemysExcept(paramCon.enemyNum, targetPosition, sceneSize);
enemyCont.randomInitEnemysExcept(hudCon.enemyNum, targetPosition, sceneSize);
blockCont.thisBlock.initBlock(EnvironmentObj);
// set startDistance
firstRewardFlag = true;
@@ -173,7 +176,7 @@ public class TargetController : MonoBehaviour
blockCont.destroyBlock();
blockCont.createNewBlock(targetTypeInt, randBlockType, targetPosition, group1Tag, group2Tag);
enemyCont.destroyAllEnemys();
enemyCont.randomInitEnemysExcept(paramCon.enemyNum, targetPosition, sceneSize);
enemyCont.randomInitEnemysExcept(hudCon.enemyNum, targetPosition, sceneSize);
blockCont.thisBlock.initBlock(EnvironmentObj);
// set startDistance
firstRewardFlag = true;
@@ -183,7 +186,7 @@ public class TargetController : MonoBehaviour
Debug.Log("Free");
targetTypeInt = (int)Targets.Free;
enemyCont.destroyAllEnemys();
enemyCont.randomInitEnemys(paramCon.enemyNum);
enemyCont.randomInitEnemys(hudCon.enemyNum);
moveAgentToSpwanArea();
blockCont.destroyBlock();
}