From d531b127e58ca77abc28d00a4969c36e1dc5a9b4 Mon Sep 17 00:00:00 2001 From: Chris Date: Mon, 4 Aug 2025 19:03:56 -0400 Subject: [PATCH 01/18] added: task to check and save input values --- .../Core/Graph Tasks/CheckInputValue.cs | 42 +++++++++++++++++++ .../Core/Graph Tasks/CheckInputValue.cs.meta | 2 + 2 files changed, 44 insertions(+) create mode 100644 Assets/Scripts/Core/Graph Tasks/CheckInputValue.cs create mode 100644 Assets/Scripts/Core/Graph Tasks/CheckInputValue.cs.meta diff --git a/Assets/Scripts/Core/Graph Tasks/CheckInputValue.cs b/Assets/Scripts/Core/Graph Tasks/CheckInputValue.cs new file mode 100644 index 0000000..2b5f1f4 --- /dev/null +++ b/Assets/Scripts/Core/Graph Tasks/CheckInputValue.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using NodeCanvas.Framework; +using ParadoxNotion; +using ParadoxNotion.Design; +using UnityEngine; +using UnityEngine.InputSystem; + +namespace NodeCanvas.Tasks.Actions { + [Category("Reset/Input")] + [Description("Check if input condition was matched this frame by phase.")] + public class CheckInputValue : ActionTask where T : struct{ + public BBParameter actionName; + public BBParameter outputTo; + + private T value; + + private SignalDefinition signalDefinition; + protected override string info { + get { return $"Get Value of Input: \"{actionName.value}\""; } + } + + protected override string OnInit(){ + try { + signalDefinition = Resources.Load("InputSignal"); + } catch (Exception e) { + Debug.LogError($"Error finding the Input Signal defintion: {e.Message}"); + throw; + } + + return null; + } + + protected override void OnExecute(){ + Debug.Log($"{outputTo.value}, {agent.actions[actionName.value].ReadValue()}"); + + outputTo.value = agent.actions[actionName.value].ReadValue(); + EndAction(); + } + } +} + diff --git a/Assets/Scripts/Core/Graph Tasks/CheckInputValue.cs.meta b/Assets/Scripts/Core/Graph Tasks/CheckInputValue.cs.meta new file mode 100644 index 0000000..fe8e41c --- /dev/null +++ b/Assets/Scripts/Core/Graph Tasks/CheckInputValue.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 055df0fbf696a3149a2d49a8a5392aba From 9eb394d2955a2f74f0825cdec2c72b1b29e44754 Mon Sep 17 00:00:00 2001 From: Chris Date: Mon, 4 Aug 2025 19:04:22 -0400 Subject: [PATCH 02/18] change: output the object hit by generic observers --- Assets/Scripts/Core/Graph Tasks/CheckGenericObserver.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Assets/Scripts/Core/Graph Tasks/CheckGenericObserver.cs b/Assets/Scripts/Core/Graph Tasks/CheckGenericObserver.cs index d7dacb2..43b9b42 100644 --- a/Assets/Scripts/Core/Graph Tasks/CheckGenericObserver.cs +++ b/Assets/Scripts/Core/Graph Tasks/CheckGenericObserver.cs @@ -34,6 +34,8 @@ namespace Reset { private EnvironmentObserver observer; + public BBParameter outputHit; + #if UNITY_EDITOR protected override void OnTaskInspectorGUI(){ BBParameterEditor.ParameterField("Cast Type", castType); @@ -60,6 +62,8 @@ namespace Reset { if (drawGizmos) { drawGizmosOnlyWhenActive = EditorGUILayout.Toggle("Draw Gizmos Only When Active", drawGizmosOnlyWhenActive); } + + BBParameterEditor.ParameterField("Output Hit", outputHit); } #endif From 7cdfa067c53c7729f36da39eacc196648fe14919 Mon Sep 17 00:00:00 2001 From: Chris Date: Mon, 4 Aug 2025 19:04:47 -0400 Subject: [PATCH 03/18] changed: more progress on grapple system --- Assets/Player/Graphs/GrappleAimBT.asset | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/Assets/Player/Graphs/GrappleAimBT.asset b/Assets/Player/Graphs/GrappleAimBT.asset index 1998df9..35ac229 100644 --- a/Assets/Player/Graphs/GrappleAimBT.asset +++ b/Assets/Player/Graphs/GrappleAimBT.asset @@ -12,18 +12,22 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 7a686a47eee2fa44cb0a34b5d86e4d5e, type: 3} m_Name: GrappleAimBT m_EditorClassIdentifier: - _serializedGraph: '{"type":"NodeCanvas.BehaviourTrees.BehaviourTree","nodes":[{"_position":{"x":732.5245,"y":286.5939},"$type":"NodeCanvas.BehaviourTrees.Sequencer","$id":"0"},{"_condition":{"actionName":{"_value":"Grapple"},"actionPhase":{"_value":3},"$type":"NodeCanvas.Tasks.Conditions.CheckInput"},"_position":{"x":359.9515,"y":502.918},"$type":"NodeCanvas.BehaviourTrees.WaitUntil","$id":"1"},{"_action":{"fieldOfView":{"label":"FOV","value":60.0,"changeValue":1},"orbitPositionDamping":{"label":"Position + _serializedGraph: '{"type":"NodeCanvas.BehaviourTrees.BehaviourTree","nodes":[{"_position":{"x":732.5245,"y":286.5939},"$type":"NodeCanvas.BehaviourTrees.Sequencer","$id":"0"},{"_condition":{"actionName":{"_value":"Grapple"},"actionPhase":{"_value":3},"$type":"NodeCanvas.Tasks.Conditions.CheckInput"},"_position":{"x":89.95151,"y":510.918},"$type":"NodeCanvas.BehaviourTrees.WaitUntil","$id":"1"},{"_action":{"fieldOfView":{"label":"FOV","value":60.0,"changeValue":1},"orbitPositionDamping":{"label":"Position Damping","newValue":{"x":0.2,"z":0.2},"changeX":1,"changeZ":1},"orbitFollowTop":{"label":"Top","changeHeight":1,"height":2.0,"changeRadius":1,"radius":2.0},"orbitFollowCenter":{"label":"Center","changeHeight":1,"height":1.5,"changeRadius":1,"radius":2.4},"orbitFollowBottom":{"label":"Bottom","changeHeight":1,"height":0.2,"changeRadius":1,"radius":0.8},"cameraOffset":{"label":"Screen - Position","newValue":{"x":2.0,"y":0.5,"z":-1.0},"changeX":1,"changeY":1,"changeZ":1},"$type":"NodeCanvas.Tasks.Actions.ChangeCameraSettings"},"_position":{"x":184.6321,"y":659.3029},"$type":"NodeCanvas.BehaviourTrees.ActionNode","$id":"2"},{"policy":1,"_position":{"x":599.0,"y":507.0},"$type":"NodeCanvas.BehaviourTrees.Parallel","$id":"3"},{"repeaterMode":2,"repeatTimes":{"_value":1},"_position":{"x":470.0,"y":657.0},"$type":"NodeCanvas.BehaviourTrees.Repeater","$id":"4"},{"_action":{"eventName":{"_value":"Grapple - Zoomed"},"delay":{},"$type":"NodeCanvas.Tasks.Actions.SendEvent"},"_position":{"x":438.0,"y":795.0},"$type":"NodeCanvas.BehaviourTrees.ActionNode","$id":"5"},{"_action":{"waitTime":{"_value":0.1},"$type":"NodeCanvas.Tasks.Actions.Wait"},"_position":{"x":647.4366,"y":655.895},"$type":"NodeCanvas.BehaviourTrees.ActionNode","$id":"6"},{"failureRemap":1,"_position":{"x":839.0,"y":509.0},"$type":"NodeCanvas.BehaviourTrees.Remapper","$id":"7"},{"_condition":{"actionName":{"_value":"Grapple"},"actionPhase":{"_value":4},"$type":"NodeCanvas.Tasks.Conditions.CheckInput"},"_position":{"x":798.0,"y":585.0},"$type":"NodeCanvas.BehaviourTrees.Interruptor","$id":"8"},{"repeaterMode":2,"repeatTimes":{"_value":1},"_position":{"x":838.9237,"y":701.0772},"$type":"NodeCanvas.BehaviourTrees.Repeater","$id":"9"},{"_action":{"eventName":{"_value":"Grapple - Zoomed"},"delay":{},"$type":"NodeCanvas.Tasks.Actions.SendEvent"},"_position":{"x":807.9237,"y":837.0771},"$type":"NodeCanvas.BehaviourTrees.ActionNode","$id":"10"},{"_action":{"fieldOfView":{"label":"FOV","changeValue":2},"orbitFollowTop":{"label":"Top","changeHeight":2,"changeRadius":2},"orbitFollowCenter":{"label":"Center","changeHeight":2,"changeRadius":2},"orbitFollowBottom":{"label":"Bottom","changeHeight":2,"changeRadius":2},"screenPosition":{"label":"Screen - Position","changeX":2,"changeY":2},"cameraOffset":{"label":"Screen Position","changeX":2,"changeY":2,"changeZ":2},"$type":"NodeCanvas.Tasks.Actions.ChangeCameraSettings"},"_position":{"x":1186.84,"y":501.1857},"$type":"NodeCanvas.BehaviourTrees.ActionNode","$id":"11"}],"connections":[{"_sourceNode":{"$ref":"0"},"_targetNode":{"$ref":"1"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"0"},"_targetNode":{"$ref":"3"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"0"},"_targetNode":{"$ref":"7"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"0"},"_targetNode":{"$ref":"11"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"1"},"_targetNode":{"$ref":"2"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"3"},"_targetNode":{"$ref":"4"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"3"},"_targetNode":{"$ref":"6"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"4"},"_targetNode":{"$ref":"5"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"7"},"_targetNode":{"$ref":"8"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"8"},"_targetNode":{"$ref":"9"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"9"},"_targetNode":{"$ref":"10"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"}],"canvasGroups":[],"localBlackboard":{"_variables":{}},"derivedData":{"repeat":true,"$type":"NodeCanvas.BehaviourTrees.BehaviourTree+DerivedSerializationData"}}' + Position","newValue":{"x":2.0,"y":0.5,"z":-1.0},"changeX":1,"changeY":1,"changeZ":1},"$type":"NodeCanvas.Tasks.Actions.ChangeCameraSettings"},"_position":{"x":-85.3679,"y":667.3029},"$type":"NodeCanvas.BehaviourTrees.ActionNode","$id":"2"},{"_condition":{"actionName":{"_value":"Grapple"},"actionPhase":{"_value":4},"$type":"NodeCanvas.Tasks.Conditions.CheckInput"},"_position":{"x":336.0,"y":511.0},"$type":"NodeCanvas.BehaviourTrees.WaitUntil","$id":"3"},{"_action":{"boolVariable":{"_name":"_castHit"},"setTo":0,"$type":"NodeCanvas.Tasks.Actions.SetBoolean"},"_position":{"x":568.0,"y":515.0},"$type":"NodeCanvas.BehaviourTrees.ActionNode","$id":"4"},{"policy":1,"dynamic":true,"_position":{"x":749.7742,"y":517.9701},"$type":"NodeCanvas.BehaviourTrees.Parallel","$id":"5"},{"repeaterMode":2,"repeatTimes":{"_value":1},"_position":{"x":247.0,"y":763.0},"$type":"NodeCanvas.BehaviourTrees.Repeater","$id":"6"},{"_condition":{"castType":{"_value":4},"length":{"_value":20.0},"direction":{"_value":{"z":1.0}},"offset":{},"ignoreLayers":{"_value":{"value":8}},"width":{"_value":3.0},"size":{},"rotation":{},"drawGizmos":true,"outputHit":{"_name":"_observerHit"},"overrideAgent":{"_type":"UnityEngine.Transform","_name":"camera","_targetVariableID":"e1cfd0be-7f55-420d-bdd8-e72531fc61ba"},"$type":"Reset.CheckGenericObserver"},"_position":{"x":209.0,"y":871.0},"$type":"NodeCanvas.BehaviourTrees.BinarySelector","$id":"7"},{"_action":{"boolVariable":{"_name":"_castHit"},"$type":"NodeCanvas.Tasks.Actions.SetBoolean"},"_position":{"x":127.0,"y":975.0},"$type":"NodeCanvas.BehaviourTrees.ActionNode","$id":"8"},{"_action":{"boolVariable":{"_name":"_castHit"},"setTo":0,"$type":"NodeCanvas.Tasks.Actions.SetBoolean"},"_position":{"x":320.0,"y":973.0},"$type":"NodeCanvas.BehaviourTrees.ActionNode","$id":"9"},{"_position":{"x":841.0,"y":848.0},"$type":"NodeCanvas.BehaviourTrees.Sequencer","$id":"10"},{"_condition":{"actionName":{"_value":"Grapple"},"actionPhase":{"_value":3},"$type":"NodeCanvas.Tasks.Conditions.CheckInput"},"_position":{"x":540.0,"y":973.0},"$type":"NodeCanvas.BehaviourTrees.WaitUntil","$id":"11"},{"_condition":{"valueA":{"_name":"_castHit"},"valueB":{"_value":true},"$type":"NodeCanvas.Tasks.Conditions.CheckBoolean"},"_position":{"x":569.0,"y":1079.0},"$type":"NodeCanvas.BehaviourTrees.ConditionalEvaluator","$id":"12"},{"_action":{"eventName":{"_value":"Started + Tilt Controls"},"delay":{},"$type":"NodeCanvas.Tasks.Actions.SendEvent"},"_position":{"x":511.9847,"y":1182.83},"$type":"NodeCanvas.BehaviourTrees.ActionNode","$id":"13"},{"_position":{"x":852.0,"y":973.0},"$type":"NodeCanvas.BehaviourTrees.Inverter","$id":"14"},{"_condition":{"actionName":{"_value":"Grapple"},"actionPhase":{"_value":4},"$type":"NodeCanvas.Tasks.Conditions.CheckInput"},"_position":{"x":799.0,"y":1035.0},"$type":"NodeCanvas.BehaviourTrees.Interruptor","$id":"15"},{"repeaterMode":2,"repeatTimes":{"_value":1},"_position":{"x":872.6089,"y":1145.236},"$type":"NodeCanvas.BehaviourTrees.Repeater","$id":"16"},{"_action":{"actions":[{"actionName":{"_value":"Look"},"outputTo":{"_name":"_lookDir"},"$type":"NodeCanvas.Tasks.Actions.CheckInputValue`1[[UnityEngine.Vector2, + UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]"},{"targetVector":{"_name":"_lookDir"},"x":{"_name":""},"y":{"_name":"_lookDirY"},"z":{"_name":""},"$type":"NodeCanvas.Tasks.Actions.DecomposeVector"}],"$type":"NodeCanvas.Framework.ActionList"},"_position":{"x":772.6562,"y":1253.63},"$type":"NodeCanvas.BehaviourTrees.ActionNode","$id":"17"},{"_action":{"eventName":{"_value":"Confirmed + Choice"},"delay":{},"$type":"NodeCanvas.Tasks.Actions.SendEvent"},"_position":{"x":1059.947,"y":979.5414},"$type":"NodeCanvas.BehaviourTrees.ActionNode","$id":"18"},{"policy":1,"_position":{"x":928.0059,"y":524.0208},"$type":"NodeCanvas.BehaviourTrees.Parallel","$id":"19"},{"_condition":{"conditions":[{"actionName":{"_value":"Grapple"},"actionPhase":{"_value":4},"$type":"NodeCanvas.Tasks.Conditions.CheckInput"},{"valueA":{"_name":"_castHit"},"valueB":{},"$type":"NodeCanvas.Tasks.Conditions.CheckBoolean"}],"$type":"NodeCanvas.Framework.ConditionList"},"_position":{"x":965.381,"y":658.2095},"$type":"NodeCanvas.BehaviourTrees.WaitUntil","$id":"20"},{"_action":{"log":{"_value":"Cancelled"},"secondsToRun":0.0,"$type":"NodeCanvas.Tasks.Actions.DebugLogText"},"_position":{"x":1046.394,"y":796.2429},"$type":"NodeCanvas.BehaviourTrees.ActionNode","$id":"21"},{"_action":{"actions":[{"fieldOfView":{"label":"FOV","changeValue":2},"orbitFollowTop":{"label":"Top","changeHeight":2,"changeRadius":2},"orbitFollowCenter":{"label":"Center","changeHeight":2,"changeRadius":2},"orbitFollowBottom":{"label":"Bottom","changeHeight":2,"changeRadius":2},"screenPosition":{"label":"Screen + Position","changeX":2,"changeY":2},"cameraOffset":{"label":"Screen Position","changeX":2,"changeY":2,"changeZ":2},"$type":"NodeCanvas.Tasks.Actions.ChangeCameraSettings"},{"valueA":{"_name":"_observerHit"},"valueB":{},"$type":"NodeCanvas.Tasks.Actions.SetVariable`1[[UnityEngine.RaycastHit, + UnityEngine.PhysicsModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]"}],"$type":"NodeCanvas.Framework.ActionList"},"_position":{"x":1105.84,"y":503.1857},"$type":"NodeCanvas.BehaviourTrees.ActionNode","$id":"22"},{"failureRemap":1,"_position":{"x":400.0,"y":1531.0},"$type":"NodeCanvas.BehaviourTrees.Remapper","$id":"23"},{"_condition":{"conditions":[{"valueA":{"_name":"_castHit"},"valueB":{},"$type":"NodeCanvas.Tasks.Conditions.CheckBoolean"},{"actionName":{"_value":"Grapple"},"actionPhase":{"_value":4},"_isDisabled":true,"$type":"NodeCanvas.Tasks.Conditions.CheckInput"}],"$type":"NodeCanvas.Framework.ConditionList"},"_position":{"x":360.6637,"y":1617.808},"$type":"NodeCanvas.BehaviourTrees.Interruptor","$id":"24"},{"monitorMode":1,"_position":{"x":-312.8632,"y":1265.204},"$type":"NodeCanvas.BehaviourTrees.Monitor","$id":"25"},{"_position":{"x":-309.8632,"y":1368.204},"$type":"NodeCanvas.BehaviourTrees.Inverter","$id":"26"},{"_position":{"x":-307.8632,"y":1422.204},"$type":"NodeCanvas.BehaviourTrees.Selector","$id":"27"},{"_condition":{"castType":{"_value":4},"length":{"_value":20.0},"direction":{"_value":{"z":1.0}},"offset":{},"ignoreLayers":{"_value":{"value":8}},"width":{"_value":3.0},"size":{},"rotation":{},"drawGizmos":true,"outputHit":{"_name":"_observerHit"},"overrideAgent":{"_type":"UnityEngine.Transform","_name":"camera","_targetVariableID":"e1cfd0be-7f55-420d-bdd8-e72531fc61ba"},"$type":"Reset.CheckGenericObserver"},"_position":{"x":-621.8632,"y":1503.204},"$type":"NodeCanvas.BehaviourTrees.WaitUntil","$id":"28"},{"_position":{"x":-659.8632,"y":1633.204},"$type":"NodeCanvas.BehaviourTrees.Sequencer","$id":"29"},{"_action":{"boolVariable":{"_name":"_castHit"},"setTo":0,"$type":"NodeCanvas.Tasks.Actions.SetBoolean"},"_position":{"x":-914.8632,"y":1736.204},"$type":"NodeCanvas.BehaviourTrees.ActionNode","$id":"30"},{"_condition":{"actionName":{"_value":"Grapple"},"actionPhase":{"_value":3},"$type":"NodeCanvas.Tasks.Conditions.CheckInput"},"_position":{"x":-726.2145,"y":1735.09},"$type":"NodeCanvas.BehaviourTrees.ConditionNode","$id":"31"},{"_action":{"boolVariable":{"_name":"_castHit"},"$type":"NodeCanvas.Tasks.Actions.SetBoolean"},"_position":{"x":-505.8632,"y":1739.204},"$type":"NodeCanvas.BehaviourTrees.ActionNode","$id":"32"},{"policy":1,"dynamic":true,"_position":{"x":-305.8632,"y":1532.204},"$type":"NodeCanvas.BehaviourTrees.Parallel","$id":"33"},{"repeaterMode":2,"repeatTimes":{"_value":1},"_position":{"x":-311.8632,"y":1674.204},"$type":"NodeCanvas.BehaviourTrees.Repeater","$id":"34"},{"_action":{"actionName":{"_value":"Move"},"outputTo":{"_name":"_test"},"$type":"NodeCanvas.Tasks.Actions.CheckInputValue`1[[UnityEngine.Vector2, + UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]"},"_position":{"x":-326.9252,"y":1793.079},"$type":"NodeCanvas.BehaviourTrees.ActionNode","$id":"35"},{"_condition":{"actionName":{"_value":"Grapple"},"actionPhase":{"_value":4},"$type":"NodeCanvas.Tasks.Conditions.CheckInput"},"_position":{"x":-159.1308,"y":1664.066},"$type":"NodeCanvas.BehaviourTrees.ConditionNode","$id":"36"},{"_condition":{"valueA":{"_name":"_lookDir"},"checkType":1,"valueB":{"_value":0.2},"differenceThreshold":0.1,"$type":"NodeCanvas.Tasks.Conditions.CheckFloat"},"_position":{"x":1122.257,"y":1247.687},"$type":"NodeCanvas.BehaviourTrees.BinarySelector","$id":"37"},{"_action":{"$type":"NodeCanvas.Tasks.Actions.ChangeCameraSettings"},"_position":{"x":1046.0,"y":1377.0},"$type":"NodeCanvas.BehaviourTrees.ActionNode","$id":"38"},{"_position":{"x":1242.0,"y":1377.0},"$type":"NodeCanvas.BehaviourTrees.ActionNode","$id":"39"}],"connections":[{"_sourceNode":{"$ref":"0"},"_targetNode":{"$ref":"1"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"0"},"_targetNode":{"$ref":"3"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"0"},"_targetNode":{"$ref":"4"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"0"},"_targetNode":{"$ref":"5"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"0"},"_targetNode":{"$ref":"19"},"_isDisabled":true,"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"0"},"_targetNode":{"$ref":"22"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"1"},"_targetNode":{"$ref":"2"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"5"},"_targetNode":{"$ref":"6"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"5"},"_targetNode":{"$ref":"10"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"6"},"_targetNode":{"$ref":"7"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"7"},"_targetNode":{"$ref":"8"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"7"},"_targetNode":{"$ref":"9"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"10"},"_targetNode":{"$ref":"11"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"10"},"_targetNode":{"$ref":"14"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"10"},"_targetNode":{"$ref":"18"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"11"},"_targetNode":{"$ref":"12"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"12"},"_targetNode":{"$ref":"13"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"14"},"_targetNode":{"$ref":"15"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"15"},"_targetNode":{"$ref":"16"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"16"},"_targetNode":{"$ref":"17"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"19"},"_targetNode":{"$ref":"20"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"20"},"_targetNode":{"$ref":"21"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"23"},"_targetNode":{"$ref":"24"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"25"},"_targetNode":{"$ref":"26"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"26"},"_targetNode":{"$ref":"27"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"27"},"_targetNode":{"$ref":"28"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"27"},"_targetNode":{"$ref":"33"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"28"},"_targetNode":{"$ref":"29"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"29"},"_targetNode":{"$ref":"30"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"29"},"_targetNode":{"$ref":"31"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"29"},"_targetNode":{"$ref":"32"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"33"},"_targetNode":{"$ref":"34"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"33"},"_targetNode":{"$ref":"36"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"34"},"_targetNode":{"$ref":"35"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"37"},"_targetNode":{"$ref":"38"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"},{"_sourceNode":{"$ref":"37"},"_targetNode":{"$ref":"39"},"$type":"NodeCanvas.BehaviourTrees.BTConnection"}],"canvasGroups":[],"localBlackboard":{"_variables":{"camera":{"_name":"camera","_id":"e1cfd0be-7f55-420d-bdd8-e72531fc61ba","_isPublic":true,"$type":"NodeCanvas.Framework.Variable`1[[UnityEngine.Transform, + UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]"}}},"derivedData":{"repeat":true,"$type":"NodeCanvas.BehaviourTrees.BehaviourTree+DerivedSerializationData"}}' _objectReferences: [] _graphSource: _version: 3.31 _category: _comments: - _translation: {x: -285, y: -93} + _translation: {x: 162, y: -631} _zoomFactor: 1 _haltSerialization: 0 _externalSerializationFile: {fileID: 0} From c60a16729d4cec81cf338ae8c92354186b5252f5 Mon Sep 17 00:00:00 2001 From: Chris Date: Tue, 5 Aug 2025 00:35:16 -0400 Subject: [PATCH 04/18] added: target offset to camera settings controls. refactored settings code --- .../Core/Graph Tasks/ChangeCameraSettings.cs | 241 +++++++----------- .../Scripts/Player/CameraSettingsProcessor.cs | 8 +- 2 files changed, 105 insertions(+), 144 deletions(-) diff --git a/Assets/Scripts/Core/Graph Tasks/ChangeCameraSettings.cs b/Assets/Scripts/Core/Graph Tasks/ChangeCameraSettings.cs index 7ed0929..73f8256 100644 --- a/Assets/Scripts/Core/Graph Tasks/ChangeCameraSettings.cs +++ b/Assets/Scripts/Core/Graph Tasks/ChangeCameraSettings.cs @@ -5,7 +5,7 @@ using UnityEditor; using UnityEngine; // Individual bool setting for each ring. Three of these will be used. -public struct OrbitalFollowValueGroup{ +public struct OrbitalFollowValueGroup : ICameraValueGroup{ public string label; public CameraSettingsToggle changeHeight; @@ -38,7 +38,11 @@ public enum CameraSettingsToggle{ ResetValue, } -public struct Vector3CameraValueGroup{ +public interface ICameraValueGroup{ + +} + +public struct Vector3CameraValueGroup : ICameraValueGroup{ public string label; public Vector3 newValue; @@ -56,7 +60,7 @@ public struct Vector3CameraValueGroup{ } } -public struct Vector2CameraValueGroup{ +public struct Vector2CameraValueGroup : ICameraValueGroup{ public string label; public Vector2 newValue; @@ -72,7 +76,7 @@ public struct Vector2CameraValueGroup{ } } -public struct FloatCameraValueGroup{ +public struct FloatCameraValueGroup : ICameraValueGroup{ public string label; public float value; @@ -328,7 +332,9 @@ namespace NodeCanvas.Tasks.Actions { public FloatCameraValueGroup fieldOfView = new (newLabel: "FOV"); [ParadoxNotion.Design.Header("Orbit Follow Ring Settings"), Space (5)] - public Vector3CameraValueGroup orbitPositionDamping = new(newLabel: "Position Damping"); + public Vector3CameraValueGroup orbitTargetOffset = new(newLabel: "Target Offset"); + [Space(5)]public Vector3CameraValueGroup orbitPositionDamping = new(newLabel: "Position Damping"); + public OrbitalFollowValueGroup orbitFollowTop = new (newLabel: "Top"); public OrbitalFollowValueGroup orbitFollowCenter = new (newLabel: "Center"); public OrbitalFollowValueGroup orbitFollowBottom = new (newLabel: "Bottom"); @@ -349,150 +355,101 @@ namespace NodeCanvas.Tasks.Actions { //Call EndAction() to mark the action as finished, either in success or failure. //EndAction can be called from anywhere. protected override void OnExecute(){ - // Switch case farm for checking if values should be changed and what to - // Field of view - switch (fieldOfView.changeValue) { - case CameraSettingsToggle.NewValue: - CameraSettingsProcessor.values.mainFieldOfView.targetValue = fieldOfView.value; - break; - case CameraSettingsToggle.ResetValue: - CameraSettingsProcessor.values.mainFieldOfView.Reset(); - break; - } + UpdateOrbitFollowValue(orbitFollowTop, ref CameraSettingsProcessor.values.orbitFollowTopHeight, ref CameraSettingsProcessor.values.orbitFollowTopRadius); + UpdateOrbitFollowValue(orbitFollowCenter, ref CameraSettingsProcessor.values.orbitFollowCenterHeight, ref CameraSettingsProcessor.values.orbitFollowCenterRadius); + UpdateOrbitFollowValue(orbitFollowBottom, ref CameraSettingsProcessor.values.orbitFollowBottomHeight, ref CameraSettingsProcessor.values.orbitFollowBottomRadius); - // Orbit follow rings - switch (orbitFollowTop.changeHeight) { - case CameraSettingsToggle.NewValue: - CameraSettingsProcessor.values.orbitFollowTopHeight.targetValue = orbitFollowTop.height; - break; - case CameraSettingsToggle.ResetValue: - CameraSettingsProcessor.values.orbitFollowTopHeight.Reset(); - break; - } + UpdateVector3Value(cameraOffset, ref CameraSettingsProcessor.values.cameraOffsetOffset); - switch (orbitFollowTop.changeRadius) { - case CameraSettingsToggle.NewValue: - CameraSettingsProcessor.values.orbitFollowTopRadius.targetValue = orbitFollowTop.radius; - break; - case CameraSettingsToggle.ResetValue: - CameraSettingsProcessor.values.orbitFollowTopRadius.Reset(); - break; - } + UpdateVector3Value(orbitPositionDamping, ref CameraSettingsProcessor.values.orbitPositionDamping); + // UpdateVector3Value(orbitTargetOffset, ref CameraSettingsProcessor.values.orbitTargetOffset); - switch (orbitFollowCenter.changeHeight) { - case CameraSettingsToggle.NewValue: - CameraSettingsProcessor.values.orbitFollowCenterHeight.targetValue = orbitFollowCenter.height; - break; - case CameraSettingsToggle.ResetValue: - CameraSettingsProcessor.values.orbitFollowCenterHeight.Reset(); - break; - } - - switch (orbitFollowCenter.changeRadius) { - case CameraSettingsToggle.NewValue: - CameraSettingsProcessor.values.orbitFollowCenterRadius.targetValue = orbitFollowCenter.radius; - break; - case CameraSettingsToggle.ResetValue: - CameraSettingsProcessor.values.orbitFollowCenterRadius.Reset(); - break; - } - - switch (orbitFollowBottom.changeHeight) { - case CameraSettingsToggle.NewValue: - CameraSettingsProcessor.values.orbitFollowBottomHeight.targetValue = orbitFollowBottom.height; - break; - case CameraSettingsToggle.ResetValue: - CameraSettingsProcessor.values.orbitFollowBottomHeight.Reset(); - break; - } - - switch (orbitFollowBottom.changeRadius) { - case CameraSettingsToggle.NewValue: - CameraSettingsProcessor.values.orbitFollowBottomRadius.targetValue = orbitFollowBottom.radius; - break; - case CameraSettingsToggle.ResetValue: - CameraSettingsProcessor.values.orbitFollowBottomRadius.Reset(); - break; - } - - // Screen Position - switch (screenPosition.changeX) { - case CameraSettingsToggle.NewValue: - CameraSettingsProcessor.values.rotationComposerScreenPos.targetValue.x = screenPosition.newValue.x; - break; - case CameraSettingsToggle.ResetValue: - CameraSettingsProcessor.values.rotationComposerScreenPos.targetValue.x = CameraSettingsProcessor.values.rotationComposerScreenPos.originalValue.x; - break; - } - - switch (screenPosition.changeY) { - case CameraSettingsToggle.NewValue: - CameraSettingsProcessor.values.rotationComposerScreenPos.targetValue.y = screenPosition.newValue.y; - break; - case CameraSettingsToggle.ResetValue: - CameraSettingsProcessor.values.rotationComposerScreenPos.targetValue.y = CameraSettingsProcessor.values.rotationComposerScreenPos.originalValue.y; - break; - } - - // Camera Offset - switch (cameraOffset.changeX) { - case CameraSettingsToggle.NewValue: - CameraSettingsProcessor.values.cameraOffsetOffset.targetValue.x = cameraOffset.newValue.x; - break; - case CameraSettingsToggle.ResetValue: - CameraSettingsProcessor.values.cameraOffsetOffset.targetValue.x = CameraSettingsProcessor.values.cameraOffsetOffset.originalValue.x; - break; - } - - switch (cameraOffset.changeY) { - case CameraSettingsToggle.NewValue: - CameraSettingsProcessor.values.cameraOffsetOffset.targetValue.y = cameraOffset.newValue.y; - break; - case CameraSettingsToggle.ResetValue: - CameraSettingsProcessor.values.cameraOffsetOffset.targetValue.y = CameraSettingsProcessor.values.cameraOffsetOffset.originalValue.y; - break; - } - - switch (cameraOffset.changeZ) { - case CameraSettingsToggle.NewValue: - CameraSettingsProcessor.values.cameraOffsetOffset.targetValue.z = cameraOffset.newValue.z; - break; - case CameraSettingsToggle.ResetValue: - CameraSettingsProcessor.values.cameraOffsetOffset.targetValue.z = CameraSettingsProcessor.values.cameraOffsetOffset.originalValue.z; - break; - } - - // Position Damping - switch (orbitPositionDamping.changeX) { - case CameraSettingsToggle.NewValue: - CameraSettingsProcessor.values.orbitPositionDamping.targetValue.x = orbitPositionDamping.newValue.x; - break; - case CameraSettingsToggle.ResetValue: - CameraSettingsProcessor.values.orbitPositionDamping.targetValue.x = CameraSettingsProcessor.values.orbitPositionDamping.originalValue.x; - break; - } - - switch (orbitPositionDamping.changeY) { - case CameraSettingsToggle.NewValue: - CameraSettingsProcessor.values.orbitPositionDamping.targetValue.y = orbitPositionDamping.newValue.y; - break; - case CameraSettingsToggle.ResetValue: - CameraSettingsProcessor.values.orbitPositionDamping.targetValue.y = CameraSettingsProcessor.values.orbitPositionDamping.originalValue.y; - break; - } - - switch (orbitPositionDamping.changeZ) { - case CameraSettingsToggle.NewValue: - CameraSettingsProcessor.values.orbitPositionDamping.targetValue.z = orbitPositionDamping.newValue.z; - break; - case CameraSettingsToggle.ResetValue: - CameraSettingsProcessor.values.orbitPositionDamping.targetValue.z = CameraSettingsProcessor.values.orbitPositionDamping.originalValue.z; - break; - } + UpdateVector2Value(screenPosition, ref CameraSettingsProcessor.values.rotationComposerScreenPos); + UpdateFloatValue(fieldOfView, ref CameraSettingsProcessor.values.mainFieldOfView); EndAction(true); } + public void UpdateVector3Value(Vector3CameraValueGroup valueGroup, ref CameraSettingSingleValue targetProperty){ + switch (valueGroup.changeX) { + case CameraSettingsToggle.NewValue: + targetProperty.targetValue.x = valueGroup.newValue.x; + break; + case CameraSettingsToggle.ResetValue: + targetProperty.targetValue.x = targetProperty.originalValue.x; + break; + } + + switch (valueGroup.changeY) { + case CameraSettingsToggle.NewValue: + targetProperty.targetValue.y = valueGroup.newValue.y; + break; + case CameraSettingsToggle.ResetValue: + targetProperty.targetValue.y = targetProperty.originalValue.y; + break; + } + + switch (valueGroup.changeZ) { + case CameraSettingsToggle.NewValue: + targetProperty.targetValue.z = valueGroup.newValue.z; + break; + case CameraSettingsToggle.ResetValue: + targetProperty.targetValue.z = targetProperty.originalValue.z; + break; + } + } + + public void UpdateVector2Value(Vector2CameraValueGroup valueGroup, ref CameraSettingSingleValue targetProperty){ + switch (valueGroup.changeX) { + case CameraSettingsToggle.NewValue: + targetProperty.targetValue.x = valueGroup.newValue.x; + break; + case CameraSettingsToggle.ResetValue: + targetProperty.targetValue.x = targetProperty.originalValue.x; + break; + } + + switch (valueGroup.changeY) { + case CameraSettingsToggle.NewValue: + targetProperty.targetValue.y = valueGroup.newValue.y; + break; + case CameraSettingsToggle.ResetValue: + targetProperty.targetValue.y = targetProperty.originalValue.y; + break; + } + } + + public void UpdateOrbitFollowValue(OrbitalFollowValueGroup valueGroup, ref CameraSettingSingleValue targetHeight, ref CameraSettingSingleValue targetRadius){ + switch (valueGroup.changeHeight) { + case CameraSettingsToggle.NewValue: + targetHeight.targetValue = valueGroup.height; + break; + case CameraSettingsToggle.ResetValue: + targetHeight.targetValue = targetHeight.originalValue; + break; + } + + switch (valueGroup.changeRadius) { + case CameraSettingsToggle.NewValue: + targetRadius.targetValue = valueGroup.radius; + break; + case CameraSettingsToggle.ResetValue: + targetRadius.targetValue = targetRadius.originalValue; + break; + } + } + + public void UpdateFloatValue(FloatCameraValueGroup valueGroup, ref CameraSettingSingleValue targetProperty){ + switch (valueGroup.changeValue) { + case CameraSettingsToggle.NewValue: + targetProperty.targetValue = valueGroup.value; + break; + case CameraSettingsToggle.ResetValue: + targetProperty.targetValue = targetProperty.originalValue; + break; + } + } + //Called once per frame while the action is active. protected override void OnUpdate() { diff --git a/Assets/Scripts/Player/CameraSettingsProcessor.cs b/Assets/Scripts/Player/CameraSettingsProcessor.cs index 47670cf..3c1a697 100644 --- a/Assets/Scripts/Player/CameraSettingsProcessor.cs +++ b/Assets/Scripts/Player/CameraSettingsProcessor.cs @@ -30,6 +30,7 @@ public struct CameraSettingValues{ public CameraSettingSingleValue mainFieldOfView; public CameraSettingSingleValue orbitPositionDamping; + public CameraSettingSingleValue orbitTargetOffset; public CameraSettingSingleValue orbitFollowTopHeight; public CameraSettingSingleValue orbitFollowTopRadius; @@ -46,6 +47,7 @@ public struct CameraSettingValues{ mainFieldOfView = new CameraSettingSingleValue(defaultSmoothing); orbitPositionDamping = new CameraSettingSingleValue(defaultSmoothing); + orbitTargetOffset = new CameraSettingSingleValue(defaultSmoothing); orbitFollowTopHeight = new CameraSettingSingleValue(defaultSmoothing); orbitFollowTopRadius = new CameraSettingSingleValue(defaultSmoothing); @@ -106,6 +108,10 @@ public class CameraSettingsProcessor : MonoBehaviour{ values.mainFieldOfView.targetValue, ref values.mainFieldOfView.velocityRef, values.mainFieldOfView.smoothing); + orbit.TargetOffset = Vector3.SmoothDamp(orbit.TargetOffset, + values.orbitTargetOffset.targetValue, ref values.orbitTargetOffset.velocityRefV3, + values.orbitTargetOffset.smoothing); + orbit.TrackerSettings.PositionDamping = Vector3.SmoothDamp(orbit.TrackerSettings.PositionDamping, values.orbitPositionDamping.targetValue, ref values.orbitPositionDamping.velocityRefV3, values.orbitPositionDamping.smoothing); @@ -122,8 +128,6 @@ public class CameraSettingsProcessor : MonoBehaviour{ values.orbitFollowCenterHeight.targetValue, ref values.orbitFollowCenterHeight.velocityRef, values.orbitFollowCenterHeight.smoothing); - - orbit.Orbits.Center.Radius = Mathf.SmoothDamp(orbit.Orbits.Center.Radius, values.orbitFollowCenterRadius.targetValue, ref values.orbitFollowCenterRadius.velocityRef, values.orbitFollowCenterRadius.smoothing); From 64fe9eb811441320aaaa880c70708a2f0771c2e0 Mon Sep 17 00:00:00 2001 From: Chris Date: Tue, 5 Aug 2025 16:38:29 -0400 Subject: [PATCH 05/18] changed: rebuilt lock-on system to accomodate arbitrary targets --- Assets/Scripts/Core/LockOnManager.cs | 209 +++++++++++++++++++++------ 1 file changed, 161 insertions(+), 48 deletions(-) diff --git a/Assets/Scripts/Core/LockOnManager.cs b/Assets/Scripts/Core/LockOnManager.cs index e8a0717..b565226 100644 --- a/Assets/Scripts/Core/LockOnManager.cs +++ b/Assets/Scripts/Core/LockOnManager.cs @@ -5,91 +5,187 @@ using System.Numerics; using Sirenix.OdinInspector; using Unity.Cinemachine; using UnityEngine; +using UnityEngine.Serialization; using UnityEngine.UIElements; using Vector2 = UnityEngine.Vector2; using Vector3 = UnityEngine.Vector3; public class LockOnManager : MonoBehaviour{ + class ReferencedTarget{ + public GameObject gameObject; + public float targetWeight; + public float refVelocity; + public CinemachineTargetGroup.Target cinemachineTarget; + } private CinemachineTargetGroup.Target playerTarget; // Lock On settings - [Space(5)] - public float lockOnRange = 40f; + [Space(5)] public float lockOnRange = 40f; public float lockOnMaxAngle = 70f; - + [Range(0,1)] public float mainTargetWeight = .15f; + [FormerlySerializedAs("smoothing")] public float smoothTime = 1f; + // Lock On Tracking - [Space(10)] public GameObject lockonGameObject; // Needed because nulling the Target below doesn't actually empty it out + [Space(10)] + public GameObject lockonGameObject; // Needed because nulling the Target below doesn't actually empty it out + + [ShowInInspector] + ReferencedTarget mainTarget; + + [ShowInInspector] + List activeTargets = new List(); + [ReadOnly] public CinemachineTargetGroup.Target lockonTarget; public CinemachineTargetGroup targetGroup; - - [Space(5)] - public List lockOnTargets = new List(); + + [FormerlySerializedAs("lockOnTargets")] [Space(5)] + public List acceptedTargets = new List(); // UI - [ShowInInspector] - public UIDocument lockOnDocument; + [ShowInInspector] public UIDocument lockOnDocument; private Label elementLabelName; - private VisualElement elementRoot; - + private VisualElement elementRoot; + // Start is called once before the first execution of Update after the MonoBehaviour is created void Start(){ // Save the player target object to track later playerTarget = targetGroup.Targets[0]; - + // Quick check for things in lock-on target that aren't lock-onable if (lockonGameObject != null && lockonTarget.Object.GetComponent() == null) { Debug.LogError($"Game Object {lockonTarget.Object.name} does not implement the ILockOnTarget interface!"); } - + elementRoot = lockOnDocument.rootVisualElement.Query("LockOnGroup"); elementLabelName = lockOnDocument.rootVisualElement.Query