using System.Collections;
using System.Collections.Generic;
using Unity.MLAgents;
using Unity.MLAgents.Actuators;
using Unity.MLAgents.Sensors;
using UnityEngine;
public class DefendInDetail : Agent
{
Rigidbody rBody;
void Start()
{
rBody = GetComponent<Rigidbody>();
}
public Collider Target;
{
//μλ‘μ΄ μ νΌμλ μμμ, λ€μ μμ΄μ νΈμ ν¬μ§μ
μ μ΄κΈ°ν
if (this.transform.localPosition.y < 0) //μμ΄μ νΈκ° floor μλλ‘ λ¨μ΄μ§ κ²½μ° μΆκ° μ΄κΈ°ν
{
this.rBody.angularVelocity = Vector3.zero;
this.rBody.velocity = Vector3.zero;
this.transform.localPosition = new Vector3(0, 0.5f, 0);
}
//νκ²μ μμΉλ μνΌμλ μμμ λλ€νκ² λ³κ²½λλ€.
Target.transform.localPosition = new Vector3(Random.value * 8 - 4, 0.5f, Random.value * 8 - 4);
}
/// <summary>
/// κ°ννμ΅ νλ‘κ·Έλ¨μκ² κ΄μΈ‘μ 보λ₯Ό μ λ¬
/// </summary>
/// <param name="sensor"></param>
public override void CollectObservations(VectorSensor sensor)
{
sensor.AddObservation(Target.transform.localPosition); //νκ²μ ν¬μ§μ
μ λ¬
sensor.AddObservation(this.transform.localPosition); //μμ΄μ νΈμ ν¬μ§μ
μ λ¬
sensor.AddObservation(rBody.velocity.x); //νμ¬ μμ΄μ νΈμ μ΄λλ.x μ λ¬
sensor.AddObservation(rBody.velocity.z); //νμ¬ μμ΄μ νΈμ μ΄λλ.z μ λ¬
}
/// <summary>
/// κ°ννμ΅μ μν, κ°ννμ΅μ ν΅ν νλμ΄ κ²°μ λλ κ³³
/// </summary>
public float forceMultiplier = 10;
public override void OnActionReceived(ActionBuffers actionBuffers)
{
//νμ΅μ μν, νμ΅λ μ 보λ₯Ό ν΄μνμ¬ μ΄λμ μν¨λ€.
// Actions, size = 2
Vector3 controlSignal = Vector3.zero;
controlSignal.x = actionBuffers.ContinuousActions[0];
controlSignal.z = actionBuffers.ContinuousActions[1];
rBody.AddForce(controlSignal * forceMultiplier);
// Rewards
float distanceToTarget = Vector3.Distance(this.transform.localPosition, Target.transform.localPosition);
//νκ²μ μ°»μμ 리μλμ μλ₯Ό μ£Όκ³ , μνΌμλλ₯Ό μ’
λ£μν¨λ€.
// Reached target
if (distanceToTarget < 1.42f)
{
SetReward(1.0f);
EndEpisode();
}
//ν μλλ‘ λ¨μ΄μ§λ©΄ νμ΅μ΄ μ’
λ£λλ€.
// Fell off platform
else if (this.transform.localPosition.y < 0)
{
EndEpisode();
}
}
/// <summary>
/// ν΄λΉ ν¨μλ μ§μ μ‘°μ νΉμ κ·μΉμ±μλ μ½λ©μΌλ‘ μ‘°μμν€κΈ° μν ν¨μ
/// </summary>
/// <param name="actionsOut"></param>
public override void Heuristic(in ActionBuffers actionsOut)
{
var continuousActionsOut = actionsOut.ContinuousActions;
continuousActionsOut[0] = Input.GetAxis("Horizontal");
continuousActionsOut[1] = Input.GetAxis("Vertical");
}
}