using UnityEngine; public class ParameterContainer : MonoBehaviour { public GameObject targetConObj; public GameObject blockConObj; public GameObject agentObj; private TargetController targetCon; private SceneBlockContainer blockCont; private StartSeneData startSceneData; private float agentDistance; private int agentInArea; [Header("Env")] public bool lockMouse = false; public float damage = 50; // damage to enemy public float fireRate = 0.5f; public int timeLimit = 30; public bool lockCameraX = false; public bool lockCameraY = true; public bool spawnAgentInAllMap = true; public int spinRecordMax = 40; public float spinPenaltyThreshold = 10; public float facingInviewEnemyDisCOEF = 0.5f; [Header("Dynamic Defaut Rewards")] //[Tooltip("Hit Enemy reward")] //public float hitRewardDefault = 60.0f; [Tooltip("Free mode Hit Enemy reward")] public float hitTargetRewardDefault = 25f; //[Tooltip("Enemy down reward")] //public float killRewardDefault = 60.0f; [Tooltip("Enemy down in area Reward")] public float killTargetEnemyRewardDefault = 25f; [Tooltip("stay in firebasesArea reward")] public float inAreaRewardDefault = 12f; [Tooltip("free left time bonus reward. ALLR + leftTime * r")] public float freeTimeBonusPerSec = 1.0f; [Tooltip("target left time bonus reward. ALLR + leftTime * r")] public float targetTimeBonusPerSec = 0.5f; [Tooltip("in area left time bonus reward. ALLR + leftTime * r")] public float areaTimeBonusPerSec = 0.2f; [Tooltip("distance reward reward = r*(1-(nowDis/startDis))")] public float distanceReward = 50.0f; [Tooltip("facing to Target distance reward reward = r*(1-(nowDis/startDis))")] public float facingTargetReward = 10.0f; [Space(10)] [Tooltip("Goto Win reward")] public float goWinRewardDefault = 999f; [Tooltip("Attack Win reward")] public float attackWinRewardDefault = 999f; [Tooltip("Defence Win reward")] public float defenceWinRewardDefault = 999f; [Tooltip("free Win reward")] public float freeWinRewardDefault = 999f; [Header("Static Rewards")] [Tooltip("Nothing happened reward")] public float nonReward = -1f; [Tooltip("Episode Lose reward")] public float loseReward = -999f; [Tooltip("Agent Do shoot action reward")] public float shootReward = -0.5f; [Tooltip("Hit Not target Enemy reward")] public float hitNonTargetReward = -5f; [Tooltip("Not Target Enemy down reward")] public float killNonTargetReward = -5f; [Tooltip("Agent Do shoot action but gun is not read")] public float shootWithoutReadyReward = -1.15f; [Tooltip("Kill bonus reward stack to nothing happend reward")] public float killBonusReward = 0.0f; [Tooltip("Facing to enemy's reward")] public float facingReward = 5f; [Tooltip("Shoot at target area but didn't hit enemy")] public float shootTargetAreaReward = 10f; [Header("Penalty Rewards")] [Tooltip("move Penalty Reward")] public float movePenalty = 0.1f; [Tooltip("spiiiiiiin Panalty Reward")] public float spinPenalty = 0.08f; [Tooltip("while move mouse a little bit's penalty")] public float mousePenalty = 0.06f; [Header("Dynamic Rewards")] [Tooltip("Free mode Hit Enemy reward")] public float hitTargetReward = 60.0f; [Tooltip("Enemy down in area Reward")] public float killTargetEnemyReward = 80.0f; [Tooltip("stay in firebasesArea reward")] public float inAreaReward = 5.0f; [Space(10)] [Tooltip("go Win reward")] public float goWinReward = 50.0f; [Tooltip("attack Win reward")] public float attackWinReward = 50.0f; [Tooltip("defence Win reward")] public float defenceWinReward = 50.0f; [Tooltip("free Win reward")] public float freeWinReward = 50.0f; private float targetTimeBonus = 0f; private float areaTimeBonus = 0f; private float freeTimeBonus = 0f; private float targetInAreaTime = 0f; private float lastFrameTime = 0f; [System.NonSerialized] public int gameMode; // 0 = trainning mode, 1 = play mode [System.NonSerialized] public float attackProb = 0f; [System.NonSerialized] public float gotoProb = 0f; [System.NonSerialized] public float defenceProb = 0f; private void Start() { targetCon = targetConObj.GetComponent(); blockCont = blockConObj.GetComponent(); areaTimeBonus = areaTimeBonusPerSec * timeLimit; freeTimeBonus = freeTimeBonusPerSec * timeLimit; targetTimeBonus = targetTimeBonusPerSec * timeLimit; try { // try get start scene data startSceneData = GameObject.Find("StartSceneDataTransfer").GetComponent(); gameMode = startSceneData.gameMode; attackProb = startSceneData.attackProb; gotoProb = startSceneData.gotoProb; defenceProb = startSceneData.defenceProb; } catch { Debug.LogError("PrameterContainer:Run WithOut StartScreen!"); gameMode = 0; attackProb = 0.3333f; gotoProb = 0.3333f; defenceProb = 0.0f; } } private void Update() { // get target distance and in area if (targetCon.targetTypeInt is (int)SceneBlockContainer.Targets.Go or (int)SceneBlockContainer.Targets.Attack) { (agentDistance, agentInArea) = blockCont.GetAgentTargetDistanceAndInside(agentObj.transform.position); // attack goto or defence target if (agentInArea == 1) { // agent out of area targetInAreaTime += Time.time - lastFrameTime; } areaTimeBonus = areaTimeBonusPerSec * (targetCon.leftTime + targetInAreaTime); freeTimeBonus = freeTimeBonusPerSec * targetCon.leftTime; targetTimeBonus = targetTimeBonusPerSec * targetCon.leftTime; lastFrameTime = Time.time; } else { // free target areaTimeBonus = areaTimeBonusPerSec * targetCon.leftTime; freeTimeBonus = freeTimeBonusPerSec * targetCon.leftTime; targetTimeBonus = targetTimeBonusPerSec * targetCon.leftTime; } hitTargetReward = hitTargetRewardDefault + targetTimeBonus; killTargetEnemyReward = killTargetEnemyRewardDefault + targetTimeBonus; inAreaReward = inAreaRewardDefault + areaTimeBonus; // Win Rewards goWinReward = goWinRewardDefault; attackWinReward = attackWinRewardDefault; defenceWinReward = defenceWinRewardDefault; freeWinReward = freeWinRewardDefault; } public void ResetTimeBonusReward() { areaTimeBonus = areaTimeBonusPerSec * timeLimit; freeTimeBonus = freeTimeBonusPerSec * timeLimit; targetInAreaTime = 0f; } }