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. Unity 2022.2 is now available as the latest Tech release.
    Dismiss Notice
  3. We are making some changes to the DOTS forums.
    Dismiss Notice
  4. Have a look at our Games Focus blog post series which will show what Unity is doing for all game developers – now, next year, and in the future.
    Dismiss Notice

Resolved I can't actually affect trait's data from custom effect

Discussion in 'AI & Navigation Previews' started by Noxalus, Sep 29, 2020.

  1. Noxalus

    Noxalus

    Joined:
    Jan 9, 2018
    Posts:
    79
    Hello everyone,

    I'm trying to use a custom effect as described in the documentation to decrease values from a Needs trait that contains 3 fields:

    upload_2020-9-29_14-41-54.png

    So I've made this class:

    Code (CSharp):
    1. using Unity.AI.Planner.DomainLanguage.TraitBased;
    2. using Generated.AI.Planner.StateRepresentation;
    3. using Generated.AI.Planner.StateRepresentation.AgentPlan;
    4. using UnityEngine;
    5.  
    6. public struct NeedsEffect : ICustomActionEffect<StateData>
    7. {
    8.     public void ApplyCustomActionEffectsToState(StateData originalState, ActionKey action, StateData newState)
    9.     {
    10.         TraitBasedObjectId moverObjectId = newState.GetTraitBasedObjectId(action[0]);
    11.         TraitBasedObject moverObject = newState.GetTraitBasedObject(moverObjectId);
    12.         Needs needs = newState.GetTraitOnObject<Needs>(moverObject);
    13.  
    14.         needs.Energy = Mathf.Max(0, needs.Energy - 1);
    15.         needs.Fun = Mathf.Max(0, needs.Fun - 1);
    16.         needs.Restroom = Mathf.Max(0, needs.Restroom - 1);
    17.     }
    18. }
    And I affected this effect to a Move action like that:

    upload_2020-9-29_14-44-30.png

    But it doesn't seem to work if I look at the graph in the plan visualizer.

    From the state selected (before branching), I expect the needs (highlighted in red from the screen) to decrease by one in the next state if the "Move" action is used:

    upload_2020-9-29_14-52-24.png

    But only the Energy decreases (the last effect from the Move action asset file):

    upload_2020-9-29_14-52-28.png

    Do you know why? Did I do something wrong?

    N.B: I generated the AI Planner assemblies with no error. No error neither in the console at runtime. I made a small project to show the issue here.
     
  2. TrevorUnity

    TrevorUnity

    Unity Technologies

    Joined:
    Jun 28, 2017
    Posts:
    114
    You're modifying a local copy of the struct. You need to set the updated version back on the new state.
     
    Noxalus likes this.
  3. Noxalus

    Noxalus

    Joined:
    Jan 9, 2018
    Posts:
    79
    My bad, that was a dumb mistake... Thank you for your help, here is the fixed code:

    Code (CSharp):
    1. using Unity.AI.Planner.DomainLanguage.TraitBased;
    2. using Generated.AI.Planner.StateRepresentation;
    3. using Generated.AI.Planner.StateRepresentation.AgentPlan;
    4. using UnityEngine;
    5.  
    6. public struct NeedsEffect : ICustomActionEffect<StateData>
    7. {
    8.     public void ApplyCustomActionEffectsToState(StateData originalState, ActionKey action, StateData newState)
    9.     {
    10.         TraitBasedObjectId moverObjectId = newState.GetTraitBasedObjectId(action[0]);
    11.         TraitBasedObject moverObject = newState.GetTraitBasedObject(moverObjectId);
    12.         Needs needs = newState.GetTraitOnObject<Needs>(moverObject);
    13.  
    14.         needs.Energy = Mathf.Max(0, needs.Energy - 1);
    15.         needs.Fun = Mathf.Max(0, needs.Fun - 1);
    16.         needs.Restroom = Mathf.Max(0, needs.Restroom - 1);
    17.  
    18.         newState.SetTraitOnObject(needs, ref moverObject);
    19.     }
    20. }