前往
大廳
主題

狗頭人哨兵 攻擊 5

夏洛爾 | 2023-02-19 17:29:58 | 巴幣 0 | 人氣 154


Kobold Sentinel Attack V5

實驗目標:
1.設法用武器用力的打擊目標

實驗設計:
1.任何弱點觸地皆失敗 (尾巴、武器和Calf並非弱點)
2.當武器OnCollisionEnter Player
會傳送collision.impulse
//impulseRewardCoef = 0.05f
public void HitWithWeapon(Vector3 impulse){if(!hitTarget){avgVelocity = velocityBuffer.GetSmoothVal();hitOnVelocity = avgVelocity.normalized;float reward = Vector3.ProjectOnPlane(impulse, hitOnVelocity).magnitude * impulseRewardCoef;lastReward += reward;totalReward += reward;AddReward( reward );arrivedMoment = Time.fixedTime;hitTarget = true;}}

3.
//Set: judge.endEpisode = true
//Set: judge.episodeLength = 3.3f
//Set: weapon, tail not weakness
//Set: useClampReward = true

if(weaknessOnGround)
{
if(inferenceMode)
{
brainMode = BrainMode.GetUp;
SetModel("KoboldGetUp", getUpBrain);
behaviorParameters.BehaviorType = BehaviorType.InferenceOnly;
}
else
{
// ===Train Attack===
if(!hitTarget)
{
float survivedTime = Time.fixedTime - arrivedMoment;
if(survivedTime < judge.episodeLength )
{
AddReward( (survivedTime - judge.episodeLength) * 0.1f );
}
}
judge.outLife++;
judge.Reset();
return;
//===Train Other===
// brainMode = BrainMode.GetUp;
// SetModel("KoboldGetUp", getUpBrain);
// behaviorParameters.BehaviorType = BehaviorType.InferenceOnly;
}
}
else if(koboldRoot.localPosition.y < -1f)
{
if(inferenceMode)
{
brainMode = BrainMode.GetUp;
SetModel("KoboldGetUp", getUpBrain);
behaviorParameters.BehaviorType = BehaviorType.InferenceOnly;
}
else
{
// ===Train Attack===
if(!hitTarget)
{
float survivedTime = Time.fixedTime - arrivedMoment;
if(survivedTime < judge.episodeLength )
{
AddReward( (survivedTime - judge.episodeLength) * 0.3f );
}
}
judge.outY++;
judge.Reset();
return;
// ===Train Other===
// brainMode = BrainMode.GetUp;
// SetModel("KoboldGetUp", getUpBrain);
// behaviorParameters.BehaviorType = BehaviorType.InferenceOnly;
}
}
/*else if( IsCollideWithBody() )
{
if(inferenceMode)
{
brainMode = BrainMode.GetUp;
SetModel("KoboldGetUp", getUpBrain);
behaviorParameters.BehaviorType = BehaviorType.InferenceOnly;
}
else
{
// ===Train Attack===
if(!hitTarget)
{
float survivedTime = Time.fixedTime - arrivedMoment;
if(survivedTime < judge.episodeLength )
{
AddReward( (survivedTime - judge.episodeLength) * 0.1f );
}
}
judge.outLife++;
judge.Reset();
return;
//===Train Other===
// brainMode = BrainMode.GetUp;
// SetModel("KoboldGetUp", getUpBrain);
// behaviorParameters.BehaviorType = BehaviorType.InferenceOnly;
}
}*/
else
{
if(hitTarget)
{
targetSmoothVelocity = targetVelocityBuffer.GetSmoothVal();
lastReward = Vector3.ProjectOnPlane(targetSmoothVelocity, hitOnVelocity).magnitude * 0.05f;
totalReward += lastReward;
AddReward(lastReward);
}
}

//大致來說
在命中目標時紀錄當下自身的移動方向
之後,獎勵和移動方向不一樣的敵人速度值

然後暫時取消不能碰撞敵人的限制

實驗時間:
Step: 5e7
Time Elapsed: 100544s (27.93hr)

實驗結果:
實驗結果為...應該算失敗,但有奇妙的收穫

尤其實驗過程中看到了,狗頭人會用前踢把紅蓮踢到天空中,超級暴力耶

所以才注意到了問題
"不同尺寸的狗頭人獎勵上應該要根據尺寸比例"

否則大體型的狗頭人本來就更容易使出更具威力的攻擊

然後狗頭人的前踢更明顯的凸顯了另一個問題
狗頭人不知道水月的肢體位置,所以踢的效果很不穩定,常常踢中又被自己的武器勾住
所以如果要以這種接近實戰類型的訓練,視線是需要的

但前幾天突然想到的靈感似乎效果不錯
"獎勵 和打擊瞬間移動速度方向 不同的各種向量"

總和上述,目前對下個實驗很樂觀

下個實驗
1.目標會被改為一顆懸浮球
--每次狗頭人重置也會重置
--只和武器碰撞

2.打擊後只追蹤0.5秒的目標飛行速度

3.將狗頭人比例固定在1.2
前面實驗已經證實不同尺寸是可以一起訓練的和練出泛用模型的,但在互動上複雜度太高
因此先固定在1.2,等互動技術突破再重新加入泛用目標

創作回應

更多創作