Unity/ML-Agents

06. ML-Agents - Soccer (1)

๐Ÿ”ท ์‹ค์Šต 6 (1)

- ์ถ•๊ตฌ

- ์ด์‚ฐ๊ฐ’

 

 

๐Ÿ”ถ ํ”„๋กœ์ ํŠธ ์„ธํŒ…

- ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ : MLSoccer

 

 

 

SoccerField.zip
0.45MB

- ํŒจํ‚ค์ง€ ๋‹ค์šด๋กœ๋“œ ๋ฐ ์ž„ํฌํŠธ : Soccer Field

 

 

 

- ํด๋” ์ •๋ฆฌ

 

 

 

- Add package from disk

 

 

 

- mlagents, mlagents extentions ํŒจํ‚ค์ง€ ์„ค์น˜

- ๊ฒฝ๋กœ

    - ml-agents\com.unity.ml-agents\package.json

    - ml-agents\com.unity.ml-agents.extensions\package.json

 

 

 

- ํŒจํ‚ค์ง€ 2๊ฐœ๊ฐ€ ์„ค์น˜๋œ ๊ฒƒ์„ ํ™•์ธ

 

 

 

- Regenerate project files

 

 

 

- Ctrl + Shift + P

- OmniSharp : Restart OmniSharp

 

 

 

๐Ÿ”ท ํŠธ๋ ˆ์ด๋‹ ํ™˜๊ฒฝ ๊ตฌ์ถ•

๐Ÿ”ถ ์”ฌ ์„ธํŒ…

- SoccerFieldTwos : ํ•˜์ด์–ด๋ผํ‚ค์ฐฝ์— ๋Œ์–ด๋‹ค๋†“๊ธฐ

- Stage๋กœ ์ด๋ฆ„ ๋ณ€๊ฒฝ

 

 

 

- Stage ์•„๋ž˜์— AgentCube_Blue ํ”„๋ฆฌํŒน ์ถ”๊ฐ€

- AgentCube_Blue -> Agent๋กœ ์ด๋ฆ„ ๋ณ€๊ฒฝ

 

 

 

- Stage : Unpack

 

 

 

- Agent ํ”„๋ฆฌํŒนํ™”

 

 

 

๐Ÿ”ถ PlayerAgent.cs : agent team, ์ƒ‰์ƒ ์„ค์ •

- PlayerAgent.cs ์ƒ์„ฑ

 

 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using Unity.MLAgents;
using Unity.MLAgents.Sensors;
using Unity.MLAgents.Actuators;
using Unity.MLAgents.Policies;      // Behavior Parameter ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ ‘๊ธดํ•˜๊ธฐ ์œ„ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค

[RequireComponent(typeof(DecisionRequester))]
public class PlayerAgent : Agent
{
    public enum TEAM
    {
        BLUE, RED
    }

    // ํ”Œ๋ ˆ์ด์–ด์˜ ํŒ€
    public TEAM team = TEAM.BLUE;

    // Behavior Parameters
    private BehaviorParameters bps;

    public override void Initialize()
    {
        bps = GetComponent<BehaviorParameters>();

        // ํŒ€ ์•„์ด๋”” ์„ค์ •

    }
}

 

 

 

- PlayerAgent ์Šคํฌ๋ฆฝํŠธ ์ถ”๊ฐ€

 

 

 

- rotation : 0, 0, 0

- behavior Name : Soccer

- Space Size : 0

- Team Id : Team Id๊ฐ€ ๊ฐ™์€ ํ”Œ๋ ˆ์ด์–ด๋ผ๋ฆฌ ๊ฒฝํ—˜์„ ๊ณต์œ ํ•˜๊ณ  ๊ฐ™์€ Brain์„ ์‚ฌ์šฉํ•จ

  • 0 : Blue
  • 1 : Red

 

 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using Unity.MLAgents;
using Unity.MLAgents.Sensors;
using Unity.MLAgents.Actuators;
using Unity.MLAgents.Policies;      // Behavior Parameter ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ ‘๊ธดํ•˜๊ธฐ ์œ„ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค

[RequireComponent(typeof(DecisionRequester))]
public class PlayerAgent : Agent
{
    public enum TEAM
    {
        BLUE, RED
    }

    // ํ”Œ๋ ˆ์ด์–ด์˜ ํŒ€
    public TEAM team = TEAM.BLUE;
    // ํ”Œ๋ ˆ์ด์–ด์˜ ์ƒ‰์ƒ
    public Material[] materials;

    // Behavior Parameters
    private BehaviorParameters bps;

    public override void Initialize()
    {

        bps = GetComponent<BehaviorParameters>();

        // ํŒ€ ์•„์ด๋”” ์„ค์ •
        bps.TeamId = (int)team;
        // ํ”Œ๋ ˆ์ด์–ด์˜ ์ƒ‰์ƒ๋ณ€๊ฒฝ
        GetComponent<Renderer>().material = materials[(int)team];

        // step ์„ค์ •
        MaxStep = 10000;
    }
}

- ํŒ€์•„์ด๋”” ์„ค์ •, ์ƒ‰์ƒ ๋ณ€๊ฒฝ

 

 

 

- ๋จธํ‹ฐ๋ฆฌ์–ผ Blue, Red์ˆœ์œผ๋กœ ์—ฐ๊ฒฐ

 

 

 

๐Ÿ”ถ ์ดˆ๊ธฐ ์œ„์น˜

- ์ ์ด ์ฐํ˜€์žˆ๋Š” ์œ„์น˜๋กœ ์ดˆ๊ธฐํ™”๋˜๋„๋ก ์„ค์ •ํ•  ์˜ˆ์ •

 

 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using Unity.MLAgents;
using Unity.MLAgents.Sensors;
using Unity.MLAgents.Actuators;
using Unity.MLAgents.Policies;      // Behavior Parameter ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ ‘๊ธดํ•˜๊ธฐ ์œ„ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค

[RequireComponent(typeof(DecisionRequester))]
public class PlayerAgent : Agent
{
    public enum TEAM
    {
        BLUE, RED
    }

    // ํ”Œ๋ ˆ์ด์–ด์˜ ํŒ€
    public TEAM team = TEAM.BLUE;
    // ํ”Œ๋ ˆ์ด์–ด์˜ ์ƒ‰์ƒ
    public Material[] materials;

    // Behavior Parameters
    private BehaviorParameters bps;

    // ํ”Œ๋ ˆ์ด์–ด์˜ ์ดˆ๊ธฐ ์œ„์น˜, ๊ฐ๋„
    private Vector3 initPosBlue = new Vector3(-5.5f, 0.5f, 0.0f);
    private Vector3 initPosRed = new Vector3(5.5f, 0.5f, 0.0f);
    private Quaternion initRotBlue = Quaternion.Euler(Vector3.up * 90.0f);
    private Quaternion initRotRed = Quaternion.Euler(Vector3.up * -90.0f);

    void InitPlayer()
    {
        transform.localPosition = (team == TEAM.BLUE) ? initPosBlue : initPosRed;
        transform.localRotation = (team == TEAM.BLUE) ? initRotBlue : initRotRed;
    }

    public override void Initialize()
    {

        bps = GetComponent<BehaviorParameters>();

        // ํŒ€ ์•„์ด๋”” ์„ค์ •
        bps.TeamId = (int)team;
        // ํ”Œ๋ ˆ์ด์–ด์˜ ์ƒ‰์ƒ๋ณ€๊ฒฝ
        GetComponent<Renderer>().material = materials[(int)team];

        // step ์„ค์ •
        MaxStep = 10000;
    }

    public override void OnEpisodeBegin()
    {
        // ํ”Œ๋ ˆ์ด์–ด ์œ„์น˜, ๊ฐ๋„ ์ดˆ๊ธฐํ™”
        InitPlayer();
    }

}

- ์ดˆ๊ธฐ ์œ„์น˜, ๊ฐ๋„ ์„ธํŒ…

 

 

 

๐Ÿ”ถ rigidbody ๋ฌผ๋ฆฌ๋ ฅ ์ดˆ๊ธฐํ™”

- ์ปดํฌ๋„ŒํŠธ ์ถ”๊ฐ€ : rigidbody

    - mass : 10 : ๊ณต์ด 3์ด๋‹ˆ๊นŒ ๋” ๋ฌด๊ฒ๊ฒŒ ์„ค์ •

    - Freeze Rotation

 

 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using Unity.MLAgents;
using Unity.MLAgents.Sensors;
using Unity.MLAgents.Actuators;
using Unity.MLAgents.Policies;      // Behavior Parameter ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ ‘๊ธดํ•˜๊ธฐ ์œ„ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค

[RequireComponent(typeof(DecisionRequester))]
public class PlayerAgent : Agent
{
    public enum TEAM
    {
        BLUE, RED
    }

    // ํ”Œ๋ ˆ์ด์–ด์˜ ํŒ€
    public TEAM team = TEAM.BLUE;
    // ํ”Œ๋ ˆ์ด์–ด์˜ ์ƒ‰์ƒ
    public Material[] materials;

    // Behavior Parameters
    private BehaviorParameters bps;
    private new Rigidbody rigidbody;

    // ํ”Œ๋ ˆ์ด์–ด์˜ ์ดˆ๊ธฐ ์œ„์น˜, ๊ฐ๋„
    private Vector3 initPosBlue = new Vector3(-5.5f, 0.5f, 0.0f);
    private Vector3 initPosRed = new Vector3(5.5f, 0.5f, 0.0f);
    private Quaternion initRotBlue = Quaternion.Euler(Vector3.up * 90.0f);
    private Quaternion initRotRed = Quaternion.Euler(Vector3.up * -90.0f);

    void InitPlayer()
    {
        transform.localPosition = (team == TEAM.BLUE) ? initPosBlue : initPosRed;
        transform.localRotation = (team == TEAM.BLUE) ? initRotBlue : initRotRed;
    }

    public override void Initialize()
    {
        bps = GetComponent<BehaviorParameters>();
        rigidbody = GetComponent<Rigidbody>();

        // ํŒ€ ์•„์ด๋”” ์„ค์ •
        bps.TeamId = (int)team;
        // ํ”Œ๋ ˆ์ด์–ด์˜ ์ƒ‰์ƒ๋ณ€๊ฒฝ
        GetComponent<Renderer>().material = materials[(int)team];

        // step ์„ค์ •
        MaxStep = 10000;
    }

    public override void OnEpisodeBegin()
    {
        // ํ”Œ๋ ˆ์ด์–ด ์œ„์น˜, ๊ฐ๋„ ์ดˆ๊ธฐํ™”
        InitPlayer();
        // ๋ฌผ๋ฆฌ๋ ฅ ์ดˆ๊ธฐํ™”
        rigidbody.velocity = rigidbody.angularVelocity = Vector3.zero;
    }

}

- ๋ฌผ๋ฆฌ๋ ฅ ์ดˆ๊ธฐํ™”

 

 

 

๐Ÿ”ถ ์ด๋™ ๋ฐ ํšŒ์ „ ๋กœ์ง : ์ด์‚ฐ๊ฐ’

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using Unity.MLAgents;
using Unity.MLAgents.Sensors;
using Unity.MLAgents.Actuators;
using Unity.MLAgents.Policies;      // Behavior Parameter ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ ‘๊ธดํ•˜๊ธฐ ์œ„ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค

[RequireComponent(typeof(DecisionRequester))]
public class PlayerAgent : Agent
{
    public enum TEAM
    {
        BLUE, RED
    }

    // ํ”Œ๋ ˆ์ด์–ด์˜ ํŒ€
    public TEAM team = TEAM.BLUE;
    // ํ”Œ๋ ˆ์ด์–ด์˜ ์ƒ‰์ƒ
    public Material[] materials;

    // Behavior Parameters
    private BehaviorParameters bps;
    private new Rigidbody rigidbody;

    // ํ”Œ๋ ˆ์ด์–ด์˜ ์ดˆ๊ธฐ ์œ„์น˜, ๊ฐ๋„
    private Vector3 initPosBlue = new Vector3(-5.5f, 0.5f, 0.0f);
    private Vector3 initPosRed = new Vector3(5.5f, 0.5f, 0.0f);
    private Quaternion initRotBlue = Quaternion.Euler(Vector3.up * 90.0f);
    private Quaternion initRotRed = Quaternion.Euler(Vector3.up * -90.0f);

    void InitPlayer()
    {
        transform.localPosition = (team == TEAM.BLUE) ? initPosBlue : initPosRed;
        transform.localRotation = (team == TEAM.BLUE) ? initRotBlue : initRotRed;
    }

    public override void Initialize()
    {
        bps = GetComponent<BehaviorParameters>();
        rigidbody = GetComponent<Rigidbody>();

        // ํŒ€ ์•„์ด๋”” ์„ค์ •
        bps.TeamId = (int)team;
        // ํ”Œ๋ ˆ์ด์–ด์˜ ์ƒ‰์ƒ๋ณ€๊ฒฝ
        GetComponent<Renderer>().material = materials[(int)team];

        // step ์„ค์ •
        MaxStep = 10000;
    }

    public override void OnEpisodeBegin()
    {
        // ํ”Œ๋ ˆ์ด์–ด ์œ„์น˜, ๊ฐ๋„ ์ดˆ๊ธฐํ™”
        InitPlayer();
        // ๋ฌผ๋ฆฌ๋ ฅ ์ดˆ๊ธฐํ™”
        rigidbody.velocity = rigidbody.angularVelocity = Vector3.zero;
    }

    public override void OnActionReceived(ActionBuffers actions)
    {
        var action = actions.DiscreteActions;
        Debug.Log($"[0]={action[0]}, [1]={action[1]}, [2]={action[2]}");
    }

    public override void Heuristic(in ActionBuffers actionsOut)
    {
        var actions = actionsOut.DiscreteActions;

        // ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์„ ์ดˆ๊ธฐํ™”
        actions.Clear();

        // ์ •์ง€, ์ „์ง„, ํ›„์ง„      (0, 1, 2)
        if (Input.GetKey(KeyCode.W)) actions[0] = 1;
        if (Input.GetKey(KeyCode.S)) actions[0] = 2;

        // ์ •์ง€, ์ขŒ, ์šฐ ์ด๋™     (0, 1, 2)
        if (Input.GetKey(KeyCode.Q)) actions[1] = 1;
        if (Input.GetKey(KeyCode.E)) actions[1] = 2;

        // ์ •์ง€, ์ขŒ, ์šฐ ํšŒ์ „     (0, 1, 2)
        if (Input.GetKey(KeyCode.A)) actions[2] = 1;
        if (Input.GetKey(KeyCode.D)) actions[2] = 2;
    }

}

- ์ด๋™ ๋ฐ ํšŒ์ „ ์ž…๋ ฅ๊ฐ’ ์„ธํŒ…

 

 

 

- Discrete Branches : 3

    - Branch 0 : 3

    - Branch 1 : 3

    - Branch 2 : 3

 

 

 

- box collider ์ถ”๊ฐ€

 

 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using Unity.MLAgents;
using Unity.MLAgents.Sensors;
using Unity.MLAgents.Actuators;
using Unity.MLAgents.Policies;      // Behavior Parameter ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ ‘๊ธดํ•˜๊ธฐ ์œ„ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค

[RequireComponent(typeof(DecisionRequester))]
public class PlayerAgent : Agent
{
    public enum TEAM
    {
        BLUE, RED
    }

    // ํ”Œ๋ ˆ์ด์–ด์˜ ํŒ€
    public TEAM team = TEAM.BLUE;
    // ํ”Œ๋ ˆ์ด์–ด์˜ ์ƒ‰์ƒ
    public Material[] materials;

    // Behavior Parameters
    private BehaviorParameters bps;
    private new Rigidbody rigidbody;

    // ํ”Œ๋ ˆ์ด์–ด์˜ ์ดˆ๊ธฐ ์œ„์น˜, ๊ฐ๋„
    private Vector3 initPosBlue = new Vector3(-5.5f, 0.5f, 0.0f);
    private Vector3 initPosRed = new Vector3(5.5f, 0.5f, 0.0f);
    private Quaternion initRotBlue = Quaternion.Euler(Vector3.up * 90.0f);
    private Quaternion initRotRed = Quaternion.Euler(Vector3.up * -90.0f);

    void InitPlayer()
    {
        transform.localPosition = (team == TEAM.BLUE) ? initPosBlue : initPosRed;
        transform.localRotation = (team == TEAM.BLUE) ? initRotBlue : initRotRed;
    }

    public override void Initialize()
    {
        bps = GetComponent<BehaviorParameters>();
        rigidbody = GetComponent<Rigidbody>();

        // ํŒ€ ์•„์ด๋”” ์„ค์ •
        bps.TeamId = (int)team;
        // ํ”Œ๋ ˆ์ด์–ด์˜ ์ƒ‰์ƒ๋ณ€๊ฒฝ
        GetComponent<Renderer>().material = materials[(int)team];

        // step ์„ค์ •
        MaxStep = 10000;
    }

    public override void OnEpisodeBegin()
    {
        // ํ”Œ๋ ˆ์ด์–ด ์œ„์น˜, ๊ฐ๋„ ์ดˆ๊ธฐํ™”
        InitPlayer();
        // ๋ฌผ๋ฆฌ๋ ฅ ์ดˆ๊ธฐํ™”
        rigidbody.velocity = rigidbody.angularVelocity = Vector3.zero;
    }

    public override void OnActionReceived(ActionBuffers actions)
    {
        var action = actions.DiscreteActions;
        // Debug.Log($"[0]={action[0]}, [1]={action[1]}, [2]={action[2]}");

        // ์ด๋™ ๋ฒกํ„ฐ
        Vector3 dir = Vector3.zero;
        // ํšŒ์ „ ๋ฒกํ„ฐ
        Vector3 rot = Vector3.zero;

        int forward = action[0];    // noen, W, S : 0, 1, 2
        int right = action[1];      // noen, Q, E : 0, 1, 2
        int rotate = action[2];     // noen, A, D : 0, 1, 2

        switch (forward)
        {
            case 1: dir = transform.forward; break;
            case 2: dir = -transform.forward; break;
        }

        switch (right)
        {
            case 1: dir = -transform.right; break;
            case 2: dir = transform.right; break;
        }

        switch (rotate)
        {
            case 1: rot = -transform.up; break;
            case 2: rot = transform.up; break;
        }

        rigidbody.AddForce(dir * 1.0f, ForceMode.VelocityChange);
        transform.Rotate(rot, Time.fixedDeltaTime * 100.0f);

    }

    public override void Heuristic(in ActionBuffers actionsOut)
    {
        var actions = actionsOut.DiscreteActions;

        // ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์„ ์ดˆ๊ธฐํ™”
        actions.Clear();

        // ์ •์ง€, ์ „์ง„, ํ›„์ง„      (0, 1, 2)
        if (Input.GetKey(KeyCode.W)) actions[0] = 1;
        if (Input.GetKey(KeyCode.S)) actions[0] = 2;

        // ์ •์ง€, ์ขŒ, ์šฐ ์ด๋™     (0, 1, 2)
        if (Input.GetKey(KeyCode.Q)) actions[1] = 1;
        if (Input.GetKey(KeyCode.E)) actions[1] = 2;

        // ์ •์ง€, ์ขŒ, ์šฐ ํšŒ์ „     (0, 1, 2)
        if (Input.GetKey(KeyCode.A)) actions[2] = 1;
        if (Input.GetKey(KeyCode.D)) actions[2] = 2;
    }

}

- ์ด๋™ ๋ฐ ํšŒ์ „ ์ฒ˜๋ฆฌ

 

 

 

๐Ÿ”ถ Kick ์ฒ˜๋ฆฌ

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using Unity.MLAgents;
using Unity.MLAgents.Sensors;
using Unity.MLAgents.Actuators;
using Unity.MLAgents.Policies;      // Behavior Parameter ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ ‘๊ธดํ•˜๊ธฐ ์œ„ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค

[RequireComponent(typeof(DecisionRequester))]
public class PlayerAgent : Agent
{
    public enum TEAM
    {
        BLUE, RED
    }

    // ํ”Œ๋ ˆ์ด์–ด์˜ ํŒ€
    public TEAM team = TEAM.BLUE;
    // ํ”Œ๋ ˆ์ด์–ด์˜ ์ƒ‰์ƒ
    public Material[] materials;

    // Behavior Parameters
    private BehaviorParameters bps;
    private new Rigidbody rigidbody;

    // ํ”Œ๋ ˆ์ด์–ด์˜ ์ดˆ๊ธฐ ์œ„์น˜, ๊ฐ๋„
    private Vector3 initPosBlue = new Vector3(-5.5f, 0.5f, 0.0f);
    private Vector3 initPosRed = new Vector3(5.5f, 0.5f, 0.0f);
    private Quaternion initRotBlue = Quaternion.Euler(Vector3.up * 90.0f);
    private Quaternion initRotRed = Quaternion.Euler(Vector3.up * -90.0f);

    void InitPlayer()
    {
        transform.localPosition = (team == TEAM.BLUE) ? initPosBlue : initPosRed;
        transform.localRotation = (team == TEAM.BLUE) ? initRotBlue : initRotRed;
    }

    public override void Initialize()
    {
        bps = GetComponent<BehaviorParameters>();
        rigidbody = GetComponent<Rigidbody>();

        // ํŒ€ ์•„์ด๋”” ์„ค์ •
        bps.TeamId = (int)team;
        // ํ”Œ๋ ˆ์ด์–ด์˜ ์ƒ‰์ƒ๋ณ€๊ฒฝ
        GetComponent<Renderer>().material = materials[(int)team];

        // step ์„ค์ •
        MaxStep = 10000;
    }

    public override void OnEpisodeBegin()
    {
        // ํ”Œ๋ ˆ์ด์–ด ์œ„์น˜, ๊ฐ๋„ ์ดˆ๊ธฐํ™”
        InitPlayer();
        // ๋ฌผ๋ฆฌ๋ ฅ ์ดˆ๊ธฐํ™”
        rigidbody.velocity = rigidbody.angularVelocity = Vector3.zero;
    }

    public override void OnActionReceived(ActionBuffers actions)
    {
        var action = actions.DiscreteActions;
        // Debug.Log($"[0]={action[0]}, [1]={action[1]}, [2]={action[2]}");

        // ์ด๋™ ๋ฒกํ„ฐ
        Vector3 dir = Vector3.zero;
        // ํšŒ์ „ ๋ฒกํ„ฐ
        Vector3 rot = Vector3.zero;

        int forward = action[0];    // noen, W, S : 0, 1, 2
        int right = action[1];      // noen, Q, E : 0, 1, 2
        int rotate = action[2];     // noen, A, D : 0, 1, 2

        switch (forward)
        {
            case 1: dir = transform.forward; break;
            case 2: dir = -transform.forward; break;
        }

        switch (right)
        {
            case 1: dir = -transform.right; break;
            case 2: dir = transform.right; break;
        }

        switch (rotate)
        {
            case 1: rot = -transform.up; break;
            case 2: rot = transform.up; break;
        }

        rigidbody.AddForce(dir * 1.0f, ForceMode.VelocityChange);
        transform.Rotate(rot, Time.fixedDeltaTime * 100.0f);

    }

    public override void Heuristic(in ActionBuffers actionsOut)
    {
        var actions = actionsOut.DiscreteActions;

        // ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์„ ์ดˆ๊ธฐํ™”
        actions.Clear();

        // ์ •์ง€, ์ „์ง„, ํ›„์ง„      (0, 1, 2)
        if (Input.GetKey(KeyCode.W)) actions[0] = 1;
        if (Input.GetKey(KeyCode.S)) actions[0] = 2;

        // ์ •์ง€, ์ขŒ, ์šฐ ์ด๋™     (0, 1, 2)
        if (Input.GetKey(KeyCode.Q)) actions[1] = 1;
        if (Input.GetKey(KeyCode.E)) actions[1] = 2;

        // ์ •์ง€, ์ขŒ, ์šฐ ํšŒ์ „     (0, 1, 2)
        if (Input.GetKey(KeyCode.A)) actions[2] = 1;
        if (Input.GetKey(KeyCode.D)) actions[2] = 2;
    }

    private void OnCollisionEnter(Collision coll)
    {
        if (coll.collider.CompareTag("ball"))
        {
            // ๋ณผ ํ„ฐ์น˜ : + ๋ฆฌ์›Œ๋“œ
            AddReward(0.2f);

            // ํ‚ฅ ๋กœ์ง
            Vector3 kickDir = coll.GetContact(0).point - transform.position;
            coll.gameObject.GetComponent<Rigidbody>().AddForce(kickDir * 800.0f);
        }
    }

}

- ํ”Œ๋ ˆ์ด์–ด์™€ ๊ณต์ด ๋ถ€๋”ชํžˆ๋ฉด

- ๊ณต์„ ์ฐฌ ๋ฐฉํ–ฅ์œผ๋กœ AddForce

 

'Unity > ML-Agents' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

07. ML-Agents - Soccer (2)  (0) 2021.08.03
05. ML-Agents - Imitation Learning  (0) 2021.08.02
04. ML-Agents - Camera Sensor  (0) 2021.08.01
03. ML-Agents - Ray Perception Sensor 3D  (0) 2021.07.30
02. ML-Agents - position,rigidbody ๊ด€์ธก  (0) 2021.07.30