//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 = 0.003f + Vector3.ProjectOnPlane(targetSmoothVelocity, hitOnVelocity).magnitude * 0.05f;
totalReward += lastReward;
AddReward(lastReward);
if(inferenceMode)
{
if(hasArrived && Time.fixedTime - arrivedMoment >= judge.episodeLength)
{
hitTarget = false;
brainMode = BrainMode.GetUp;
SetModel("KoboldGetUp", getUpBrain);
behaviorParameters.BehaviorType = BehaviorType.InferenceOnly;
}
}
}
else
{
targetSmoothPosition = targetPositionBuffer.GetSmoothVal();
rootDir = targetSmoothPosition - stageBase.InverseTransformPoint(koboldRootRb.position);
flatTargetVelocity = rootDir;
flatTargetVelocity.y = 0f;
aimVelocity = flatTargetVelocity.normalized;
aimVelocity.y = 0.2f;
avgVelocity = velocityBuffer.GetSmoothVal();
velocityAngle = Vector3.Angle(avgVelocity, aimVelocity);
velocityAngleCoef = Mathf.InverseLerp(180f, 0f, velocityAngle);
velocityCoef = Mathf.InverseLerp(0f, 5f, Vector3.Project(avgVelocity, aimVelocity).magnitude );
avgAngularVelocity = angularVelocityBuffer.GetSmoothVal();
float angularVelocityScore = avgAngularVelocity.y > 0f ? avgAngularVelocity.y * 0.001f : 0f;
lastReward = velocityAngleCoef*0.001f + velocityCoef*0.001f + angularVelocityScore;
totalReward += lastReward;
AddReward(lastReward);
}
}