Aimbot-ParallelEnv/Assets/Script/InGame/ParameterContainer.cs
Koha9 25eac00c53 Target & dynamic reward System V1.0
太多了...总之能用了,就这样吧,也懒得用英文写了(;´Д`)
ParameterContainer用于管理所有的Reward和Parameter.
TargetController用于生成目标,然后再让SceneBlockContainer实际生成目标块,并且兼顾reward计算功能和目标观察结果的获取.
EnemyContainer用于生成和删除敌人.
SceneBlockContainer用于生成和删除目标块.

States用于管理HP.
SceneBlock用于管理目标块的...一堆东西,比如目标大小,目标区内人数等和目标所属状态等.
2022-11-29 07:54:08 +09:00

131 lines
4.6 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ParameterContainer : MonoBehaviour
{
public GameObject targetConObj;
public GameObject blockConObj;
public GameObject agentObj;
private TargetController targetCon;
private SceneBlockContainer blockCont;
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 enemyNum = 3;
public int timeLimit = 30;
public bool lockCameraX = false;
public bool lockCameraY = true;
public bool chartOn = false;
[Header("Dynamic Defaut Rewards")]
[Tooltip("Hit Enemy reward")]
public float hitRewardDefault = 30.0f;
[Tooltip("Episode Win reward")]
public float winRewardDefault = 50.0f;
[Tooltip("Enemy down reward")]
public float killRewardDefault = 40.0f;
[Tooltip("Enemy down in area Reward")]
public float killInAreaEnemyRewardDefault = 80.0f;
[Tooltip("stay in firebasesArea reward")]
public float inAreaRewardDefault = 1.0f;
[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 = 3.0f;
[Tooltip("in area left time bonus reward. ALLR + leftTime * r")]
public float areaTimeBonusPerSec = 1.0f;
[Tooltip("distance reward reward = r*(1-(nowDis/startDis))")]
public float distanceReward = 1.0f;
[Header("Dynamic Rewards")]
[Tooltip("Hit Enemy reward")]
public float hitReward = 30.0f;
[Tooltip("Enemy down reward")]
public float killReward = 40.0f;
[Tooltip("Episode Win reward")]
public float winReward = 50.0f;
[Tooltip("Enemy down in area Reward")]
public float killInAreaEnemyReward = 80.0f;
[Tooltip("stay in firebasesArea reward")]
public float inAreaReward = 1.0f;
[Header("Static Rewards")]
[Tooltip("Nothing happened reward")]
public float nonReward = -0.05f;
[Tooltip("Episode Lose reward")]
public float loseReward = -0.05f;
[Tooltip("Agent Do shoot action reward")]
public float shootReward = -0.1f;
[Tooltip("Agent Do shoot action but gun is not read")]
public float shootWithoutReadyReward = -0.15f;
[Tooltip("Kill bonus reward stack to nothing happend reward")]
public float killBonusReward = 0.0f;
[Header("Penalty Rewards")]
[Tooltip("Speed Penalty Reward")]
public float speedPanalty = 0f;
[Tooltip("view Panalty Reward")]
public float viewPanalty = 0f;
private float targetTimeBonus = 0f;
private float areaTimeBonus = 0f;
private float freeTimeBonus = 0f;
private float targetInAreaTime = 0f;
private float lastFrameTime = 0f;
private void Start()
{
targetCon = targetConObj.GetComponent<TargetController>();
blockCont = blockConObj.GetComponent<SceneBlockContainer>();
areaTimeBonus = areaTimeBonusPerSec * timeLimit;
freeTimeBonus = freeTimeBonusPerSec * timeLimit;
targetTimeBonus = targetTimeBonusPerSec * timeLimit;
}
private void Update()
{
if (targetCon.targetTypeInt != (int)TargetController.Targets.Free)
{
(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;
}
hitReward = hitRewardDefault + freeTimeBonus;
killReward = killRewardDefault + freeTimeBonus;
winReward = winRewardDefault + targetTimeBonus;
killInAreaEnemyReward = killInAreaEnemyRewardDefault + targetTimeBonus;
inAreaReward = inAreaRewardDefault + areaTimeBonus;
}
public void resetTimeBonusReward()
{
areaTimeBonus = areaTimeBonusPerSec * timeLimit;
freeTimeBonus = freeTimeBonusPerSec * timeLimit;
targetInAreaTime = 0f;
}
}