V2.0 Bug Fix, scene added

fix scene only spawn in a small area in center.
delete room type attack target.
make no more enemy spawn in go target.
free mode enemy number change to 3.
This commit is contained in:
2022-12-03 17:42:51 +09:00
parent 8570a5ba5e
commit 0d60c857b7
24 changed files with 9385 additions and 231 deletions
+7 -4
View File
@@ -355,12 +355,13 @@ public class AgentWithGun : Agent
float[] myObserve = { transform.localPosition.x, transform.localPosition.y, transform.localPosition.z, transform.rotation.w };
float[] rayTagResult = rayScript.rayTagResult;// 探测用RayTag结果 float[](raySensorNum,1)
float[] rayDisResult = rayScript.rayDisResult; // 探测用RayDis结果 float[](raySensorNum,1)
float[] targetStates = targetCon.getTargetStates(); // targettype, target x,y,z, firebasesAreaDiameter
float[] targetStates = targetCon.targetState; // targettype, target x,y,z, firebasesAreaDiameter
float remainTime = targetCon.leftTime;
//float[] focusEnemyObserve = RaySensors.focusEnemyInfo;// 最近的Enemy情报 float[](3,1) MinEnemyIndex,x,z
//sensor.AddObservation(allEnemyNum); // 敌人数量 int
sensor.AddObservation(targetStates);// targettype, target x,y,z, firebasesAreaDiameter
sensor.AddObservation(remainTime);
sensor.AddObservation(myObserve); // 自机位置xyz+朝向 float[](4,1)
sensor.AddObservation(rayTagResult); // 探测用RayTag结果 float[](raySensorNum,1)
sensor.AddObservation(rayDisResult); // 探测用RayDis结果 float[](raySensorNum,1)
@@ -390,8 +391,9 @@ public class AgentWithGun : Agent
//判断结束
float sceneReward = 0f;
(finishedState, sceneReward) = targetCon.checkOverAndRewards();
float thisRoundReward = rewardCalculate(sceneReward);
float endReward = 0f;
(finishedState, sceneReward, endReward) = targetCon.checkOverAndRewards();
float thisRoundReward = rewardCalculate(sceneReward+ endReward);
if (paramContainer.chartOn)
{
EnvUICon.updateChart(thisRoundReward);
@@ -415,6 +417,7 @@ public class AgentWithGun : Agent
Debug.LogWarning("TypeError");
break;
}
SetReward(thisRoundReward);
EndEpisode();
}
else
+4 -4
View File
@@ -135,10 +135,10 @@ public class ParameterContainer : MonoBehaviour
inAreaReward = inAreaRewardDefault + areaTimeBonus;
// Win Rewards
goWinReward = goWinRewardDefault + targetTimeBonus;
attackWinReward = attackWinRewardDefault + targetTimeBonus;
defenceWinReward = defenceWinRewardDefault + targetTimeBonus;
freeWinReward = freeWinRewardDefault + targetTimeBonus;
goWinReward = goWinRewardDefault;
attackWinReward = attackWinRewardDefault;
defenceWinReward = defenceWinRewardDefault;
freeWinReward = freeWinRewardDefault;
}
public void resetTimeBonusReward()
+42 -24
View File
@@ -40,6 +40,7 @@ public class TargetController : MonoBehaviour
[SerializeField, Range(0f, 1f)] public float defenceProb = 0.2f;
[System.NonSerialized] public int targetTypeInt;
public float[] targetState = new float[6];
public enum Targets { Free, Go, Attack, Defence, Num };// Num is use for get total target bumber
public enum EndType { Win, Lose, Running, Num };
[System.NonSerialized] public int targetNum = 0;
@@ -116,8 +117,8 @@ public class TargetController : MonoBehaviour
int randBlockType = Random.Range(0, blockCont.goBlockPrefabs.Length);
// get choosed scene size
sceneSize = blockCont.goBlockPrefabs[randBlockType].GetComponent<SceneBlock>().blockSize;
float randX = UnityEngine.Random.Range(minEnemyAreaX + sceneSize + 1f, maxEnemyAreaX - sceneSize - 1f);
float randZ = UnityEngine.Random.Range(minEnemyAreaZ + sceneSize + 1f, maxEnemyAreaZ - sceneSize - 1f);
float randX = UnityEngine.Random.Range(minEnemyAreaX + sceneSize/2 + 1f, maxEnemyAreaX - sceneSize/2 - 1f);
float randZ = UnityEngine.Random.Range(minEnemyAreaZ + sceneSize/2 + 1f, maxEnemyAreaZ - sceneSize/2 - 1f);
targetPosition = new Vector3(randX, 0f, randZ);
// Init Agent position
moveAgentToSpwanArea();
@@ -138,8 +139,8 @@ public class TargetController : MonoBehaviour
int randBlockType = Random.Range(0, blockCont.attackBlockPrefabs.Length);
// get choosed scene size
sceneSize = blockCont.attackBlockPrefabs[randBlockType].GetComponent<SceneBlock>().blockSize;
float randX = UnityEngine.Random.Range(minEnemyAreaX + sceneSize + 1f, maxEnemyAreaX - sceneSize - 1f);
float randZ = UnityEngine.Random.Range(minEnemyAreaZ + sceneSize + 1f, maxEnemyAreaZ - sceneSize - 1f);
float randX = UnityEngine.Random.Range(minEnemyAreaX + sceneSize/2 + 1f, maxEnemyAreaX - sceneSize/2 - 1f);
float randZ = UnityEngine.Random.Range(minEnemyAreaZ + sceneSize/2 + 1f, maxEnemyAreaZ - sceneSize/2 - 1f);
targetPosition = new Vector3(randX, 0f, randZ);
// Init Agent position
moveAgentToSpwanArea();
@@ -161,8 +162,8 @@ public class TargetController : MonoBehaviour
int randBlockType = Random.Range(0, blockCont.attackBlockPrefabs.Length);
// get choosed scene size
sceneSize = blockCont.defencePrefabs[randBlockType].GetComponent<SceneBlock>().blockSize;
float randX = UnityEngine.Random.Range(minEnemyAreaX + sceneSize + 1f, maxEnemyAreaX - sceneSize - 1f);
float randZ = UnityEngine.Random.Range(minEnemyAreaZ + sceneSize + 1f, maxEnemyAreaZ - sceneSize - 1f);
float randX = UnityEngine.Random.Range(minEnemyAreaX + sceneSize/2 + 1f, maxEnemyAreaX - sceneSize/2 - 1f);
float randZ = UnityEngine.Random.Range(minEnemyAreaZ + sceneSize/2 + 1f, maxEnemyAreaZ - sceneSize/2 - 1f);
targetPosition = new Vector3(randX, 0f, randZ);
// Init Agent position
moveAgentTo(targetPosition);
@@ -184,25 +185,29 @@ public class TargetController : MonoBehaviour
moveAgentToSpwanArea();
blockCont.destroyBlock();
}
updateTargetStates();
envUICon.updateTargetType(targetTypeInt);
}
// get target observation states
public float[] getTargetStates()
public void updateTargetStates()
{
// targettype, x,y,z, firebasesAreaDiameter
List<float> targetState = new List<float>();
if (targetTypeInt == (int)Targets.Free)
{
targetState.AddRange(oneHotRarget[targetTypeInt]);
targetState.AddRange(new float[5] { 0f, 0f, 0f, 0f, 0f });
targetState[0] = targetTypeInt;
for(int i = 1; i < targetState.Length; i++)
targetState[i] = 0f;
}
else
{
targetState.AddRange(oneHotRarget[targetTypeInt]);
targetState.AddRange(new float[5] { targetPosition.x, targetPosition.y, targetPosition.z, blockCont.thisBlock.firebasesAreaDiameter, blockCont.thisBlock.belongRatio });
targetState[0] = targetTypeInt;
targetState[1] = targetPosition.x;
targetState[2] = targetPosition.y;
targetState[3] = targetPosition.z;
targetState[4] = blockCont.thisBlock.firebasesAreaDiameter;
targetState[5] = blockCont.thisBlock.belongRatio;
}
return targetState.ToArray();
}
// move Agent into Agent Spawn Area
@@ -228,10 +233,11 @@ public class TargetController : MonoBehaviour
// check over and get rewards
// 1 = success,2 = overtime,0 = notover
public (int, float) checkOverAndRewards()
public (int, float,float) checkOverAndRewards()
{
int endTypeInt = 0;
float thisReward = 0;
float endReward = 0;
int inArea = 0;
float nowDistance = 0f;
switch (targetTypeInt)
@@ -240,26 +246,29 @@ public class TargetController : MonoBehaviour
// goto
(nowDistance, inArea) = blockCont.getAgentTargetDistanceAndInside(AgentObj.transform.position);
envUICon.updateTargetGauge(blockCont.thisBlock.firebasesBelong, blockCont.thisBlock.belongMaxPoint);
float areaTargetReward = (paramCon.inAreaReward * inArea) + getDistanceReward(nowDistance);
if (blockCont.thisBlock.firebasesBelong >= blockCont.thisBlock.belongMaxPoint)
{
// win
// let the area belongs to me
thisReward = paramCon.goWinReward;
//thisReward = (paramCon.inAreaReward * inArea) + getSceneReward(nowDistance);
thisReward = areaTargetReward;
endReward = paramCon.goWinReward;
//thisReward = (paramCon.inAreaReward * inArea) + getDistanceReward(nowDistance);
endTypeInt = (int)EndType.Win;
}
else if (leftTime <= 0)
{
// time out lose
thisReward = paramCon.loseReward;
//thisReward = (paramCon.inAreaReward * inArea) + getSceneReward(nowDistance);
thisReward = areaTargetReward;
endReward = paramCon.loseReward;
endTypeInt = (int)EndType.Lose;
}
else
{
// keep on keeping on!
thisReward = (paramCon.inAreaReward * inArea) + getDistanceReward(nowDistance);
thisReward = areaTargetReward;
endReward = 0;
endTypeInt = (int)EndType.Running;
}
break;
@@ -271,14 +280,16 @@ public class TargetController : MonoBehaviour
{
// win
// let the area belongs to me and kill every enmy in this area.
thisReward = paramCon.attackWinReward;
thisReward = 0;
endReward = paramCon.attackWinReward;
//thisReward = (paramCon.inAreaReward * inArea) + getSceneReward(nowDistance);
endTypeInt = (int)EndType.Win;
}
else if (leftTime <= 0 && targetEnemySpawnFinish)
{
// time out lose
thisReward = paramCon.loseReward;
thisReward = 0;
endReward = paramCon.loseReward;
//thisReward = (paramCon.inAreaReward * inArea) + getSceneReward(nowDistance);
endTypeInt = (int)EndType.Lose;
}
@@ -286,12 +297,15 @@ public class TargetController : MonoBehaviour
{
// keep on keeping on!
// thisReward = (paramCon.inAreaReward * inArea) + getDistanceReward(nowDistance);
thisReward = 0;
endReward = 0;
targetEnemySpawnFinish = true;
endTypeInt = (int)EndType.Running;
}
break;
case (int)Targets.Defence:
//defence
// !!! DIDN't FINISH!!!
(nowDistance, inArea) = blockCont.getAgentTargetDistanceAndInside(AgentObj.transform.position);
envUICon.updateTargetGauge(blockCont.thisBlock.firebasesBelong, blockCont.thisBlock.belongMaxPoint);
if (leftTime <= 0 && blockCont.thisBlock.firebasesBelong >= 0f)
@@ -322,26 +336,30 @@ public class TargetController : MonoBehaviour
{
// win
//thisReward = paramCon.winReward + (paramCon.timeBonusPerSecReward * leftTime);
thisReward = paramCon.freeWinReward;
thisReward = 0;
endReward = paramCon.freeWinReward;
endTypeInt = (int)EndType.Win;
}
else if (Time.time - startTime >= paramCon.timeLimit)
{
// lose
//thisReward = paramCon.loseReward;
thisReward = paramCon.loseReward;
thisReward = 0;
endReward = paramCon.loseReward;
endTypeInt = (int)EndType.Lose;
}
else
{
// keep on keeping on!
thisReward = 0;
endReward = 0;
endTypeInt = (int)EndType.Running;
}
break;
}
envUICon.showResult(endTypeInt);
worldUICon.updateChart(targetTypeInt, endTypeInt);
return (endTypeInt, thisReward);
return (endTypeInt, thisReward,endReward);
}
// caulculate sceneReward if close to target then get great reward