V3.4.4 添加goto模式的facing reward逻辑

This commit is contained in:
2023-10-16 05:02:57 +09:00
parent 55f6604307
commit 03267d2cf8
4 changed files with 289 additions and 179 deletions
+1 -1
View File
@@ -1 +1 @@
{"count":1,"self":42.7917504,"total":45.840999599999996,"children":{"InitializeActuators":{"count":16,"self":0.0015019,"total":0.0015019,"children":null},"InitializeSensors":{"count":16,"self":0.00099969999999999985,"total":0.00099969999999999985,"children":null},"AgentSendState":{"count":2035,"self":0.0440006,"total":0.3455137,"children":{"CollectObservations":{"count":16280,"self":0.2760035,"total":0.2760035,"children":null},"WriteActionMask":{"count":16280,"self":0.0064982,"total":0.0064982,"children":null},"RequestDecision":{"count":16280,"self":0.019011399999999998,"total":0.019011399999999998,"children":null}}},"DecideAction":{"count":2035,"self":0.035509,"total":0.035509,"children":null},"AgentAct":{"count":2035,"self":2.665227,"total":2.665227,"children":null}},"gauges":{"AKMAgent.CumulativeReward":{"count":8,"max":-3433.441,"min":-3530.441,"runningAverage":-3499.16846,"value":-3501.745,"weightedAverage":-3498.86719}},"metadata":{"timer_format_version":"0.1.0","start_time_seconds":"1697194176","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 c57717c0-8037-43a1-9b17-6da52d928d0a -accessToken JtXVST_-C_-hrK_sQsf9MIJHfnFdao4yGGHsakllFpE00ef","communication_protocol_version":"1.5.0","com.unity.ml-agents_version":"2.0.1","scene_name":"Train","end_time_seconds":"1697194222"}}
{"count":1,"self":66.9065984,"total":71.9882009,"children":{"InitializeActuators":{"count":16,"self":0.0009969,"total":0.0009969,"children":null},"InitializeSensors":{"count":16,"self":0.0009994,"total":0.0009994,"children":null},"AgentSendState":{"count":3334,"self":0.044007,"total":0.43848919999999997,"children":{"CollectObservations":{"count":26672,"self":0.3689863,"total":0.3689863,"children":null},"WriteActionMask":{"count":26672,"self":0.0044905,"total":0.0044905,"children":null},"RequestDecision":{"count":26672,"self":0.0210054,"total":0.0210054,"children":null}}},"DecideAction":{"count":3334,"self":0.0480142,"total":0.0480142,"children":null},"AgentAct":{"count":3334,"self":4.5931028,"total":4.5931029,"children":null}},"gauges":{"AKMAgent.CumulativeReward":{"count":18,"max":4761.187,"min":-3316.413,"runningAverage":119.63308,"value":4761.187,"weightedAverage":2609.449}},"metadata":{"timer_format_version":"0.1.0","start_time_seconds":"1697400022","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 e4e811a4-b1b9-40c9-bb87-1f58481c4f0b -accessToken gZraEFpga1zyWWe2F_cgXvA55kRNGoKgEeraCZAmspA00ef","communication_protocol_version":"1.5.0","com.unity.ml-agents_version":"2.0.1","scene_name":"Train","end_time_seconds":"1697400094"}}
+74 -6
View File
@@ -544,6 +544,7 @@ GameObject:
m_Component:
- component: {fileID: 23773338}
- component: {fileID: 23773337}
- component: {fileID: 23773339}
m_Layer: 0
m_Name: FPSCamera
m_TagString: MainCamera
@@ -610,6 +611,39 @@ Transform:
m_Father: {fileID: 1371564650}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &23773339
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 23773336}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3}
m_Name:
m_EditorClassIdentifier:
m_RenderShadows: 1
m_RequiresDepthTextureOption: 2
m_RequiresOpaqueTextureOption: 2
m_CameraType: 0
m_Cameras: []
m_RendererIndex: -1
m_VolumeLayerMask:
serializedVersion: 2
m_Bits: 1
m_VolumeTrigger: {fileID: 0}
m_VolumeFrameworkUpdateModeOption: 2
m_RenderPostProcessing: 0
m_Antialiasing: 0
m_AntialiasingQuality: 2
m_StopNaN: 0
m_Dithering: 0
m_ClearDepth: 1
m_AllowXRRendering: 1
m_RequiresDepthTexture: 0
m_RequiresColorTexture: 0
m_Version: 2
--- !u!1 &25228958
GameObject:
m_ObjectHideFlags: 0
@@ -6962,7 +6996,7 @@ MonoBehaviour:
m_Calls:
- m_Target: {fileID: 2082200185}
m_TargetAssemblyTypeName: HUDController, Assembly-CSharp
m_MethodName: OnSaveModelButtonPressed
m_MethodName: OnChartOnToggleChange
m_Mode: 1
m_Arguments:
m_ObjectArgument: {fileID: 0}
@@ -9974,7 +10008,7 @@ Mesh:
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: pb_Mesh31130
m_Name: pb_Mesh30798
serializedVersion: 10
m_SubMeshes:
- serializedVersion: 2
@@ -12850,7 +12884,7 @@ Mesh:
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: pb_Mesh27424
m_Name: pb_Mesh27090
serializedVersion: 10
m_SubMeshes:
- serializedVersion: 2
@@ -15836,7 +15870,7 @@ Mesh:
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: pb_Mesh27506
m_Name: pb_Mesh27172
serializedVersion: 10
m_SubMeshes:
- serializedVersion: 2
@@ -24377,6 +24411,7 @@ GameObject:
m_Component:
- component: {fileID: 820011448}
- component: {fileID: 820011447}
- component: {fileID: 820011449}
m_Layer: 0
m_Name: FPSCamera
m_TagString: MainCamera
@@ -24443,6 +24478,39 @@ Transform:
m_Father: {fileID: 1418082596}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &820011449
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 820011446}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3}
m_Name:
m_EditorClassIdentifier:
m_RenderShadows: 1
m_RequiresDepthTextureOption: 2
m_RequiresOpaqueTextureOption: 2
m_CameraType: 0
m_Cameras: []
m_RendererIndex: -1
m_VolumeLayerMask:
serializedVersion: 2
m_Bits: 1
m_VolumeTrigger: {fileID: 0}
m_VolumeFrameworkUpdateModeOption: 2
m_RenderPostProcessing: 0
m_Antialiasing: 0
m_AntialiasingQuality: 2
m_StopNaN: 0
m_Dithering: 0
m_ClearDepth: 1
m_AllowXRRendering: 1
m_RequiresDepthTexture: 0
m_RequiresColorTexture: 0
m_Version: 2
--- !u!1 &822320913
GameObject:
m_ObjectHideFlags: 0
@@ -25553,7 +25621,7 @@ Mesh:
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: pb_Mesh27296
m_Name: pb_Mesh26962
serializedVersion: 10
m_SubMeshes:
- serializedVersion: 2
@@ -40637,7 +40705,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0.000030517578, y: -246.2022}
m_AnchoredPosition: {x: 0.000030517578, y: -246.20192}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0, y: 0}
--- !u!114 &1442113294
@@ -199,7 +199,7 @@ public class AgentController : MonoBehaviour
Vector3 point = new Vector3(fpsCam.pixelWidth / 2, fpsCam.pixelHeight / 2, 0);//发射位置
Ray ray = fpsCam.ScreenPointToRay(point);
RaycastHit hit;
// Debug.DrawRay(ray.origin, ray.direction * 100, Color.blue);
// Debug.DrawRay(centerRay.origin, centerRay.direction * 100, Color.blue);
//按下鼠标左键
if (shootState != 0 && gunReadyToggle == true)
{
@@ -225,7 +225,7 @@ public class AgentController : MonoBehaviour
if (Vector3.Distance(ray.origin + (ray.direction * targetDis), blockContainer.nowBlock.transform.position) <= blockContainer.nowBlock.firebasesAreaDiameter / 2)
{
// im shooting at target but didn't hit enemy
// Debug.DrawRay(ray.origin, viewPoint-ray.origin, Color.blue);
// Debug.DrawRay(centerRay.origin, viewPoint-centerRay.origin, Color.blue);
return paramContainer.shootTargetAreaReward;
}
}
@@ -252,79 +252,121 @@ public class AgentController : MonoBehaviour
float nowReward = 0;
bool isFacingtoEnemy = false;
float enemyFacingDistance = 0f;
Ray ray = fpsCam.ScreenPointToRay(new Vector3(fpsCam.pixelWidth / 2, fpsCam.pixelHeight / 2, 0));
if (targetCon.targetTypeInt == (int)Targets.Free)
Vector3 screenCenter = new Vector3(fpsCam.pixelWidth / 2, fpsCam.pixelHeight / 2, 0);
Vector3 screenLeft = new Vector3(0, fpsCam.pixelHeight / 2, 0);
Ray centerRay = fpsCam.ScreenPointToRay(screenCenter);
Ray leftRay = fpsCam.ScreenPointToRay(screenLeft);
// target fireBaseArea Position, turen y to camera's y
Vector3 fireBaseArea = blockContainer.nowBlock.fireBasesAreaObj.transform.position;
fireBaseArea.y = fpsCam.transform.position.y;
// my position, turn y to camera's y
// Debug.DrawRay(fpsCam.transform.position, centerRay.direction * 100, Color.blue);
Vector3 myposition = transform.position;
myposition.y = fpsCam.transform.position.y;
// Target to Agent distance
//Debug.DrawLine(fireBaseArea, myposition, Color.red);
float targetDis = Vector3.Distance(fireBaseArea, myposition);
// point in centerRay and leftRay which distance is targetDis from camera center
Vector3 pointInCenterRay = fpsCam.transform.position + (centerRay.direction * targetDis);
Vector3 pointInLeftRay = fpsCam.transform.position + (leftRay.direction * targetDis);
// center of screen to target's distance
// Debug.DrawLine(pointInCenterRay, fireBaseArea,Color.green);
float camCenterToTarget = Vector3.Distance(pointInCenterRay, fireBaseArea);
// left of screen to target's distance
// Debug.DrawLine(pointInLeftRay, pointInCenterRay, Color.yellow);
float camCenterToViewEdge = Vector3.Distance(pointInLeftRay, pointInCenterRay);
switch (targetCon.targetTypeInt)
{
//free mode
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 100))
{
// facing to an enemy
if (hit.collider.tag != myTag && hit.collider.tag != "Wall")
case (int)Targets.Free:
//free mode
RaycastHit hit;
if (Physics.Raycast(centerRay, out hit, 100))
{
// facing to an enemy
if (hit.collider.tag != myTag && hit.collider.tag != "Wall")
{
nowReward = paramContainer.facingReward;
isFacingtoEnemy = true;
}
}
if (raySensors.inViewEnemies.Count > 0 && !isFacingtoEnemy)
{
// have enemy in view
List<float> projectionDis = new List<float>();
foreach (GameObject theEnemy in raySensors.inViewEnemies)
{
// for each enemy in view
Vector3 projection = Vector3.Project(theEnemy.transform.position - transform.position, (centerRay.direction * 10));
Vector3 verticalToRay = transform.position + projection - theEnemy.transform.position;
projectionDis.Add(verticalToRay.magnitude);
// Debug.Log("enemy!" + verticalToRay.magnitude);
// Debug.DrawRay(transform.position, (centerRay.direction * 100), Color.cyan);
// Debug.DrawRay(transform.position, theEnemy.transform.position - transform.position, Color.yellow);
// Debug.DrawRay(transform.position, projection, Color.blue);
// Debug.DrawRay(theEnemy.transform.position, verticalToRay, Color.magenta);
}
enemyFacingDistance = projectionDis.Min();
if (enemyFacingDistance <= lastEnemyFacingDistance)
{
// closing to enemy
nowReward = 1 / MathF.Sqrt(paramContainer.facingInviewEnemyDisCOEF * enemyFacingDistance + 0.00001f);
}
else
{
nowReward = 0;
}
// enemy in view Reward
lastEnemyFacingDistance = enemyFacingDistance;
if (nowReward >= paramContainer.facingReward) nowReward = paramContainer.facingReward; // limit
if (nowReward <= -paramContainer.facingReward) nowReward = -paramContainer.facingReward; // limit
// Debug.Log("ninimum = " + nowReward);
}
break;
case (int)Targets.Attack:
// attack mode
if (targetDis <= raySensors.viewDistance)
{
// Debug.DrawRay(new Vector3(0,0,0), viewPoint, Color.red);
// while center of screen between target's distance is lower than firebasesAreaDiameter
// while facing to target
if (camCenterToTarget <= blockContainer.nowBlock.firebasesAreaDiameter / 2)
{
// Debug.DrawRay(centerRay.origin, viewPoint-centerRay.origin, Color.blue);
nowReward = paramContainer.facingReward;
}
else
{
// while not facing to target
nowReward = (lastTargetFacingDistance - camCenterToTarget) * paramContainer.facingTargetReward;
}
}
// update lastTargetFacingDistance
lastTargetFacingDistance = camCenterToTarget;
break;
case (int)Targets.Go:
// goto mode
if (camCenterToTarget <= camCenterToViewEdge)
{
// fireArea is in view
nowReward = paramContainer.facingReward;
isFacingtoEnemy = true;
}
}
if (raySensors.inViewEnemies.Count > 0 && !isFacingtoEnemy)
{
// have enemy in view
List<float> projectionDis = new List<float>();
foreach (GameObject theEnemy in raySensors.inViewEnemies)
{
// for each enemy in view
Vector3 projection = Vector3.Project(theEnemy.transform.position - transform.position, (ray.direction * 10));
Vector3 verticalToRay = transform.position + projection - theEnemy.transform.position;
projectionDis.Add(verticalToRay.magnitude);
// Debug.Log("enemy!" + verticalToRay.magnitude);
// Debug.DrawRay(transform.position, (ray.direction * 100), Color.cyan);
// Debug.DrawRay(transform.position, theEnemy.transform.position - transform.position, Color.yellow);
// Debug.DrawRay(transform.position, projection, Color.blue);
// Debug.DrawRay(theEnemy.transform.position, verticalToRay, Color.magenta);
}
enemyFacingDistance = projectionDis.Min();
if (enemyFacingDistance <= lastEnemyFacingDistance)
{
// closing to enemy
nowReward = 1 / MathF.Sqrt(paramContainer.facingInviewEnemyDisCOEF * enemyFacingDistance + 0.00001f);
}
else
{
nowReward = 0;
}
// enemy in view Reward
lastEnemyFacingDistance = enemyFacingDistance;
if (nowReward >= paramContainer.facingReward) nowReward = paramContainer.facingReward; // limit
if (nowReward <= -paramContainer.facingReward) nowReward = -paramContainer.facingReward; // limit
// Debug.Log("ninimum = " + nowReward);
}
}
else if (targetCon.targetTypeInt == (int)Targets.Attack)
{
// attack mode
// Target to Agent distance
float targetDis = Vector3.Distance(blockContainer.nowBlock.transform.position, transform.position);
// center of screen between target's distance
float camCenterToTarget = Vector3.Distance(ray.origin + (ray.direction * targetDis), blockContainer.nowBlock.transform.position);
if (targetDis <= raySensors.viewDistance)
{
// Debug.DrawRay(new Vector3(0,0,0), viewPoint, Color.red);
// while center of screen between target's distance is lower than firebasesAreaDiameter
// while facing to target
if (camCenterToTarget <= blockContainer.nowBlock.firebasesAreaDiameter / 2)
{
// Debug.DrawRay(ray.origin, viewPoint-ray.origin, Color.blue);
nowReward = paramContainer.facingReward;
}
else
{
// while not facing to target
nowReward = (lastTargetFacingDistance - camCenterToTarget) * paramContainer.facingTargetReward;
}
}
// update lastTargetFacingDistance
lastTargetFacingDistance = camCenterToTarget;
break;
default:
Debug.LogError("Wrong target type");
break;
}
return nowReward;
}