NodeCanvas Forums › Support › Weird NullReferenceException when Executing Function (MP)
Hi,
I’m using the latest version of both, Unity and NC and I’m having a little problem. I’m trying to execute a custom function (not an Action/Condition) which resides in a custom public class:
1 2 3 4 |
public void MoveTo(Vector3 targetPosition) { // Pathfinding Project stuff } |
Which results in this Exception:
Object reference not set to an instance of an object
at PFPAgent.MoveTo (Vector3 targetPosition, System.Action OnPathFinished) [0x0000d] in \PFPAgent.cs:125
at NodeCanvas.Framework.Internal.ReflectedAction
2[UnityEngine.Vector3,System.Action].Call () [0x00000] in \Assets\NodeCanvas\Framework\Runtime\ReflectionWrappers\ReflectedAction.cs:47
at NodeCanvas.Tasks.Actions.ExecuteFunction.OnExecute () [0x00073] in \Assets\NodeCanvas\Tasks\Actions\ScriptControl\ExecuteFunction.cs:94
UnityEngine.Debug:LogError(Object)
NodeCanvas.Tasks.Actions.ExecuteFunction:OnExecute() (at Assets/NodeCanvas/Tasks/Actions/ScriptControl/ExecuteFunction.cs:104)
NodeCanvas.Framework.ActionTask:ExecuteAction(Component, IBlackboard) (at Assets/NodeCanvas/Framework/Runtime/Tasks/ActionTask.cs:113)
NodeCanvas.BehaviourTrees.ActionNode:OnExecute(Component, IBlackboard) (at Assets/NodeCanvas/Modules/BehaviourCanvas/BehaviourTrees/Nodes/Leafs/ActionNode.cs:37)
NodeCanvas.Framework.Node:Execute(Component, IBlackboard) (at Assets/NodeCanvas/Framework/Runtime/Graphs/Node.cs:242)
NodeCanvas.Framework.Connection:Execute(Component, IBlackboard) (at Assets/NodeCanvas/Framework/Runtime/Graphs/Connection.cs:175)
NodeCanvas.BehaviourTrees.Sequencer:OnExecute(Component, IBlackboard) (at Assets/NodeCanvas/Modules/BehaviourCanvas/BehaviourTrees/Nodes/Composites/Sequencer.cs:27)
NodeCanvas.Framework.Node:Execute(Component, IBlackboard) (at Assets/NodeCanvas/Framework/Runtime/Graphs/Node.cs:242)
NodeCanvas.Framework.Connection:Execute(Component, IBlackboard) (at Assets/NodeCanvas/Framework/Runtime/Graphs/Connection.cs:175)
NodeCanvas.BehaviourTrees.Selector:OnExecute(Component, IBlackboard) (at Assets/NodeCanvas/Modules/BehaviourCanvas/BehaviourTrees/Nodes/Composites/Selector.cs:27)
NodeCanvas.Framework.Node:Execute(Component, IBlackboard) (at Assets/NodeCanvas/Framework/Runtime/Graphs/Node.cs:242)
NodeCanvas.Framework.Connection:Execute(Component, IBlackboard) (at Assets/NodeCanvas/Framework/Runtime/Graphs/Connection.cs:175)
NodeCanvas.BehaviourTrees.Filter:OnExecute(Component, IBlackboard) (at Assets/NodeCanvas/Modules/BehaviourCanvas/BehaviourTrees/Nodes/Decorators/Filter.cs:46)
NodeCanvas.Framework.Node:Execute(Component, IBlackboard) (at Assets/NodeCanvas/Framework/Runtime/Graphs/Node.cs:242)
NodeCanvas.Framework.Connection:Execute(Component, IBlackboard) (at Assets/NodeCanvas/Framework/Runtime/Graphs/Connection.cs:175)
NodeCanvas.BehaviourTrees.ConditionalEvaluator:OnExecute(Component, IBlackboard) (at Assets/NodeCanvas/Modules/BehaviourCanvas/BehaviourTrees/Nodes/Decorators/ConditionalEvaluator.cs:50)
NodeCanvas.Framework.Node:Execute(Component, IBlackboard) (at Assets/NodeCanvas/Framework/Runtime/Graphs/Node.cs:242)
NodeCanvas.Framework.Connection:Execute(Component, IBlackboard) (at Assets/NodeCanvas/Framework/Runtime/Graphs/Connection.cs:175)
NodeCanvas.BehaviourTrees.Selector:OnExecute(Component, IBlackboard) (at Assets/NodeCanvas/Modules/BehaviourCanvas/BehaviourTrees/Nodes/Composites/Selector.cs:27)
NodeCanvas.Framework.Node:Execute(Component, IBlackboard) (at Assets/NodeCanvas/Framework/Runtime/Graphs/Node.cs:242)
NodeCanvas.Framework.Connection:Execute(Component, IBlackboard) (at Assets/NodeCanvas/Framework/Runtime/Graphs/Connection.cs:175)
NodeCanvas.BehaviourTrees.Sequencer:OnExecute(Component, IBlackboard) (at Assets/NodeCanvas/Modules/BehaviourCanvas/BehaviourTrees/Nodes/Composites/Sequencer.cs:27)
NodeCanvas.Framework.Node:Execute(Component, IBlackboard) (at Assets/NodeCanvas/Framework/Runtime/Graphs/Node.cs:242)
NodeCanvas.BehaviourTrees.BehaviourTree:Tick(Component, IBlackboard) (at Assets/NodeCanvas/Modules/BehaviourCanvas/BehaviourTrees/BehaviourTree.cs:75)
NodeCanvas.BehaviourTrees.BehaviourTree:OnGraphUpdate() (at Assets/NodeCanvas/Modules/BehaviourCanvas/BehaviourTrees/BehaviourTree.cs:60)
ParadoxNotion.Services.MonoManager:Update() (at Assets/NodeCanvas/Framework/_ParadoxNotion (shared)/Runtime/Services/MonoManager.cs:80)
This error only appears if NC tries to call the ‘MoveTo’ function directly.
If I call the function from inside a custom action like this:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public class MoveToTargetPosition : ActionTask<PFPAgent> { [RequiredField] public BBParameter<Vector3> movementTarget; [BlackboardOnly] public BBParameter<Vector3> saveAs; protected override string info { get { return "Save as " + saveAs; } } protected override void OnExecute() { saveAs.value = movementTarget.value; agent.MoveTo(movementTarget.value, () => EndAction(true)); // the function call } } |
…then everything works fine.
The only difference is, that I actually pass a System.Action as parameter, whereas the direct call passes ‘null’ and therefor never “officially” ends the NC action. I can live with this workaround but still, it’s a bit confusing. ^^
Hello,
It seems that PFAgent.cs #125 throws a null reference due to the System.Action callback being null?
The thing is that NC can’t use parameters of delegate type, at least right now.
I think in this specific case it would be easier and more convenient to use a custom action like you did 🙂
Join us on Discord: https://discord.gg/97q2Rjh
Yeah, that’s what I’ll keep doing then. Thanks! 🙂