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:
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user