Search Unity

  1. Welcome to the Unity Forums! Please take the time to read our Code of Conduct to familiarize yourself with the forum rules and how to post constructively.
  2. Join us on March 30, 2023, between 5 am & 1 pm EST, in the Performance Profiling Dev Blitz Day 2023 - Q&A forum and Discord where you can connect with our teams behind the Memory and CPU Profilers.
    Dismiss Notice

No suitable method found to override

Discussion in 'ML-Agents' started by Yuulis04, May 6, 2021.

  1. Yuulis04

    Yuulis04

    Joined:
    Apr 4, 2021
    Posts:
    28
    Hello. I tried to make a new environment for ML-Agents, but after writing a code, the errors happened :
    'AgentControl.Heuristic(float[])': no suitable method found to override
    'AgentControl.OnActionReceived(float[])': no suitable method found to override

    I'm using Unity 2019.4, ML-Agents 2.0.0 exp-1.
    My code is below:

    Code (CSharp):
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. using Unity.MLAgents;
    5. using Unity.MLAgents.Sensors;
    6. using Unity.MLAgents.Actuators;
    7.  
    8. public class AgentControl : Agent
    9. {
    10.     public Transform target1;
    11.     public Transform target2;
    12.     public Transform target3;
    13.     public Transform target4;
    14.     Rigidbody rBody;
    15.     private bool onEpisode = false;
    16.     private string closestTarget;
    17.  
    18.     public override void Initialize()
    19.     {
    20.         this.rBody = GetComponent<Rigidbody>();
    21.         onEpisode = false;
    22.     }
    23.  
    24.     public override void OnEpisodeBegin()
    25.     {
    26.         this.rBody.angularVelocity = Vector3.zero;
    27.         this.rBody.velocity = Vector3.zero;
    28.         this.transform.rotation = Quaternion.identity;
    29.  
    30.         this.transform.localPosition = new Vector3(Random.Range(-14.0f, 14.0f), 0.5f, Random.Range(-9.0f, 9.0f));
    31.         onEpisode = true;
    32.  
    33.         float dis1 = Vector3.Distance(this.transform.localPosition, target1.localPosition);
    34.         float dis2 = Vector3.Distance(this.transform.localPosition, target2.localPosition);
    35.         float dis3 = Vector3.Distance(this.transform.localPosition, target3.localPosition);
    36.         float dis4 = Vector3.Distance(this.transform.localPosition, target4.localPosition);
    37.  
    38.         float leastDis = Mathf.Min(dis1, dis2, dis3, dis4);
    39.  
    40.         if (leastDis == dis1) closestTarget = "Target1";
    41.         if (leastDis == dis2) closestTarget = "Target2";
    42.         if (leastDis == dis3) closestTarget = "Target3";
    43.         if (leastDis == dis4) closestTarget = "Target4";
    44.     }
    45.  
    46.     public override void OnActionReceived(float[] vectorAction)
    47.     {
    48.         Vector3 dirToGo = Vector3.zero;
    49.         Vector3 rotateDir = Vector3.zero;
    50.  
    51.         int action = (int)vectorAction[0];
    52.         if (action == 1) dirToGo = transform.forward;
    53.         if (action == 2) dirToGo = transform.forward * -1.0f;
    54.         if (action == 3) rotateDir = transform.up;
    55.         if (action == 4) rotateDir = transform.up * -1.0f;
    56.  
    57.         this.transform.Rotate(rotateDir, Time.deltaTime * 200f);
    58.         this.rBody.AddForce(dirToGo * 0.5f, ForceMode.VelocityChange);
    59.  
    60.         if (this.transform.localPosition.y < 0)
    61.         {
    62.             AddReward(-0.3f);
    63.             EndEpisode();
    64.         }
    65.  
    66.         AddReward(-1.0f / MaxStep);
    67.     }
    68.  
    69.     public void OnCollisionEnter(Collision collision)
    70.     {
    71.         if (collision.gameObject.tag == "target")
    72.         {
    73.             if (onEpisode)
    74.             {
    75.                 if (collision.gameObject.name == closestTarget)
    76.                 {
    77.                     AddReward(1.0f);
    78.                     EndEpisode();
    79.                 }
    80.  
    81.                 else
    82.                 {
    83.                     AddReward(0.3f);
    84.                     EndEpisode();
    85.                 }
    86.  
    87.             }
    88.             else
    89.             {
    90.                 this.transform.localPosition = new Vector3(Random.Range(-14.0f, 14.0f), 0.5f, Random.Range(-9.0f, 9.0f));
    91.             }
    92.         }
    93.     }
    94.  
    95.     public override void Heuristic(float[] actionsOut)
    96.     {
    97.         actionsOut[0] = 0;
    98.         if (Input.GetKey(KeyCode.UpArrow)) actionsOut[0] = 1;
    99.         if (Input.GetKey(KeyCode.DownArrow)) actionsOut[0] = 2;
    100.         if (Input.GetKey(KeyCode.RightArrow)) actionsOut[0] = 3;
    101.         if (Input.GetKey(KeyCode.LeftArrow)) actionsOut[0] = 4;
    102.     }
    103. }
    Could you help me?
     
  2. christophergoy

    christophergoy

    Unity Technologies

    Joined:
    Sep 16, 2015
    Posts:
    735
    Please read the migration guide when upgrading the ml-agents version. You will see that these method signatures have changed on Agent:

    • Agent.CollectDiscreteActionMasks(DiscreteActionMasker actionMasker) --> Agent.WriteDiscreteActionMask(IDiscreteActionMask actionMask)
    • Agent.Heuristic(float[] actionsOut) --> Agent.Heuristic(in ActionBuffers actionsOut)
    • Agent.OnActionReceived(float[] vectorAction) --> Agent.OnActionReceived(ActionBuffers actions)
    • Agent.GetAction() --> Agent.GetStoredActionBuffers()
     
    Crosis8521, BorjaRiera and milan_t like this.
  3. Yuulis04

    Yuulis04

    Joined:
    Apr 4, 2021
    Posts:
    28
    Thank you! I understand "override" is no longer used in this method.
    This is the first time ML-Agents upgrade for me, so I will check there next time.
     
    christophergoy likes this.
  4. Jiheneh

    Jiheneh

    Joined:
    Dec 17, 2021
    Posts:
    2
    hello, i've changed 2 lines
    • Agent.Heuristic(float[] actionsOut) --> Agent.Heuristic(in ActionBuffers actionsOut)
    • Agent.OnActionReceived(float[] vectorAction) --> Agent.OnActionReceived(ActionBuffers actions)th
    these 2 errors appear:

    Assets\Hummingbird\Scripts\HummingbirdAgent.cs(116,43): error CS0246: The type or namespace name 'ActionBuffers' could not be found (are you missing a using directive or an assembly reference?)


    Assets\Hummingbird\Scripts\HummingbirdAgent.cs(192,39): error CS0246: The type or namespace name 'ActionBuffers' could not be found (are you missing a using directive or an assembly reference?)

    Any help please?







     
    BorjaRiera likes this.
  5. jrupert-unity

    jrupert-unity

    Unity Technologies

    Joined:
    Oct 20, 2021
    Posts:
    12
    Those specific errors should be fixed by adding this using directive at the top of the file:
    Code (CSharp):
    1. using Unity.MLAgents.Actuators;
    Are you migrating the Hummingbird project to ML-Agents 2.0? There's probably quite a bit of work required to do that, you might be better off using ML-Agents 1.0 if you want to use that project.
     
    Jiheneh likes this.
  6. Jiheneh

    Jiheneh

    Joined:
    Dec 17, 2021
    Posts:
    2
    Thank you
     
  7. klinsc

    klinsc

    Joined:
    Oct 4, 2020
    Posts:
    1

    Thank you!
    I just faced the same issues, and just fixed it by downgrading the package to https://github.com/Unity-Technologies/ml-agents/releases/tag/release_1
     
  8. BorjaRiera

    BorjaRiera

    Joined:
    Aug 16, 2022
    Posts:
    1
    it says "Cannot apply indexing with [] to an expression of type 'ActionBuffers'" I only used [] in actionsOut[0] and actionsOut[1]. send help please.
     
  9. SneakySasquatch_

    SneakySasquatch_

    Joined:
    Sep 1, 2022
    Posts:
    2
    Hello everyone!

    Versions:
    ml-agents (python package): 0.28.0
    ml-agents-envs (python package): 0.28.0
    Unity Package Manager package: ML Agents 2.01
    ======================================
    Errors #1:
    Assets\Scripts\BounceAgent.cs(30,25): error CS0115: 'BounceAgent.OnActionReceived(float[])': no suitable method found to override

    &

    Assets\Scripts\BounceAgent.cs(49,25): error CS0115: 'BounceAgent.Heuristic(float[])': no suitable method found to override
    =========================================================================================
    I understand that this code is deprecated - but when I change it to OnActionReceived(ActionBuffers actions) or Heuristic(in ActionBuffers actionsOut), I get the following error:

    Error CS0021 Cannot apply indexing with [] to an expression of type 'ActionBuffers'

    This is because I have not declared an array - but when I do declare an array, I get the following errors:

    Error CS1503 Argument 1: cannot convert from 'Unity.MLAgents.Actuators.ActionBuffers' to 'float'

    &

    Error CS0029 Cannot implicitly convert type 'Unity.MLAgents.Actuators.ActionBuffers' to 'float'

    &

    Error CS0019 Operator '*' cannot be applied to operands of type 'ActionBuffers' and 'ActionBuffers'

    I don't know how to change ActionBuffers to a float...(or if that would help)...

    I tried downgrading my packages, but after 3 days I ended up getting everything back, so I'm not going to use that option. Here is a screenshot of the problematic code...


    CodeDoesn'tWork.PNG


    Any help would be much appreciated!