Observation多处修复

Observation显示UI修正对应新的Rotation
修正targetState长度错误,优化TargetController的Play模式
修改TargetPosition坐标从TargetBlock坐标为Firebases坐标
修改45s超时动作从加载train scene为退出游戏
This commit is contained in:
2024-01-05 03:46:52 +09:00
parent 481794dcc3
commit 173aff5137
17 changed files with 529 additions and 683 deletions
@@ -12,7 +12,7 @@ public class CommonParameterContainer : Singleton<CommonParameterContainer>
public int timeLimit = 30;
public bool lockCameraX = false;
public bool lockCameraY = true;
public bool oneHotRayTag = false;
public bool oneHotRayTag = true;
public bool spawnAgentInAllMap = true;
public int spinRecordMax = 40;
public float spinPenaltyThreshold = 10;
@@ -30,12 +30,11 @@ public class MLAgentsCustomController : Agent
private RewardFunction rewardFunction;
// observation
private float[] myObserve = new float[4];
private float[] myObserve = new float[5];
private float[] rayTagResult;
private float[] rayTagResultOnehot;
private float[] rayDisResult;
private float[] targetStates;
private float remainTime;
private float inFireBaseState;
@@ -71,7 +70,7 @@ public class MLAgentsCustomController : Agent
{
Debug.Log("MLAgentCustomController.OnEpisodeBegin: play mode start");
// play mode
targetController.PlayInitialize();
targetController.PlayModeInitialize();
// reset target UI
targetUIController.ClearGamePressed();
}
@@ -92,6 +91,7 @@ public class MLAgentsCustomController : Agent
myObserve[1] = transform.localPosition.y / raySensors.viewDistance;
myObserve[2] = transform.localPosition.z / raySensors.viewDistance;
myObserve[3] = transform.eulerAngles.y / 360f;**/
float obsNum = 0f;
float angleInRadians = transform.eulerAngles.y * Mathf.Deg2Rad;
myObserve[0] = transform.localPosition.x;
myObserve[1] = transform.localPosition.y;
@@ -101,28 +101,35 @@ public class MLAgentsCustomController : Agent
rayTagResult = raySensors.rayTagResult;// 探测用RayTag类型结果 float[](raySensorNum,1)
rayTagResultOnehot = raySensors.rayTagResultOneHot; // 探测用RayTagonehot结果 List<int>[](raySensorNum*Tags,1)
rayDisResult = raySensors.rayDisResult; // 探测用RayDis距离结果 float[](raySensorNum,1)
targetStates = targetController.targetState; // (6) targettype, target x,y,z, firebasesAreaDiameter
remainTime = targetController.leftTime;
inFireBaseState = targetController.GetInAreaState();
agentController.UpdateGunState();
//float[] focusEnemyObserve = RaySensors.focusEnemyInfo;// 最近的Enemy情报 float[](3,1) MinEnemyIndex,x,z
//sensor.AddObservation(allEnemyNum); // 敌人数量 int
sensor.AddObservation(targetStates);// (5) targettype, target x,y,z, firebasesAreaDiameter
sensor.AddObservation(targetController.targetState);// (5) targettype, target x,y,z, firebasesAreaDiameter
sensor.AddObservation(inFireBaseState); // (1)
sensor.AddObservation(remainTime); // (1)
sensor.AddObservation(agentController.gunReadyToggle); // (1) save gun is ready?
sensor.AddObservation(myObserve); // (4)自机位置xyz+朝向 float[](4,1)
sensor.AddObservation(myObserve); // (5)自机位置xyz+朝向 float[](5,1)
// count observation number
obsNum = targetController.targetState.Length+1+1+1+myObserve.Length;
Debug.Log(obsNum);
if (commonParamCon.oneHotRayTag)
{
sensor.AddObservation(rayTagResultOnehot); // 探测用RayTag结果 float[](raySensorNum,1)
obsNum += rayTagResultOnehot.Length;
}
else
{
sensor.AddObservation(rayTagResult);
obsNum += rayTagResult.Length;
}
Debug.Log(obsNum);
sensor.AddObservation(rayDisResult); // 探测用RayDis距离结果 float[](raySensorNum,1)
envUIController.UpdateStateText(targetStates, inFireBaseState, remainTime, agentController.gunReadyToggle, myObserve, rayTagResultOnehot, rayDisResult);
obsNum += rayDisResult.Length;
envUIController.UpdateStateText(targetController.targetState, inFireBaseState, remainTime, agentController.gunReadyToggle, myObserve, rayTagResultOnehot, rayDisResult);
Debug.Log(obsNum);
/*foreach(float aaa in rayDisResult)
{
Debug.Log(aaa);
+1 -1
View File
@@ -109,7 +109,7 @@ public class SceneBlock : MonoBehaviour
// Debug.Log("SceneBlock.Start: enemyContainerObj not found, get it by name");
enemyContainerObj = transform.Find("EnemyContainer").gameObject;
}
firebasesAreaPosition = transform.position + fireBasesAreaObj.transform.position;
firebasesAreaPosition = fireBasesAreaObj.transform.position;
firebasesAreaScale = fireBasesAreaObj.transform.localScale.x;
firebasesAreaDiameter = firebasesAreaScale * blockSize;
firebasesBelong = -belongMaxPoint;
+35 -36
View File
@@ -38,7 +38,7 @@ public class TargetController : MonoBehaviour
[System.NonSerialized] public Targets targetType;
[System.NonSerialized] public int gotoLevelNum;
[System.NonSerialized] public int attackLevelNum;
public float[] targetState = new float[5];
[System.NonSerialized] public float[] targetState = new float[5];
public enum EndType
{ Win, Lose, Running, Num };
@@ -234,8 +234,6 @@ public class TargetController : MonoBehaviour
#endregion Agent Move Method
#region Random SceneBlock Spawn Method
/// <summary>
/// Randomly spawns a scene block based on the target type.
/// 根据目标类型随机生成场景块。
@@ -263,7 +261,12 @@ public class TargetController : MonoBehaviour
sceneBlockCon.nowBlock.InitBlock(environmentObj);
}
#endregion Random SceneBlock Spawn Method
private void SpawnSceneBlock(Targets targetType, int level,int blockNum, Vector3 blockPosition)
{
sceneBlockCon.DestroyBlock();
sceneBlockCon.CreateNewBlock(targetType, level, blockNum, blockPosition, commonParamCon.group1Tag, commonParamCon.group2Tag);
sceneBlockCon.InitializeBlock(environmentObj);
}
#region Play Mode Method
@@ -279,7 +282,7 @@ public class TargetController : MonoBehaviour
/// 该方法用于初始化游戏播放模式,包括设置目标类型、更新目标状态、更新UI显示、
/// 将代理移动到生成区域、销毁所有敌人和场景块。
/// </remarks>
public void PlayInitialize()
public void PlayModeInitialize()
{
targetType = Targets.Stay;
UpdateTargetStates();
@@ -289,35 +292,29 @@ public class TargetController : MonoBehaviour
sceneBlockCon.DestroyBlock();
}
// change to attack mode
public void AttackModeChange(Vector3 targetPosition)
/// <summary>
/// Changes the target type in play mode and updates the game environment accordingly.
/// </summary>
/// <param name="newTargetType">The new target type to be set.</param>
/// <param name="spawnPosition">Spawn position for scene blocks.</param>
/// <param name="level">Level parameter for spawning scene blocks.</param>
/// <param name="blockNum">Number of blocks to spawn.</param>
/// <remarks>
/// This method updates the target type to the specified new target. If a spawn position is provided, it spawns scene blocks at that position
/// with the specified level and block number. The target states are then updated based on the new setup. The UI is also refreshed to reflect the new target type.
/// </remarks>
public void PlayTargetChange(Targets newTargetType, Vector3? spawnPosition = null, int level = 0, int blockNum = 0)
{
targetType = Targets.Attack;
UpdateTargetStates(targetPosition);
envUICon.UpdateTargetType(targetType);
}
// change to free mode
public void FreeModeChange()
{
targetType = (int)Targets.Free;
UpdateTargetStates();
envUICon.UpdateTargetType(targetType);
}
// change to goto mode
public void GotoModeChange(Vector3 targetPosition)
{
targetType = Targets.Go;
UpdateTargetStates(targetPosition);
envUICon.UpdateTargetType(targetType);
}
// change to stay mode
public void StayModeChange()
{
targetType = Targets.Stay;
UpdateTargetStates();
targetType = newTargetType;
if(spawnPosition.HasValue)
{
SpawnSceneBlock(targetType, level, blockNum, spawnPosition.Value);
UpdateTargetStates(spawnPosition.Value);
}
else
{
UpdateTargetStates();
}
envUICon.UpdateTargetType(targetType);
}
@@ -344,9 +341,11 @@ public class TargetController : MonoBehaviour
}
else
{
targetState[1] = this.targetPosition.x;
targetState[2] = this.targetPosition.y;
targetState[3] = this.targetPosition.z;
Vector3 fireBasePosition = sceneBlockCon.nowBlock.firebasesAreaPosition;
Vector3 convertedPosition = fireBasePosition - this.transform.position;
targetState[1] = convertedPosition.x;
targetState[2] = convertedPosition.y;
targetState[3] = convertedPosition.z;
targetState[4] = sceneBlockCon.nowBlock.firebasesAreaDiameter;
}
}
+2 -6
View File
@@ -87,9 +87,7 @@ public class MouseInMap : MonoBehaviour
else
{
// if agent or enemy is not nearby, create new block
sceneBlockCon.CreateNewBlock(Targets.Attack, blockLevel, blockNum, nowHitPositionRelative);
sceneBlockCon.InitializeBlock(environmentObj);
targetCon.AttackModeChange(nowHitPositionRelative);
targetCon.PlayTargetChange(Targets.Attack, nowHitPositionRelative, blockLevel, blockNum);
ChangeMouseMode(MouseMode.Default);
}
break;
@@ -104,9 +102,7 @@ public class MouseInMap : MonoBehaviour
else
{
// if agent or enemy is not nearby, create new block
sceneBlockCon.CreateNewBlock(Targets.Go, blockLevel, blockNum, nowHitPositionRelative);
sceneBlockCon.InitializeBlock(environmentObj);
targetCon.GotoModeChange(nowHitPositionRelative);
targetCon.PlayTargetChange(Targets.Go, nowHitPositionRelative, blockLevel, blockNum);
ChangeMouseMode(MouseMode.Default);
}
break;
+3 -4
View File
@@ -190,8 +190,6 @@ public class EnvironmentUIControl : MonoBehaviour
stateBuilder.Append(targetStates[3]);
stateBuilder.Append("\r\nTargetDiameter:");
stateBuilder.Append(targetStates[4]);
stateBuilder.Append("\r\nTargetBelongRatio:");
stateBuilder.Append(targetStates[5]);
stateBuilder.Append("\r\nInArea:");
stateBuilder.Append(inAreaState);
stateBuilder.Append("\r\nRemainTime:");
@@ -199,9 +197,10 @@ public class EnvironmentUIControl : MonoBehaviour
stateBuilder.Append("\r\nGunReady:");
stateBuilder.Append(gunReadyToggle);
stateBuilder.Append("\r\nMyPosition:");
stateBuilder.Append(myObserve[0]).Append(myObserve[1]).Append(myObserve[2]);
stateBuilder.Append(myObserve[0]+"_").Append(myObserve[1]+"_").Append(myObserve[2]);
stateBuilder.Append("\r\nMyRotation:");
stateBuilder.Append(myObserve[3]);
stateBuilder.Append(myObserve[3]+"_").Append(myObserve[4]);
stateText.text = stateBuilder.ToString();
}
+13 -2
View File
@@ -35,8 +35,12 @@ public class StartUIManager : MonoBehaviour
waitTimeTextObj.text = ((int)Math.Round(leftTime)).ToString();
if (leftTime <= 1)
{
// if time limit is over, load Train Scene
sceneLoader.LoadGameScene(SceneLoader.SceneType.Train);
// if time limit is over, end game
# if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#else
StopGame();
#endif
}
}
@@ -95,4 +99,11 @@ public class StartUIManager : MonoBehaviour
}
}
}
private void StopGame()
{
// stop game,end program
Debug.Log("Game End");
Application.Quit();
}
}
+4 -5
View File
@@ -22,7 +22,6 @@ public class TargetUIController : MonoBehaviour
[SerializeField] private Button setGotoButton;
[SerializeField] private Button setFreeButton;
[SerializeField] private Button setStayButton;
[SerializeField] private int primaryButtonNumber = 6;
[Header("LevelPanel")]
[SerializeField] private GameObject gotoLevelPanel;
@@ -92,7 +91,7 @@ public class TargetUIController : MonoBehaviour
public void ClearGamePressed()
{
// Clear all enemies and targets. set gamemode to Stay mode
targetCon.StayModeChange();
targetCon.PlayTargetChange(Targets.Stay);
mouseInMapCon.ChangeMouseMode(MouseInMap.MouseMode.Default);
// disable setStayButton and enable other buttons
buttonColorChanger.ChangeInteractableColor(clearGameButton, true);
@@ -101,14 +100,14 @@ public class TargetUIController : MonoBehaviour
buttonColorChanger.ChangeInteractableColor(setGotoButton, true);
buttonColorChanger.ChangeInteractableColor(setFreeButton, true);
buttonColorChanger.ChangeInteractableColor(setStayButton, false);
targetCon.PlayInitialize();
targetCon.PlayModeInitialize();
}
// Set Free Button Pressed, change Target mode to free mode
public void SetFreePressed()
{
mouseInMapCon.ChangeMouseMode(MouseInMap.MouseMode.Default);
targetCon.FreeModeChange();
targetCon.PlayTargetChange(Targets.Free);
buttonColorChanger.ChangeInteractableColor(setStayButton, true);
buttonColorChanger.ChangeInteractableColor(setAttackButton, true);
buttonColorChanger.ChangeInteractableColor(setGotoButton, true);
@@ -119,7 +118,7 @@ public class TargetUIController : MonoBehaviour
public void SetStayPressed()
{
mouseInMapCon.ChangeMouseMode(MouseInMap.MouseMode.Default);
targetCon.StayModeChange();
targetCon.PlayTargetChange(Targets.Stay);
buttonColorChanger.ChangeInteractableColor(setStayButton, false);
buttonColorChanger.ChangeInteractableColor(setAttackButton, true);
buttonColorChanger.ChangeInteractableColor(setGotoButton, true);