Compare commits
10 Commits
66ab541897
...
524fa610f2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
524fa610f2 | ||
|
|
7355d0c0fa | ||
|
|
82308c59c0 | ||
|
|
a9f51b62c0 | ||
|
|
8652a2d2d8 | ||
|
|
465ce533ab | ||
|
|
6c3c25f986 | ||
|
|
5f907ee0c6 | ||
|
|
126aacf9d8 | ||
|
|
5b61d042b1 |
File diff suppressed because one or more lines are too long
@@ -12,22 +12,22 @@ MonoBehaviour:
|
||||
m_Script: {fileID: 11500000, guid: f945e777233a59f4aba40aeca29093a6, type: 3}
|
||||
m_Name: PlayerLocomotionFSM
|
||||
m_EditorClassIdentifier:
|
||||
_serializedGraph: '{"type":"NodeCanvas.StateMachines.FSM","nodes":[{"_position":{"x":253.0,"y":608.0},"$type":"NodeCanvas.StateMachines.EmptyState","$id":"0"},{"_onEnterList":{"executionMode":1,"actions":[{"valueA":{"_name":"facingDirection","_targetVariableID":"c713d622-aafb-43e7-ae0e-ac0b86a85a37"},"valueB":{"_value":1},"$type":"NodeCanvas.Tasks.Actions.SetVariable`1[[Reset.Player.Movement.PlayerFacingDirection,
|
||||
Core, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]"}]},"_onUpdateList":{"executionMode":1,"actions":[{"moveSpeed":{"_value":12.0},"moveDirection":{"_name":"groundMoveDirection","_targetVariableID":"16ae5ce4-097a-4c21-94a5-2c5d9ce73eb6"},"$type":"NodeCanvas.Tasks.Actions.CalculateGroundedLocomotion"},{"valueA":{"_name":"rotationSpeed","_targetVariableID":"d888730f-97df-4288-bb99-1f6c8a34a7c5"},"valueB":{"_value":10.0},"$type":"NodeCanvas.Tasks.Actions.SetFloat"}]},"_onExitList":{"executionMode":1,"actions":[]},"foldEnter":true,"foldUpdate":true,"_color":{"r":1.0,"g":0.42,"b":0.32,"a":1.0},"_position":{"x":535.0,"y":768.0},"$type":"NodeCanvas.StateMachines.SuperActionState","$id":"1"},{"_actionList":{"executionMode":1,"actions":[{"moveSpeed":{"_value":30.0},"moveDirection":{"_name":"groundMoveDirection","_targetVariableID":"16ae5ce4-097a-4c21-94a5-2c5d9ce73eb6"},"$type":"NodeCanvas.Tasks.Actions.CalculateGroundedLocomotion"},{"valueA":{"_name":"rotationSpeed","_targetVariableID":"d888730f-97df-4288-bb99-1f6c8a34a7c5"},"valueB":{"_value":1.0},"$type":"NodeCanvas.Tasks.Actions.SetFloat"},{"valueA":{"_name":"facingDirection","_targetVariableID":"c713d622-aafb-43e7-ae0e-ac0b86a85a37"},"valueB":{"_value":2},"$type":"NodeCanvas.Tasks.Actions.SetVariable`1[[Reset.Player.Movement.PlayerFacingDirection,
|
||||
Core, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]"}]},"_repeatStateActions":true,"_color":{"r":1.0,"g":0.42,"b":0.32,"a":1.0},"_position":{"x":916.0607,"y":852.7302},"$type":"NodeCanvas.StateMachines.ActionState","$id":"2"},{"_actionList":{"executionMode":1,"actions":[{"moveSpeed":{"_value":20.0},"moveDirection":{"_name":"groundMoveDirection","_targetVariableID":"16ae5ce4-097a-4c21-94a5-2c5d9ce73eb6"},"$type":"NodeCanvas.Tasks.Actions.CalculateGroundedLocomotion"},{"valueA":{"_name":"rotationSpeed","_targetVariableID":"d888730f-97df-4288-bb99-1f6c8a34a7c5"},"valueB":{"_value":2.0},"$type":"NodeCanvas.Tasks.Actions.SetFloat"}]},"_repeatStateActions":true,"_color":{"r":1.0,"g":0.42,"b":0.32,"a":1.0},"_position":{"x":1161.288,"y":522.152},"$type":"NodeCanvas.StateMachines.ActionState","$id":"3"},{"_actionList":{"executionMode":1,"actions":[{"moveSpeed":{"_value":12.0},"moveDirection":{"_name":"groundMoveDirection","_targetVariableID":"16ae5ce4-097a-4c21-94a5-2c5d9ce73eb6"},"$type":"NodeCanvas.Tasks.Actions.CalculateGroundedLocomotion"},{"valueA":{"_name":"rotationSpeed","_targetVariableID":"d888730f-97df-4288-bb99-1f6c8a34a7c5"},"valueB":{"_value":10.0},"$type":"NodeCanvas.Tasks.Actions.SetFloat"},{"valueA":{"_name":"facingDirection","_targetVariableID":"c713d622-aafb-43e7-ae0e-ac0b86a85a37"},"valueB":{"_value":1},"$type":"NodeCanvas.Tasks.Actions.SetVariable`1[[Reset.Player.Movement.PlayerFacingDirection,
|
||||
Core, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]"}]},"_repeatStateActions":true,"_color":{"r":1.0,"g":0.42,"b":0.32,"a":1.0},"_position":{"x":389.9924,"y":1029.762},"$type":"NodeCanvas.StateMachines.ActionState"},{"_position":{"x":218.6569,"y":475.1322},"$type":"NodeCanvas.StateMachines.AnyState","$id":"5"},{"_actionList":{"executionMode":1,"actions":[{"moveSpeed":{"_value":5.0},"moveDirection":{"_name":"groundMoveDirection","_targetVariableID":"16ae5ce4-097a-4c21-94a5-2c5d9ce73eb6"},"$type":"NodeCanvas.Tasks.Actions.CalculateGroundedLocomotion"}]},"_repeatStateActions":true,"_color":{"r":1.0,"g":0.42,"b":0.32,"a":1.0},"_position":{"x":602.0,"y":269.0},"$type":"NodeCanvas.StateMachines.ActionState","$id":"6"},{"_actionList":{"executionMode":1,"actions":[{"moveSpeed":{},"moveDirection":{"_name":"groundMoveDirection","_targetVariableID":"16ae5ce4-097a-4c21-94a5-2c5d9ce73eb6"},"$type":"NodeCanvas.Tasks.Actions.CalculateGroundedLocomotion"}]},"_repeatStateActions":true,"_color":{"r":1.0,"g":0.42,"b":0.32,"a":1.0},"_position":{"x":402.0,"y":177.0},"$type":"NodeCanvas.StateMachines.ActionState","$id":"7"}],"connections":[{"_condition":{"valueA":{"_name":"isGrounded","_targetVariableID":"321e55c7-f93e-4667-a0dc-559eb61c6898"},"valueB":{"_value":true},"$type":"NodeCanvas.Tasks.Conditions.CheckBoolean"},"_sourceNode":{"$ref":"0"},"_targetNode":{"$ref":"1"},"$type":"NodeCanvas.StateMachines.FSMConnection"},{"_condition":{"actionName":{"_value":"Sprint"},"actionPhase":{"_value":3},"$type":"NodeCanvas.Tasks.Conditions.CheckInput"},"_sourceNode":{"$ref":"1"},"_targetNode":{"$ref":"2"},"$type":"NodeCanvas.StateMachines.FSMConnection"},{"_condition":{"timeout":{"_value":0.1},"$type":"NodeCanvas.Tasks.Conditions.Timeout"},"_sourceNode":{"$ref":"2"},"_targetNode":{"$ref":"3"},"$type":"NodeCanvas.StateMachines.FSMConnection"},{"_condition":{"checkAgainst":2,"checkAgainstValue":{"_value":{"z":1.0}},"desiredValue":{"_value":1.0},"tolerance":{"_value":0.32},"considerCameraRotation":{},"negate":{},"$type":"NodeCanvas.Tasks.Conditions.GetMovementInputDotProduct"},"_sourceNode":{"$ref":"3"},"_targetNode":{"$ref":"1"},"$type":"NodeCanvas.StateMachines.FSMConnection"},{"_condition":{"valueA":{"_name":"isGrounded","_targetVariableID":"321e55c7-f93e-4667-a0dc-559eb61c6898"},"valueB":{},"$type":"NodeCanvas.Tasks.Conditions.CheckBoolean"},"_sourceNode":{"$ref":"5"},"_targetNode":{"$ref":"0"},"$type":"NodeCanvas.StateMachines.FSMConnection"},{"_condition":{"eventName":{"_value":"Grapple
|
||||
Aimed"},"$type":"NodeCanvas.Tasks.Conditions.CheckEvent"},"_sourceNode":{"$ref":"5"},"_targetNode":{"$ref":"6"},"$type":"NodeCanvas.StateMachines.FSMConnection"},{"_condition":{"eventName":{"_value":"Grapple
|
||||
Confirmed"},"$type":"NodeCanvas.Tasks.Conditions.CheckEvent"},"_sourceNode":{"$ref":"5"},"_targetNode":{"$ref":"7"},"$type":"NodeCanvas.StateMachines.FSMConnection"}],"canvasGroups":[],"localBlackboard":{"_variables":{"isGrounded":{"_propertyPath":"UnityEngine.CharacterController.isGrounded","_name":"isGrounded","_id":"321e55c7-f93e-4667-a0dc-559eb61c6898","$type":"NodeCanvas.Framework.Variable`1[[System.Boolean,
|
||||
_serializedGraph: '{"type":"NodeCanvas.StateMachines.FSM","nodes":[{"_position":{"x":253.0,"y":606.9789},"$type":"NodeCanvas.StateMachines.EmptyState","$id":"0"},{"_onEnterList":{"executionMode":1,"actions":[{"valueA":{"_name":"facingDirection","_targetVariableID":"c713d622-aafb-43e7-ae0e-ac0b86a85a37"},"valueB":{"_value":1},"$type":"NodeCanvas.Tasks.Actions.SetVariable`1[[Reset.Movement.PlayerFacingDirection,
|
||||
Core, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]"}]},"_onUpdateList":{"executionMode":1,"actions":[{"moveSpeed":{"_value":12.0},"moveDirection":{"_name":"groundMoveDirection","_targetVariableID":"16ae5ce4-097a-4c21-94a5-2c5d9ce73eb6"},"$type":"NodeCanvas.Tasks.Actions.CalculateGroundedLocomotion"},{"valueA":{"_name":"rotationSpeed","_targetVariableID":"d888730f-97df-4288-bb99-1f6c8a34a7c5"},"valueB":{"_value":10.0},"$type":"NodeCanvas.Tasks.Actions.SetFloat"}]},"_onExitList":{"executionMode":1,"actions":[]},"foldEnter":true,"foldUpdate":true,"_color":{"r":1.0,"g":0.42,"b":0.32,"a":1.0},"_position":{"x":535.0,"y":768.0},"$type":"NodeCanvas.StateMachines.SuperActionState","$id":"1"},{"_actionList":{"executionMode":1,"actions":[{"moveSpeed":{"_value":30.0},"moveDirection":{"_name":"groundMoveDirection","_targetVariableID":"16ae5ce4-097a-4c21-94a5-2c5d9ce73eb6"},"$type":"NodeCanvas.Tasks.Actions.CalculateGroundedLocomotion"},{"valueA":{"_name":"rotationSpeed","_targetVariableID":"d888730f-97df-4288-bb99-1f6c8a34a7c5"},"valueB":{"_value":1.0},"$type":"NodeCanvas.Tasks.Actions.SetFloat"},{"valueA":{"_name":"facingDirection","_targetVariableID":"c713d622-aafb-43e7-ae0e-ac0b86a85a37"},"valueB":{"_value":2},"$type":"NodeCanvas.Tasks.Actions.SetVariable`1[[Reset.Movement.PlayerFacingDirection,
|
||||
Core, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]"}]},"_repeatStateActions":true,"_color":{"r":1.0,"g":0.42,"b":0.32,"a":1.0},"_position":{"x":917.0839,"y":852.7302},"$type":"NodeCanvas.StateMachines.ActionState","$id":"2"},{"_actionList":{"executionMode":1,"actions":[{"moveSpeed":{"_value":20.0},"moveDirection":{"_name":"groundMoveDirection","_targetVariableID":"16ae5ce4-097a-4c21-94a5-2c5d9ce73eb6"},"$type":"NodeCanvas.Tasks.Actions.CalculateGroundedLocomotion"},{"valueA":{"_name":"rotationSpeed","_targetVariableID":"d888730f-97df-4288-bb99-1f6c8a34a7c5"},"valueB":{"_value":2.0},"$type":"NodeCanvas.Tasks.Actions.SetFloat"}]},"_repeatStateActions":true,"_color":{"r":1.0,"g":0.42,"b":0.32,"a":1.0},"_position":{"x":1161.288,"y":522.152},"$type":"NodeCanvas.StateMachines.ActionState","$id":"3"},{"_actionList":{"executionMode":1,"actions":[]},"_color":{"r":1.0,"g":0.42,"b":0.32,"a":1.0},"_position":{"x":327.7592,"y":812.7609},"$type":"NodeCanvas.StateMachines.ActionState"},{"_actionList":{"executionMode":1,"actions":[{"moveSpeed":{"_value":12.0},"moveDirection":{"_name":"groundMoveDirection","_targetVariableID":"16ae5ce4-097a-4c21-94a5-2c5d9ce73eb6"},"$type":"NodeCanvas.Tasks.Actions.CalculateGroundedLocomotion"},{"valueA":{"_name":"rotationSpeed","_targetVariableID":"d888730f-97df-4288-bb99-1f6c8a34a7c5"},"valueB":{"_value":10.0},"$type":"NodeCanvas.Tasks.Actions.SetFloat"},{"valueA":{"_name":"facingDirection","_targetVariableID":"c713d622-aafb-43e7-ae0e-ac0b86a85a37"},"valueB":{"_value":1},"$type":"NodeCanvas.Tasks.Actions.SetVariable`1[[Reset.Movement.PlayerFacingDirection,
|
||||
Core, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]"}]},"_repeatStateActions":true,"_color":{"r":1.0,"g":0.42,"b":0.32,"a":1.0},"_position":{"x":389.9924,"y":1029.762},"$type":"NodeCanvas.StateMachines.ActionState"},{"_position":{"x":218.6569,"y":475.1322},"$type":"NodeCanvas.StateMachines.AnyState","$id":"6"},{"_actionList":{"executionMode":1,"actions":[{"moveSpeed":{"_value":5.0},"moveDirection":{"_name":"groundMoveDirection","_targetVariableID":"16ae5ce4-097a-4c21-94a5-2c5d9ce73eb6"},"$type":"NodeCanvas.Tasks.Actions.CalculateGroundedLocomotion"}]},"_repeatStateActions":true,"_color":{"r":1.0,"g":0.42,"b":0.32,"a":1.0},"_position":{"x":602.0,"y":269.0},"$type":"NodeCanvas.StateMachines.ActionState","$id":"7"},{"_actionList":{"executionMode":1,"actions":[{"moveSpeed":{},"moveDirection":{"_name":"groundMoveDirection","_targetVariableID":"16ae5ce4-097a-4c21-94a5-2c5d9ce73eb6"},"$type":"NodeCanvas.Tasks.Actions.CalculateGroundedLocomotion"}]},"_repeatStateActions":true,"_color":{"r":1.0,"g":0.42,"b":0.32,"a":1.0},"_position":{"x":402.0,"y":177.0},"$type":"NodeCanvas.StateMachines.ActionState","$id":"8"}],"connections":[{"_condition":{"valueA":{"_name":"isGrounded","_targetVariableID":"321e55c7-f93e-4667-a0dc-559eb61c6898"},"valueB":{"_value":true},"$type":"NodeCanvas.Tasks.Conditions.CheckBoolean"},"_sourceNode":{"$ref":"0"},"_targetNode":{"$ref":"1"},"$type":"NodeCanvas.StateMachines.FSMConnection"},{"_condition":{"actionName":{"_value":"Sprint"},"actionPhase":{"_value":3},"$type":"NodeCanvas.Tasks.Conditions.CheckInput"},"_sourceNode":{"$ref":"1"},"_targetNode":{"$ref":"2"},"$type":"NodeCanvas.StateMachines.FSMConnection"},{"_condition":{"timeout":{"_value":0.1},"$type":"NodeCanvas.Tasks.Conditions.Timeout"},"_sourceNode":{"$ref":"2"},"_targetNode":{"$ref":"3"},"$type":"NodeCanvas.StateMachines.FSMConnection"},{"_condition":{"checkAgainst":2,"checkAgainstValue":{"_value":{"z":1.0}},"desiredValue":{"_value":1.0},"tolerance":{"_value":0.32},"considerCameraRotation":{},"negate":{},"$type":"NodeCanvas.Tasks.Conditions.GetMovementInputDotProduct"},"_sourceNode":{"$ref":"3"},"_targetNode":{"$ref":"1"},"$type":"NodeCanvas.StateMachines.FSMConnection"},{"_condition":{"valueA":{"_name":"isGrounded","_targetVariableID":"321e55c7-f93e-4667-a0dc-559eb61c6898"},"valueB":{},"$type":"NodeCanvas.Tasks.Conditions.CheckBoolean"},"_sourceNode":{"$ref":"6"},"_targetNode":{"$ref":"0"},"$type":"NodeCanvas.StateMachines.FSMConnection"},{"_condition":{"eventName":{"_value":"Grapple
|
||||
Aimed"},"$type":"NodeCanvas.Tasks.Conditions.CheckEvent"},"_sourceNode":{"$ref":"6"},"_targetNode":{"$ref":"7"},"$type":"NodeCanvas.StateMachines.FSMConnection"},{"_condition":{"eventName":{"_value":"Grapple
|
||||
Confirmed"},"$type":"NodeCanvas.Tasks.Conditions.CheckEvent"},"_sourceNode":{"$ref":"6"},"_targetNode":{"$ref":"8"},"$type":"NodeCanvas.StateMachines.FSMConnection"}],"canvasGroups":[],"localBlackboard":{"_variables":{"isGrounded":{"_propertyPath":"UnityEngine.CharacterController.isGrounded","_name":"isGrounded","_id":"321e55c7-f93e-4667-a0dc-559eb61c6898","$type":"NodeCanvas.Framework.Variable`1[[System.Boolean,
|
||||
mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"},"groundMoveDirection":{"_name":"groundMoveDirection","_id":"16ae5ce4-097a-4c21-94a5-2c5d9ce73eb6","_isPublic":true,"$type":"NodeCanvas.Framework.Variable`1[[UnityEngine.Vector3,
|
||||
UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]"},"rotationSpeed":{"_name":"rotationSpeed","_id":"d888730f-97df-4288-bb99-1f6c8a34a7c5","_isPublic":true,"$type":"NodeCanvas.Framework.Variable`1[[System.Single,
|
||||
mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"},"facingDirection":{"_name":"facingDirection","_id":"c713d622-aafb-43e7-ae0e-ac0b86a85a37","_isPublic":true,"$type":"NodeCanvas.Framework.Variable`1[[Reset.Player.Movement.PlayerFacingDirection,
|
||||
mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"},"facingDirection":{"_name":"facingDirection","_id":"c713d622-aafb-43e7-ae0e-ac0b86a85a37","_isPublic":true,"$type":"NodeCanvas.Framework.Variable`1[[Reset.Movement.PlayerFacingDirection,
|
||||
Core, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]"}}}}'
|
||||
_objectReferences: []
|
||||
_graphSource:
|
||||
_version: 3.31
|
||||
_category:
|
||||
_comments:
|
||||
_translation: {x: 81, y: -24}
|
||||
_zoomFactor: 0.977278
|
||||
_translation: {x: 574, y: -35}
|
||||
_zoomFactor: 0.9793777
|
||||
_haltSerialization: 0
|
||||
_externalSerializationFile: {fileID: 0}
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -1,412 +1,36 @@
|
||||
using NodeCanvas.Framework;
|
||||
using ParadoxNotion.Design;
|
||||
using Reset.Core;
|
||||
using Unity.Cinemachine;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
// Individual bool setting for each ring. Three of these will be used.
|
||||
public struct OrbitalFollowValueGroup : ICameraValueGroup{
|
||||
public string label;
|
||||
|
||||
public CameraSettingsToggle changeHeight;
|
||||
public float height;
|
||||
|
||||
public CameraSettingsToggle changeRadius;
|
||||
public float radius;
|
||||
|
||||
public OrbitalFollowValueGroup(string newLabel){
|
||||
label = newLabel;
|
||||
changeHeight = CameraSettingsToggle.NoChange;
|
||||
height = 0f;
|
||||
changeRadius = CameraSettingsToggle.NoChange;
|
||||
radius = 0f;
|
||||
}
|
||||
}
|
||||
|
||||
// Setting for any X and Y based values
|
||||
public struct CinemachineVectorValueGroup{
|
||||
public CameraSettingsToggle changeX;
|
||||
public float xValue;
|
||||
public CameraSettingsToggle changeY;
|
||||
public float yValue;
|
||||
}
|
||||
|
||||
// Enum options for individual camera settings
|
||||
public enum CameraSettingsToggle{
|
||||
NoChange,
|
||||
NewValue,
|
||||
ResetValue,
|
||||
RelativeValue, // Placeholder for using as altering existing value
|
||||
}
|
||||
|
||||
public interface ICameraValueGroup{
|
||||
|
||||
}
|
||||
|
||||
public struct Vector3CameraValueGroup : ICameraValueGroup{
|
||||
public string label;
|
||||
public Vector3 newValue;
|
||||
|
||||
public CameraSettingsToggle changeX;
|
||||
public CameraSettingsToggle changeY;
|
||||
public CameraSettingsToggle changeZ;
|
||||
|
||||
public Vector3CameraValueGroup(string newLabel){
|
||||
changeX = CameraSettingsToggle.NoChange;
|
||||
changeY = CameraSettingsToggle.NoChange;
|
||||
changeZ = CameraSettingsToggle.NoChange;
|
||||
|
||||
newValue = Vector3.zero;
|
||||
label = newLabel;
|
||||
}
|
||||
}
|
||||
|
||||
public struct Vector2CameraValueGroup : ICameraValueGroup{
|
||||
public string label;
|
||||
public Vector2 newValue;
|
||||
|
||||
public CameraSettingsToggle changeX;
|
||||
public CameraSettingsToggle changeY;
|
||||
|
||||
public Vector2CameraValueGroup(string newLabel){
|
||||
changeX = CameraSettingsToggle.NoChange;
|
||||
changeY = CameraSettingsToggle.NoChange;
|
||||
|
||||
newValue = Vector2.zero;
|
||||
label = newLabel;
|
||||
}
|
||||
}
|
||||
|
||||
public struct FloatCameraValueGroup : ICameraValueGroup{
|
||||
public string label;
|
||||
public float value;
|
||||
|
||||
public CameraSettingsToggle changeValue;
|
||||
|
||||
public FloatCameraValueGroup(string newLabel){
|
||||
label = newLabel;
|
||||
value = 0f;
|
||||
changeValue = CameraSettingsToggle.NoChange;
|
||||
}
|
||||
}
|
||||
|
||||
public struct BoolCameraValueGroup : ICameraValueGroup{
|
||||
public string label;
|
||||
public bool value;
|
||||
|
||||
public CameraSettingsToggle changeValue;
|
||||
|
||||
public BoolCameraValueGroup(string newLabel){
|
||||
label = newLabel;
|
||||
value = true;
|
||||
changeValue = CameraSettingsToggle.NoChange;
|
||||
}
|
||||
}
|
||||
|
||||
#if UNITY_EDITOR
|
||||
public class BoolCameraValueGroupDrawer : ObjectDrawer<BoolCameraValueGroup> {
|
||||
public override BoolCameraValueGroup OnGUI(GUIContent content, BoolCameraValueGroup _instance){
|
||||
// Remove label for floats
|
||||
EditorGUIUtility.labelWidth = 50;
|
||||
|
||||
// Set layout options for the label and the float fields
|
||||
GUILayoutOption[] floatOptions = new GUILayoutOption[] {
|
||||
GUILayout.Width(80.0f),
|
||||
GUILayout.MinWidth(20.0f),
|
||||
GUILayout.ExpandWidth(true),
|
||||
};
|
||||
|
||||
GUILayoutOption[] labelOptions = new GUILayoutOption[]{
|
||||
GUILayout.Width(200.0f),
|
||||
};
|
||||
|
||||
// Start the Vertical layout then add the label before adding a horizontal so the label will be on top of side-by-side options
|
||||
GUILayout.BeginVertical();
|
||||
GUILayout.Label(_instance.label, labelOptions);
|
||||
GUILayout.BeginHorizontal();
|
||||
|
||||
// Create the x settings enum
|
||||
_instance.changeValue = (CameraSettingsToggle)EditorGUILayout.EnumPopup("", instance.changeValue);
|
||||
|
||||
// Create the value/disabled information field
|
||||
if (_instance.changeValue == CameraSettingsToggle.NewValue){
|
||||
_instance.value = EditorGUILayout.Toggle(_instance.value, floatOptions);
|
||||
} else {
|
||||
EditorGUI.BeginDisabledGroup(true);
|
||||
EditorGUILayout.TextField(_instance.changeValue == CameraSettingsToggle.NoChange ? "Unchanged" : "Reset", floatOptions);
|
||||
EditorGUI.EndDisabledGroup();
|
||||
}
|
||||
|
||||
// Close this line up
|
||||
GUILayout.EndHorizontal();
|
||||
GUILayout.EndVertical();
|
||||
|
||||
// Reset to default so the rest of things don't get messed up
|
||||
EditorGUIUtility.labelWidth = 0;
|
||||
return _instance;
|
||||
}
|
||||
}
|
||||
|
||||
public class FloatCameraValueGroupDrawer : ObjectDrawer<FloatCameraValueGroup> {
|
||||
public override FloatCameraValueGroup OnGUI(GUIContent _content, FloatCameraValueGroup _instance){
|
||||
// Remove label for floats
|
||||
EditorGUIUtility.labelWidth = 50;
|
||||
|
||||
// Set layout options for the label and the float fields
|
||||
GUILayoutOption[] floatOptions = new GUILayoutOption[] {
|
||||
GUILayout.Width(80.0f),
|
||||
GUILayout.MinWidth(20.0f),
|
||||
GUILayout.ExpandWidth(true),
|
||||
};
|
||||
|
||||
GUILayoutOption[] labelOptions = new GUILayoutOption[]{
|
||||
GUILayout.Width(200.0f),
|
||||
};
|
||||
|
||||
// Start the Vertical layout then add the label before adding a horizontal so the label will be on top of side-by-side options
|
||||
GUILayout.BeginVertical();
|
||||
GUILayout.Label(_instance.label, labelOptions);
|
||||
GUILayout.BeginHorizontal();
|
||||
|
||||
// Create the x settings enum
|
||||
_instance.changeValue = (CameraSettingsToggle)EditorGUILayout.EnumPopup("", instance.changeValue);
|
||||
|
||||
// Create the value/disabled information field
|
||||
if (_instance.changeValue == CameraSettingsToggle.NewValue){
|
||||
_instance.value = EditorGUILayout.FloatField(_instance.value, floatOptions);
|
||||
} else {
|
||||
EditorGUI.BeginDisabledGroup(true);
|
||||
EditorGUILayout.TextField(_instance.changeValue == CameraSettingsToggle.NoChange ? "Unchanged" : "Reset", floatOptions);
|
||||
EditorGUI.EndDisabledGroup();
|
||||
}
|
||||
|
||||
// Close this line up
|
||||
GUILayout.EndHorizontal();
|
||||
GUILayout.EndVertical();
|
||||
|
||||
// Reset to default so the rest of things don't get messed up
|
||||
EditorGUIUtility.labelWidth = 0;
|
||||
return _instance;
|
||||
}
|
||||
}
|
||||
|
||||
public class Vector3CameraValueGroupDrawer : ObjectDrawer<Vector3CameraValueGroup> {
|
||||
public override Vector3CameraValueGroup OnGUI(GUIContent _content, Vector3CameraValueGroup _instance){
|
||||
// Remove label for floats
|
||||
EditorGUIUtility.labelWidth = 20;
|
||||
|
||||
// Set layout options for the label and the float fields
|
||||
GUILayoutOption[] floatOptions = new GUILayoutOption[] {
|
||||
GUILayout.Width(300.0f),
|
||||
GUILayout.MinWidth(20.0f),
|
||||
GUILayout.ExpandWidth(true),
|
||||
};
|
||||
|
||||
GUILayoutOption[] labelOptions = new GUILayoutOption[]{
|
||||
GUILayout.Width(200.0f),
|
||||
};
|
||||
|
||||
// Start the Vertical layout then add the label before adding a horizontal so the label will be on top of side-by-side options
|
||||
GUILayout.BeginVertical();
|
||||
GUILayout.Label(_instance.label, labelOptions);
|
||||
GUILayout.BeginHorizontal();
|
||||
|
||||
// Create the x settings enum
|
||||
_instance.changeX = (CameraSettingsToggle)EditorGUILayout.EnumPopup("", instance.changeX);
|
||||
|
||||
// Create the value/disabled information field
|
||||
if (_instance.changeX == CameraSettingsToggle.NewValue){
|
||||
_instance.newValue.x = EditorGUILayout.FloatField(_instance.newValue.x, floatOptions);
|
||||
} else {
|
||||
EditorGUI.BeginDisabledGroup(true);
|
||||
EditorGUILayout.TextField(_instance.changeX == CameraSettingsToggle.NoChange ? "Unchanged" : "Reset", floatOptions);
|
||||
EditorGUI.EndDisabledGroup();
|
||||
}
|
||||
|
||||
// It do what it do.
|
||||
GUILayout.Space(5);
|
||||
|
||||
// Create the y settings enum
|
||||
_instance.changeY = (CameraSettingsToggle)EditorGUILayout.EnumPopup("", _instance.changeY);
|
||||
|
||||
// Create the value/disabled information field
|
||||
if (_instance.changeY == CameraSettingsToggle.NewValue){
|
||||
_instance.newValue.y = EditorGUILayout.FloatField(_instance.newValue.y, floatOptions);
|
||||
} else {
|
||||
EditorGUI.BeginDisabledGroup(true);
|
||||
EditorGUILayout.TextField(_instance.changeY == CameraSettingsToggle.NoChange ? "Unchanged" : "Reset", floatOptions);
|
||||
EditorGUI.EndDisabledGroup();
|
||||
}
|
||||
|
||||
// It do what it do.
|
||||
GUILayout.Space(5);
|
||||
|
||||
// Create the y settings enum
|
||||
_instance.changeZ = (CameraSettingsToggle)EditorGUILayout.EnumPopup("", _instance.changeZ);
|
||||
|
||||
// Create the value/disabled information field
|
||||
if (_instance.changeZ == CameraSettingsToggle.NewValue){
|
||||
_instance.newValue.z = EditorGUILayout.FloatField(_instance.newValue.z, floatOptions);
|
||||
} else {
|
||||
EditorGUI.BeginDisabledGroup(true);
|
||||
EditorGUILayout.TextField(_instance.changeZ == CameraSettingsToggle.NoChange ? "Unchanged" : "Reset", floatOptions);
|
||||
EditorGUI.EndDisabledGroup();
|
||||
}
|
||||
|
||||
// Close this line up
|
||||
GUILayout.EndHorizontal();
|
||||
GUILayout.EndVertical();
|
||||
|
||||
// Reset to default so the rest of things don't get messed up
|
||||
EditorGUIUtility.labelWidth = 0;
|
||||
return _instance;
|
||||
}
|
||||
}
|
||||
|
||||
public class Vector2CameraValueGroupDrawer : ObjectDrawer<Vector2CameraValueGroup> {
|
||||
public override Vector2CameraValueGroup OnGUI(GUIContent _content, Vector2CameraValueGroup _instance){
|
||||
// Remove label for floats
|
||||
EditorGUIUtility.labelWidth = 50;
|
||||
|
||||
// Set layout options for the label and the float fields
|
||||
GUILayoutOption[] floatOptions = new GUILayoutOption[] {
|
||||
GUILayout.Width(300.0f),
|
||||
GUILayout.MinWidth(20.0f),
|
||||
GUILayout.ExpandWidth(true),
|
||||
};
|
||||
|
||||
GUILayoutOption[] labelOptions = new GUILayoutOption[]{
|
||||
GUILayout.Width(200.0f),
|
||||
};
|
||||
|
||||
// Start the Vertical layout then add the label before adding a horizontal so the label will be on top of side-by-side options
|
||||
GUILayout.BeginVertical();
|
||||
GUILayout.Label(_instance.label, labelOptions);
|
||||
GUILayout.BeginHorizontal();
|
||||
|
||||
// Create the x settings enum
|
||||
_instance.changeX = (CameraSettingsToggle)EditorGUILayout.EnumPopup("", instance.changeX);
|
||||
|
||||
// Create the value/disabled information field
|
||||
if (_instance.changeX == CameraSettingsToggle.NewValue){
|
||||
_instance.newValue.x = EditorGUILayout.FloatField(_instance.newValue.x, floatOptions);
|
||||
} else {
|
||||
EditorGUI.BeginDisabledGroup(true);
|
||||
EditorGUILayout.TextField(_instance.changeX == CameraSettingsToggle.NoChange ? "Unchanged" : "Reset", floatOptions);
|
||||
EditorGUI.EndDisabledGroup();
|
||||
}
|
||||
|
||||
// It do what it do.
|
||||
GUILayout.Space(5);
|
||||
|
||||
// Create the y settings enum
|
||||
_instance.changeY = (CameraSettingsToggle)EditorGUILayout.EnumPopup("", _instance.changeY);
|
||||
|
||||
// Create the value/disabled information field
|
||||
if (_instance.changeY == CameraSettingsToggle.NewValue){
|
||||
_instance.newValue.y = EditorGUILayout.FloatField(_instance.newValue.y, floatOptions);
|
||||
} else {
|
||||
EditorGUI.BeginDisabledGroup(true);
|
||||
EditorGUILayout.TextField(_instance.changeY == CameraSettingsToggle.NoChange ? "Unchanged" : "Reset", floatOptions);
|
||||
EditorGUI.EndDisabledGroup();
|
||||
}
|
||||
|
||||
// Close this line up
|
||||
GUILayout.EndHorizontal();
|
||||
GUILayout.EndVertical();
|
||||
|
||||
// Reset to default so the rest of things don't get messed up
|
||||
EditorGUIUtility.labelWidth = 0;
|
||||
return _instance;
|
||||
}
|
||||
}
|
||||
|
||||
// Custom editor for each orbital follow ring setting
|
||||
public class OrbitalFollowValueGroupDrawer : ObjectDrawer<OrbitalFollowValueGroup>{
|
||||
public override OrbitalFollowValueGroup OnGUI(GUIContent _content, OrbitalFollowValueGroup _instance){
|
||||
// Remove label for floats
|
||||
EditorGUIUtility.labelWidth = 1;
|
||||
|
||||
// Set layout options for the label and the float fields
|
||||
GUILayoutOption[] floatOptions = new GUILayoutOption[] {
|
||||
GUILayout.Width(300.0f),
|
||||
GUILayout.MinWidth(20.0f),
|
||||
GUILayout.ExpandWidth(true),
|
||||
};
|
||||
|
||||
GUILayoutOption[] labelOptions = new GUILayoutOption[]{
|
||||
GUILayout.Width(60.0f),
|
||||
};
|
||||
|
||||
// Start a Horiztonal Section
|
||||
GUILayout.BeginHorizontal();
|
||||
|
||||
// Add the left side label
|
||||
GUILayout.Label(_instance.label, labelOptions);
|
||||
|
||||
// Create the height settings enum
|
||||
_instance.changeHeight = (CameraSettingsToggle)EditorGUILayout.EnumPopup("", _instance.changeHeight);
|
||||
|
||||
// Create the value/disabled information field
|
||||
if (_instance.changeHeight == CameraSettingsToggle.NewValue){
|
||||
_instance.height = EditorGUILayout.FloatField(_instance.height, floatOptions);
|
||||
} else {
|
||||
EditorGUI.BeginDisabledGroup(true);
|
||||
EditorGUILayout.TextField(_instance.changeHeight == CameraSettingsToggle.NoChange ? "Unchanged" : "Reset", floatOptions);
|
||||
EditorGUI.EndDisabledGroup();
|
||||
}
|
||||
|
||||
// It do what it do.
|
||||
GUILayout.Space(5);
|
||||
|
||||
// Create the radius settings enum
|
||||
_instance.changeRadius = (CameraSettingsToggle)EditorGUILayout.EnumPopup("", _instance.changeRadius);
|
||||
|
||||
// Create the value/disabled information field
|
||||
if (_instance.changeRadius == CameraSettingsToggle.NewValue){
|
||||
_instance.radius = EditorGUILayout.FloatField(_instance.radius, floatOptions);
|
||||
} else {
|
||||
EditorGUI.BeginDisabledGroup(true);
|
||||
EditorGUILayout.TextField(_instance.changeRadius == CameraSettingsToggle.NoChange ? "Unchanged" : "Reset", floatOptions);
|
||||
EditorGUI.EndDisabledGroup();
|
||||
}
|
||||
|
||||
// Close this line up
|
||||
GUILayout.EndHorizontal();
|
||||
|
||||
// Reset to default so the rest of things don't get messed up
|
||||
EditorGUIUtility.labelWidth = 0;
|
||||
return _instance;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
namespace NodeCanvas.Tasks.Actions {
|
||||
[Category("Reset")]
|
||||
[Description("Change Cinemachine camera settings for the player")]
|
||||
public class ChangeCameraSettings : ActionTask{
|
||||
[ParadoxNotion.Design.Header("Main Settings")]
|
||||
public FloatCameraValueGroup fieldOfView = new (newLabel: "FOV");
|
||||
public FloatValueGroup fieldOfView = new (newLabel: "FOV");
|
||||
|
||||
[ParadoxNotion.Design.Header("Orbit Follow Ring Settings"), Space (5)]
|
||||
public Vector3CameraValueGroup orbitTargetOffset = new(newLabel: "Target Offset");
|
||||
[Space(5)]public Vector3CameraValueGroup orbitPositionDamping = new(newLabel: "Position Damping");
|
||||
public Vector3ValueGroup orbitTargetOffset = new(newLabel: "Target Offset");
|
||||
[Space(5)]public Vector3ValueGroup orbitPositionDamping = new(newLabel: "Position Damping");
|
||||
|
||||
public OrbitalFollowValueGroup orbitFollowTop = new (newLabel: "Top");
|
||||
public OrbitalFollowValueGroup orbitFollowCenter = new (newLabel: "Center");
|
||||
public OrbitalFollowValueGroup orbitFollowBottom = new (newLabel: "Bottom");
|
||||
|
||||
public BoolCameraValueGroup enableXAxis = new (newLabel: "Input Axis X Enabled");
|
||||
public BoolCameraValueGroup enableYAxis = new (newLabel: "Input Axis Y Enabled");
|
||||
public BoolValueGroup enableXAxis = new (newLabel: "Input Axis X Enabled");
|
||||
public BoolValueGroup enableYAxis = new (newLabel: "Input Axis Y Enabled");
|
||||
|
||||
public FloatCameraValueGroup axisLookXGain = new (newLabel: "Look Orbit X Gain");
|
||||
public FloatCameraValueGroup axisLookYGain = new (newLabel: "Look Orbit Y Gain");
|
||||
public FloatValueGroup axisLookXGain = new (newLabel: "Look Orbit X Gain");
|
||||
public FloatValueGroup axisLookYGain = new (newLabel: "Look Orbit Y Gain");
|
||||
|
||||
[ParadoxNotion.Design.Header("Rotation Composer Settings")]
|
||||
public Vector2CameraValueGroup screenPosition = new (newLabel: "Screen Position");
|
||||
public Vector2ValueGroup screenPosition = new (newLabel: "Screen Position");
|
||||
|
||||
[ParadoxNotion.Design.Header("Camera Offset Settings")]
|
||||
public Vector3CameraValueGroup cameraOffset = new (newLabel: "Offset");
|
||||
public Vector3ValueGroup cameraOffset = new (newLabel: "Offset");
|
||||
|
||||
//Use for initialization. This is called only once in the lifetime of the task.
|
||||
//Return null if init was successfull. Return an error string otherwise
|
||||
@@ -440,50 +64,50 @@ namespace NodeCanvas.Tasks.Actions {
|
||||
EndAction(true);
|
||||
}
|
||||
|
||||
public void UpdateVector3Value(Vector3CameraValueGroup valueGroup, ref CameraSettingSingleValue<Vector3> targetProperty){
|
||||
public void UpdateVector3Value(Vector3ValueGroup valueGroup, ref CameraSettingSingleValue<Vector3> targetProperty){
|
||||
switch (valueGroup.changeX) {
|
||||
case CameraSettingsToggle.NewValue:
|
||||
case ValueChangeAction.NewValue:
|
||||
targetProperty.targetValue.x = valueGroup.newValue.x;
|
||||
break;
|
||||
case CameraSettingsToggle.ResetValue:
|
||||
case ValueChangeAction.ResetValue:
|
||||
targetProperty.targetValue.x = targetProperty.originalValue.x;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (valueGroup.changeY) {
|
||||
case CameraSettingsToggle.NewValue:
|
||||
case ValueChangeAction.NewValue:
|
||||
targetProperty.targetValue.y = valueGroup.newValue.y;
|
||||
break;
|
||||
case CameraSettingsToggle.ResetValue:
|
||||
case ValueChangeAction.ResetValue:
|
||||
targetProperty.targetValue.y = targetProperty.originalValue.y;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (valueGroup.changeZ) {
|
||||
case CameraSettingsToggle.NewValue:
|
||||
case ValueChangeAction.NewValue:
|
||||
targetProperty.targetValue.z = valueGroup.newValue.z;
|
||||
break;
|
||||
case CameraSettingsToggle.ResetValue:
|
||||
case ValueChangeAction.ResetValue:
|
||||
targetProperty.targetValue.z = targetProperty.originalValue.z;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public void UpdateVector2Value(Vector2CameraValueGroup valueGroup, ref CameraSettingSingleValue<Vector2> targetProperty){
|
||||
public void UpdateVector2Value(Vector2ValueGroup valueGroup, ref CameraSettingSingleValue<Vector2> targetProperty){
|
||||
switch (valueGroup.changeX) {
|
||||
case CameraSettingsToggle.NewValue:
|
||||
case ValueChangeAction.NewValue:
|
||||
targetProperty.targetValue.x = valueGroup.newValue.x;
|
||||
break;
|
||||
case CameraSettingsToggle.ResetValue:
|
||||
case ValueChangeAction.ResetValue:
|
||||
targetProperty.targetValue.x = targetProperty.originalValue.x;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (valueGroup.changeY) {
|
||||
case CameraSettingsToggle.NewValue:
|
||||
case ValueChangeAction.NewValue:
|
||||
targetProperty.targetValue.y = valueGroup.newValue.y;
|
||||
break;
|
||||
case CameraSettingsToggle.ResetValue:
|
||||
case ValueChangeAction.ResetValue:
|
||||
targetProperty.targetValue.y = targetProperty.originalValue.y;
|
||||
break;
|
||||
}
|
||||
@@ -491,41 +115,41 @@ namespace NodeCanvas.Tasks.Actions {
|
||||
|
||||
public void UpdateOrbitFollowValue(OrbitalFollowValueGroup valueGroup, ref CameraSettingSingleValue<float> targetHeight, ref CameraSettingSingleValue<float> targetRadius){
|
||||
switch (valueGroup.changeHeight) {
|
||||
case CameraSettingsToggle.NewValue:
|
||||
case ValueChangeAction.NewValue:
|
||||
targetHeight.targetValue = valueGroup.height;
|
||||
break;
|
||||
case CameraSettingsToggle.ResetValue:
|
||||
case ValueChangeAction.ResetValue:
|
||||
targetHeight.targetValue = targetHeight.originalValue;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (valueGroup.changeRadius) {
|
||||
case CameraSettingsToggle.NewValue:
|
||||
case ValueChangeAction.NewValue:
|
||||
targetRadius.targetValue = valueGroup.radius;
|
||||
break;
|
||||
case CameraSettingsToggle.ResetValue:
|
||||
case ValueChangeAction.ResetValue:
|
||||
targetRadius.targetValue = targetRadius.originalValue;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public void UpdateBoolValue(BoolCameraValueGroup valueGroup, ref CameraSettingSingleValue<bool> targetProperty){
|
||||
public void UpdateBoolValue(BoolValueGroup valueGroup, ref CameraSettingSingleValue<bool> targetProperty){
|
||||
switch (valueGroup.changeValue) {
|
||||
case CameraSettingsToggle.NewValue:
|
||||
case ValueChangeAction.NewValue:
|
||||
targetProperty.targetValue = valueGroup.value;
|
||||
break;
|
||||
case CameraSettingsToggle.ResetValue:
|
||||
case ValueChangeAction.ResetValue:
|
||||
targetProperty.targetValue = targetProperty.originalValue;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public void UpdateFloatValue(FloatCameraValueGroup valueGroup, ref CameraSettingSingleValue<float> targetProperty){
|
||||
public void UpdateFloatValue(FloatValueGroup valueGroup, ref CameraSettingSingleValue<float> targetProperty){
|
||||
switch (valueGroup.changeValue) {
|
||||
case CameraSettingsToggle.NewValue:
|
||||
case ValueChangeAction.NewValue:
|
||||
targetProperty.targetValue = valueGroup.value;
|
||||
break;
|
||||
case CameraSettingsToggle.ResetValue:
|
||||
case ValueChangeAction.ResetValue:
|
||||
targetProperty.targetValue = targetProperty.originalValue;
|
||||
break;
|
||||
}
|
||||
|
||||
214
Assets/Scripts/Core/Graph Tasks/ChangeMovementSettings.cs
Normal file
214
Assets/Scripts/Core/Graph Tasks/ChangeMovementSettings.cs
Normal file
@@ -0,0 +1,214 @@
|
||||
using System;
|
||||
using NodeCanvas.Framework;
|
||||
using ParadoxNotion.Design;
|
||||
using Reset.Units;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Reset.Core {
|
||||
[Category("Reset")]
|
||||
[Description("Commits movement unit changes to the handler.")]
|
||||
public class ChangeMovementSettings : ActionTask<UnitMovementHandler> {
|
||||
//Use for initialization. This is called only once in the lifetime of the task.
|
||||
// Move Speed
|
||||
[ParadoxNotion.Design.Header("Speed")]
|
||||
public FloatValueGroup moveSpeedTarget = new (newLabel: "Move Speed");
|
||||
public FloatValueGroup moveSpeedSoothing = new (newLabel: "Move Speed Smoothing");
|
||||
|
||||
[ParadoxNotion.Design.Header("Speed")]
|
||||
public Vector3ValueGroup feedNewDirection = new Vector3ValueGroup("Feed New Direction");
|
||||
public float newDirectionPower;
|
||||
|
||||
public FloatValueGroup accelerationSmoothing = new (newLabel: "Acceleration Smoothing");
|
||||
public FloatValueGroup deaccelerationSmoothing = new (newLabel: "Deacceleration Smoothing");
|
||||
public CurveValueGroup deaccelerationCurve = new (newLabel: "Deacceleration Curve");
|
||||
|
||||
// Jumping
|
||||
[ParadoxNotion.Design.Header("Jumping")]
|
||||
public FloatValueGroup jumpPower = new (newLabel: "Jump Power");
|
||||
public FloatValueGroup jumpPowerDecay = new (newLabel: "Jump Decay Speed");
|
||||
|
||||
// Gravity
|
||||
[ParadoxNotion.Design.Header("Gravity")]
|
||||
public FloatValueGroup gravityPower = new (newLabel: "Gravity Power");
|
||||
public FloatValueGroup gravityMax = new (newLabel: "Gravity Max");
|
||||
public FloatValueGroup gravityAcceleration = new (newLabel: "Gravity Acceleration Speed");
|
||||
public FloatValueGroup gravityScale = new (newLabel: "Gravity Scale");
|
||||
|
||||
// Rotation
|
||||
[ParadoxNotion.Design.Header("Rotation")]
|
||||
public EnumValueGroup rotateFacing = new EnumValueGroup("Facing Direction", PlayerFacingDirection.TowardsTarget);
|
||||
public FloatValueGroup rotationSpeedTarget = new (newLabel: "Rotation Speed");
|
||||
public FloatValueGroup rotationSmoothing = new (newLabel: "Rotation Smoothing");
|
||||
public BBParameter<Vector3> feedNewRotation;
|
||||
public BBParameter<Vector3> feedRelativeTo;
|
||||
public Space rotationRelativeSpace;
|
||||
|
||||
private Vector3 feedDir;
|
||||
|
||||
|
||||
//Return null if init was successfull. Return an error string otherwise
|
||||
protected override string OnInit() {
|
||||
return null;
|
||||
}
|
||||
|
||||
//This is called once each time the task is enabled.
|
||||
//Call EndAction() to mark the action as finished, either in success or failure.
|
||||
//EndAction can be called from anywhere.
|
||||
protected override void OnExecute() {
|
||||
UpdateFloatValue(accelerationSmoothing, ref agent.data.accelerationSmoothing, ref agent.defaultData.accelerationSmoothing);
|
||||
UpdateFloatValue(deaccelerationSmoothing, ref agent.data.deaccelerationSmoothing, ref agent.defaultData.deaccelerationSmoothing);
|
||||
UpdateCurveProperty(deaccelerationCurve, ref agent.data.deaccelerationCurve, ref agent.defaultData.deaccelerationCurve);
|
||||
|
||||
UpdateFloatValue(moveSpeedTarget, ref agent.data.moveSpeedTarget, ref agent.defaultData.moveSpeedTarget);
|
||||
UpdateFloatValue(moveSpeedSoothing, ref agent.data.moveSpeedSoothing, ref agent.defaultData.moveSpeedSoothing);
|
||||
|
||||
UpdateFloatValue(jumpPower, ref agent.data.jumpPower, ref agent.defaultData.jumpPower);
|
||||
UpdateFloatValue(jumpPowerDecay, ref agent.data.jumpPowerDecay, ref agent.defaultData.jumpPowerDecay);
|
||||
|
||||
UpdateFloatValue(gravityPower, ref agent.data.gravityPower, ref agent.defaultData.gravityPower);
|
||||
UpdateFloatValue(gravityMax, ref agent.data.gravityMax, ref agent.defaultData.gravityMax);
|
||||
UpdateFloatValue(gravityAcceleration, ref agent.data.gravityAcceleration, ref agent.defaultData.gravityAcceleration);
|
||||
UpdateFloatValue(gravityScale, ref agent.data.gravityScale, ref agent.defaultData.gravityScale);
|
||||
|
||||
UpdateEnumValue(rotateFacing, ref agent.data.rotateFacing, ref agent.defaultData.rotateFacing);
|
||||
|
||||
UpdateFloatValue(rotationSpeedTarget, ref agent.data.rotationSpeedTarget, ref agent.defaultData.rotationSpeedTarget);
|
||||
UpdateFloatValue(rotationSmoothing, ref agent.data.rotationSmoothing, ref agent.defaultData.rotationSmoothing);
|
||||
|
||||
UpdateVector3Value(feedNewDirection, ref feedDir, ref feedDir);
|
||||
|
||||
// Debug.Log(feedDir);
|
||||
|
||||
if (feedDir != Vector3.zero) {
|
||||
agent.AddToCurrentDirection(agent.transform.rotation * feedDir.normalized, newDirectionPower);
|
||||
feedDir = Vector3.zero;
|
||||
}
|
||||
|
||||
if (feedNewRotation.value != Vector3.zero) {
|
||||
if (rotationRelativeSpace == Space.World) {
|
||||
Debug.Log(Quaternion.LookRotation(feedRelativeTo.value));
|
||||
agent.SetSpecifiedRotation(Quaternion.Euler(feedNewRotation.value) * Quaternion.LookRotation(feedRelativeTo.value));
|
||||
} else {
|
||||
agent.SetSpecifiedRotation(agent.transform.rotation * Quaternion.Euler(feedNewRotation.value) * Quaternion.LookRotation(feedRelativeTo.value));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
EndAction(true);
|
||||
}
|
||||
|
||||
//Called once per frame while the action is active.
|
||||
protected override void OnUpdate() {
|
||||
|
||||
}
|
||||
|
||||
//Called when the task is disabled.
|
||||
protected override void OnStop() {
|
||||
|
||||
}
|
||||
|
||||
//Called when the task is paused.
|
||||
protected override void OnPause() {
|
||||
|
||||
}
|
||||
|
||||
public void UpdateCurveProperty(CurveValueGroup valueGroup, ref AnimationCurve targetProperty, ref AnimationCurve defaultProperty){
|
||||
switch (valueGroup.changeValue) {
|
||||
case ValueChangeAction.NoChange:
|
||||
break;
|
||||
case ValueChangeAction.NewValue:
|
||||
targetProperty = valueGroup.newValue;
|
||||
break;
|
||||
case ValueChangeAction.ResetValue:
|
||||
targetProperty = defaultProperty;
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
}
|
||||
|
||||
public void UpdateVector3Value(Vector3ValueGroup valueGroup, ref Vector3 targetProperty, ref Vector3 defaultProperty){
|
||||
switch (valueGroup.changeX) {
|
||||
case ValueChangeAction.NewValue:
|
||||
targetProperty.x = valueGroup.newValue.x;
|
||||
break;
|
||||
case ValueChangeAction.ResetValue:
|
||||
targetProperty.x = defaultProperty.x;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (valueGroup.changeY) {
|
||||
case ValueChangeAction.NewValue:
|
||||
targetProperty.y = valueGroup.newValue.y;
|
||||
break;
|
||||
case ValueChangeAction.ResetValue:
|
||||
targetProperty.y = defaultProperty.y;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (valueGroup.changeZ) {
|
||||
case ValueChangeAction.NewValue:
|
||||
targetProperty.z = valueGroup.newValue.z;
|
||||
break;
|
||||
case ValueChangeAction.ResetValue:
|
||||
targetProperty.z = defaultProperty.z;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public void UpdateVector2Value(Vector2ValueGroup valueGroup, ref Vector2 targetProperty, ref Vector2 defaultProperty){
|
||||
switch (valueGroup.changeX) {
|
||||
case ValueChangeAction.NewValue:
|
||||
targetProperty.x = valueGroup.newValue.x;
|
||||
break;
|
||||
case ValueChangeAction.ResetValue:
|
||||
targetProperty.x = defaultProperty.x;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (valueGroup.changeY) {
|
||||
case ValueChangeAction.NewValue:
|
||||
targetProperty.y = valueGroup.newValue.y;
|
||||
break;
|
||||
case ValueChangeAction.ResetValue:
|
||||
targetProperty.y = defaultProperty.y;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void UpdateBoolValue(BoolValueGroup valueGroup, ref bool targetProperty, ref bool defaultProperty){
|
||||
switch (valueGroup.changeValue) {
|
||||
case ValueChangeAction.NewValue:
|
||||
targetProperty = valueGroup.value;
|
||||
break;
|
||||
case ValueChangeAction.ResetValue:
|
||||
targetProperty = defaultProperty;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public void UpdateEnumValue(EnumValueGroup valueGroup, ref Enum targetProperty, ref Enum defaultProperty){
|
||||
switch (valueGroup.changeValue) {
|
||||
case ValueChangeAction.NewValue:
|
||||
targetProperty = valueGroup.newValue;
|
||||
break;
|
||||
case ValueChangeAction.ResetValue:
|
||||
targetProperty = defaultProperty;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public void UpdateFloatValue(FloatValueGroup valueGroup, ref float targetProperty, ref float defaultProperty){
|
||||
switch (valueGroup.changeValue) {
|
||||
case ValueChangeAction.NewValue:
|
||||
targetProperty = valueGroup.value;
|
||||
break;
|
||||
case ValueChangeAction.ResetValue:
|
||||
targetProperty = defaultProperty;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5132a76af4f722e49bc7fbbc75edcaf1
|
||||
127
Assets/Scripts/Core/Graph Tasks/DoGrapplePull.cs
Normal file
127
Assets/Scripts/Core/Graph Tasks/DoGrapplePull.cs
Normal file
@@ -0,0 +1,127 @@
|
||||
using Drawing;
|
||||
using NodeCanvas.Framework;
|
||||
using ParadoxNotion.Design;
|
||||
using ParadoxNotion.Services;
|
||||
using UnityEngine;
|
||||
|
||||
|
||||
namespace NodeCanvas.Tasks.Actions {
|
||||
|
||||
[Category("Reset/Movement")]
|
||||
[Description("Pulls the agent towards a position with a spring-like effect")]
|
||||
public class DoGrapplePull : ActionTask<CharacterController>{
|
||||
public BBParameter<Vector3> grapplePoint;
|
||||
public BBParameter<Vector3> offset;
|
||||
|
||||
public BBParameter<float> pullAccelerationSpeed;
|
||||
public BBParameter<float> pullDeaccelerationSpeed;
|
||||
|
||||
[Tooltip("X is minimum speed, Y is maximum speed")]
|
||||
public BBParameter<Vector2> pullTimeRange;
|
||||
[Tooltip("X is the distance where the curve will first be evaluated, Y is the distance where the curve will last be evaluated")]
|
||||
public BBParameter<Vector2> pullSpeedRange;
|
||||
|
||||
public BBParameter<float> slowdownDistance;
|
||||
|
||||
public BBParameter<AnimationCurve> pullSpeedCurve;
|
||||
public BBParameter<AnimationCurve> endDeaccelerationCurve;
|
||||
|
||||
|
||||
private float startTime;
|
||||
|
||||
private float currentSpeed;
|
||||
private Vector3 smoothedInput;
|
||||
private Vector3 smoothedInputRefVelocity;
|
||||
|
||||
//Use for initialization. This is called only once in the lifetime of the task.
|
||||
//Return null if init was successfull. Return an error string otherwise
|
||||
protected override string OnInit(){
|
||||
MonoManager.current.onLateUpdate += DrawGrappleGizmo;
|
||||
return null;
|
||||
}
|
||||
|
||||
//This is called once each time the task is enabled.
|
||||
//Call EndAction() to mark the action as finished, either in success or failure.
|
||||
//EndAction can be called from anywhere.
|
||||
protected override void OnExecute(){
|
||||
startTime = Time.time;
|
||||
currentSpeed = pullSpeedCurve.value[0].value * pullSpeedRange.value.y;
|
||||
}
|
||||
|
||||
//Called once per frame while the action is active.
|
||||
protected override void OnUpdate(){
|
||||
// Create the distance variables
|
||||
Vector3 dirToPoint = agent.transform.position.DirectionTo(grapplePoint.value);
|
||||
|
||||
float evaluatedSpeed = pullSpeedCurve.value.Evaluate(Mathf.Clamp((Time.time - startTime) / 6f, 0f, Mathf.Infinity));
|
||||
|
||||
float speedAgainstCurve = Mathf.Lerp(pullSpeedRange.value.x, pullSpeedRange.value.y, evaluatedSpeed);
|
||||
|
||||
// Find how far from 0-1 the player is from the max and minimum distance
|
||||
// Get the base distance then account for the minimum distance to the point so that being the minimum away will Lerp to 1
|
||||
float currentDist = Vector3.Distance(agent.transform.position, grapplePoint.value);
|
||||
// float currentDistMinimumAccounted = (currentDist - pullSpeedDistances.value.x);
|
||||
|
||||
if (currentDist < slowdownDistance.value) {
|
||||
float change = endDeaccelerationCurve.value.Evaluate((slowdownDistance.value - currentDist) / slowdownDistance.value);
|
||||
speedAgainstCurve = speedAgainstCurve * change;
|
||||
|
||||
// Debug.Log($"prev: {speedAgainstCurve}, norm: {(slowdownDistance.value - currentDist) / slowdownDistance.value}, change: {change}, output: {speedAgainstCurve * change} ");
|
||||
}
|
||||
|
||||
// Evaluate the normalized value
|
||||
// float normaled = Mathf.Lerp(0, 1f, 1f - elapsedTime / (pullSpeedDistances.value.y - pullSpeedDistances.value.x));
|
||||
|
||||
// Use the curve evaluation to set the speed
|
||||
// float outputSpeed = Mathf.Lerp(pullTimeRange.value.x, pullTimeRange.value.y, evaluatedSpeed);
|
||||
|
||||
// Soften the speed changes
|
||||
currentSpeed = Mathf.Lerp(currentSpeed, speedAgainstCurve, 10f * Time.deltaTime);
|
||||
|
||||
// Add input changes
|
||||
Vector2 rawInput = agent.GetComponent<PlayerControls>().rawMoveInput;
|
||||
Vector3 input = Quaternion.LookRotation(dirToPoint) * new Vector3(rawInput.x, rawInput.y, 0f);
|
||||
|
||||
smoothedInput = Vector3.SmoothDamp(smoothedInput, input, ref smoothedInputRefVelocity, 30f * Time.deltaTime);
|
||||
|
||||
Debug.Log(input);
|
||||
|
||||
dirToPoint.y *= 2.5f;
|
||||
|
||||
agent.Move((dirToPoint.normalized + smoothedInput) * currentSpeed * Time.deltaTime);
|
||||
// Debug.Log( $"{ endDeaccelerationCurve.value.Evaluate(((slowdownDistance.value - currentDist)) )}");
|
||||
|
||||
// EndAction(true);
|
||||
}
|
||||
|
||||
public void DrawGrappleGizmo(){
|
||||
// Vector3 dirToPoint = agent.transform.position.DirectionTo(grapplePoint.value);
|
||||
//
|
||||
// using (Draw.WithColor(Color.yellow)){
|
||||
// Draw.Line(agent.transform.position + Vector3.up, grapplePoint.value);
|
||||
//
|
||||
// // Draw Gizmo for minimum distance
|
||||
// Vector3 minLocation = agent.transform.position + (Vector3.up * 1) + (dirToPoint * pullSpeedDistances.value.x);
|
||||
// Vector3 minToScreen = minLocation.DirectionTo(Camera.main.transform.position);
|
||||
//
|
||||
// Draw.SolidCircle(minLocation,minToScreen , .2f);
|
||||
//
|
||||
// // Draw Gizmo for minimum distance
|
||||
// Vector3 maxLocation = agent.transform.position + (Vector3.up * .8f) + (dirToPoint * pullSpeedDistances.value.y);
|
||||
// Vector3 maxToScreen = maxLocation.DirectionTo(Camera.main.transform.position);
|
||||
//
|
||||
// Draw.SolidCircle(maxLocation,maxToScreen , .2f);
|
||||
// }
|
||||
}
|
||||
|
||||
//Called when the task is disabled.
|
||||
protected override void OnStop() {
|
||||
|
||||
}
|
||||
|
||||
//Called when the task is paused.
|
||||
protected override void OnPause() {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
2
Assets/Scripts/Core/Graph Tasks/DoGrapplePull.cs.meta
Normal file
2
Assets/Scripts/Core/Graph Tasks/DoGrapplePull.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 75673b361693d854abb6e3b24a62d734
|
||||
48
Assets/Scripts/Core/Graph Tasks/FinalizeMovement.cs
Normal file
48
Assets/Scripts/Core/Graph Tasks/FinalizeMovement.cs
Normal file
@@ -0,0 +1,48 @@
|
||||
using NodeCanvas.Framework;
|
||||
using ParadoxNotion.Design;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Reset.Movement {
|
||||
|
||||
[Category("Reset/Movement")]
|
||||
[Description("Finalize the move direction to the agent's CharacterController")]
|
||||
public class FinalizeMovement : ActionTask<CharacterController>{
|
||||
public BBParameter<Vector3> moveDirection;
|
||||
public BBParameter<float> currentSpeed;
|
||||
|
||||
//Use for initialization. This is called only once in the lifetime of the task.
|
||||
//Return null if init was successfull. Return an error string otherwise
|
||||
protected override string OnInit() {
|
||||
if (currentSpeed == null || !currentSpeed.useBlackboard) {
|
||||
Debug.LogError("This <b>Finalize Movement</b> does not have it's current value attached to a Blackboard variable. Nothing will happen.", agent.gameObject);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
//This is called once each time the task is enabled.
|
||||
//Call EndAction() to mark the action as finished, either in success or failure.
|
||||
//EndAction can be called from anywhere.
|
||||
protected override void OnExecute(){
|
||||
|
||||
}
|
||||
|
||||
//Called once per frame while the action is active.
|
||||
protected override void OnUpdate(){
|
||||
Vector3 usableVector3 = new Vector3(moveDirection.value.x * currentSpeed.value, moveDirection.value.y, moveDirection.value.z * currentSpeed.value);
|
||||
agent.Move(Camera.main.transform.rotation * usableVector3 * Time.deltaTime);
|
||||
|
||||
Debug.Log("Finalize Done");
|
||||
// EndAction(true);
|
||||
}
|
||||
|
||||
//Called when the task is disabled.
|
||||
protected override void OnStop() {
|
||||
|
||||
}
|
||||
|
||||
//Called when the task is paused.
|
||||
protected override void OnPause() {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
2
Assets/Scripts/Core/Graph Tasks/FinalizeMovement.cs.meta
Normal file
2
Assets/Scripts/Core/Graph Tasks/FinalizeMovement.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fea4d34f26d30b24e8cb99acf1766b6f
|
||||
@@ -62,7 +62,7 @@ namespace NodeCanvas.Tasks.Conditions {
|
||||
// Calculate dor product
|
||||
float dotProduct = Vector3.Dot(valueToCheck, rawInputVector3);
|
||||
|
||||
Debug.Log(dotProduct);
|
||||
// Debug.Log(dotProduct);
|
||||
|
||||
// Compare against the desired tolerance and output result
|
||||
if (tolerance.value > Mathf.Abs(dotProduct - tolerance.value)) {
|
||||
|
||||
@@ -1,169 +0,0 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using NodeCanvas.Framework;
|
||||
using ParadoxNotion.Design;
|
||||
using ParadoxNotion.Services;
|
||||
using Unity.Cinemachine;
|
||||
using Unity.Mathematics;
|
||||
using UnityEngine;
|
||||
using Reset.Player.Movement;
|
||||
|
||||
namespace Reset.Player.Movement{
|
||||
public enum PlayerFacingDirection{
|
||||
Target = 0,
|
||||
Movement,
|
||||
MatchCamera,
|
||||
Static
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
namespace NodeCanvas.Tasks.Actions {
|
||||
|
||||
[Category("Reset/Movement")]
|
||||
[Description("Finalizes movement and sends the final move commands to the controller")]
|
||||
public class ProcessMovement : ActionTask<CharacterController>{
|
||||
public BBParameter<Vector3> groundMoveDirection;
|
||||
public BBParameter<Vector3> airMoveDirection;
|
||||
[Space(5)]
|
||||
public BBParameter<float> gravityAcceleration = 1f;
|
||||
public BBParameter<float> gravityMax = 8f;
|
||||
|
||||
public BBParameter<float> jumpPower;
|
||||
public BBParameter<float> jumpPowerDecay;
|
||||
|
||||
// Rotation
|
||||
public BBParameter<PlayerFacingDirection> playerFacingDirection;
|
||||
|
||||
[ShowIf("playerFacingDirection", 0)]
|
||||
public Vector3 rotationTargetPosition;
|
||||
|
||||
public BBParameter<float> rotationSpeed = 5f;
|
||||
public BBParameter<float> rotationSmoothing;
|
||||
|
||||
private float currentRotSpeed;
|
||||
private float lastLookMagnitude;
|
||||
private Quaternion targetRotation;
|
||||
private Vector3 currentMoveDir;
|
||||
|
||||
// References
|
||||
private PlayerControls controls;
|
||||
|
||||
public BBParameter<float> gravityPower;
|
||||
|
||||
//Use for initialization. This is called only once in the lifetime of the task.
|
||||
//Return null if init was successfull. Return an error string otherwise
|
||||
protected override string OnInit() {
|
||||
// Append the late update method to actually happen on late update
|
||||
MonoManager.current.onLateUpdate += LateUpdate;
|
||||
|
||||
// Set ingitial rotation power
|
||||
currentRotSpeed = rotationSpeed.value;
|
||||
|
||||
// Reference to controls
|
||||
controls = agent.GetComponent<PlayerControls>();
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
//This is called once each time the task is enabled.
|
||||
//Call EndAction() to mark the action as finished, either in success or failure.
|
||||
//EndAction can be called from anywhere.
|
||||
protected override void OnExecute(){
|
||||
currentMoveDir = groundMoveDirection.value;
|
||||
}
|
||||
|
||||
//Called once per frame while the action is active.
|
||||
protected override void OnUpdate(){
|
||||
// Accelerate gravity
|
||||
gravityPower.value += gravityAcceleration.value * Time.deltaTime;
|
||||
gravityPower.value = Mathf.Min(gravityPower.value, gravityMax.value);
|
||||
|
||||
// Calculate rotation speed
|
||||
currentRotSpeed = Mathf.Lerp(currentRotSpeed, rotationSpeed.value, rotationSmoothing.value * Time.deltaTime);
|
||||
|
||||
switch (playerFacingDirection.value) {
|
||||
case PlayerFacingDirection.Target:
|
||||
// Set rotation to just the direction of the target
|
||||
targetRotation = Quaternion.LookRotation((agent.transform.position.DirectionTo(rotationTargetPosition)).Flatten(null, 0, null));
|
||||
|
||||
break;
|
||||
case PlayerFacingDirection.Movement:
|
||||
// Check magnitude to avoid the "Look rotation viewing vector is zero" debug
|
||||
|
||||
// Set desired rotation to input direction, with respect to camera rotation
|
||||
if (agent.isGrounded){
|
||||
if (controls.rawMoveInput.magnitude == 0) { break; }
|
||||
|
||||
targetRotation = Quaternion.LookRotation(currentMoveDir) *
|
||||
Quaternion.Euler(Camera.main.transform.rotation.eulerAngles.Flatten(0f, null, 0f));
|
||||
} else {
|
||||
if (airMoveDirection.value.magnitude == 0) { break; }
|
||||
|
||||
targetRotation = Quaternion.LookRotation(airMoveDirection.value);
|
||||
}
|
||||
break;
|
||||
case PlayerFacingDirection.MatchCamera:
|
||||
// Craft a new rotation that flattens the camera's rotation to the ground
|
||||
// Needed to keep the character from inheriting the camera's height-rotation
|
||||
targetRotation = Quaternion.Euler(Camera.main.transform.rotation.eulerAngles.Flatten(0, null, 0));
|
||||
break;
|
||||
case PlayerFacingDirection.Static:
|
||||
targetRotation = agent.transform.rotation;
|
||||
break;
|
||||
}
|
||||
|
||||
// Construct move direction
|
||||
Vector3 finalMoveDir = Vector3.zero;
|
||||
Vector3 gravityMoveDirection;
|
||||
|
||||
// Change how input is managed based on facing state
|
||||
currentMoveDir = Vector3.Slerp(currentMoveDir, groundMoveDirection.value, currentRotSpeed * Time.deltaTime);
|
||||
|
||||
// Add input movement
|
||||
if (agent.isGrounded){
|
||||
finalMoveDir += currentMoveDir + Vector3.down * .03f;
|
||||
gravityMoveDirection = new(0f, jumpPower.value + (Physics.gravity.y *.3f), 0f);
|
||||
} else {
|
||||
finalMoveDir += airMoveDirection.value;
|
||||
gravityMoveDirection = new(0f, jumpPower.value + Physics.gravity.y * gravityPower.value, 0f);
|
||||
}
|
||||
|
||||
// Reset gravity power when grounded
|
||||
if (agent.isGrounded) {
|
||||
gravityPower.value = 0f;
|
||||
}
|
||||
|
||||
// Do final movement
|
||||
if (agent.isGrounded) {
|
||||
agent.Move((Quaternion.Euler(Camera.main.transform.rotation.eulerAngles.Flatten(0f, null, 0f)) * finalMoveDir + gravityMoveDirection) * Time.deltaTime);
|
||||
} else {
|
||||
agent.Move((finalMoveDir + gravityMoveDirection) * Time.deltaTime);
|
||||
}
|
||||
|
||||
// Set final rotation
|
||||
agent.transform.rotation = Quaternion.Lerp(agent.transform.rotation, targetRotation, 10f * Time.deltaTime).Flatten(0, null, 0);
|
||||
|
||||
// ???? Moved this above but don't remember if this needs to be here still
|
||||
if (agent.isGrounded) {
|
||||
jumpPower.value = 0f;
|
||||
}
|
||||
}
|
||||
|
||||
// Gravity is processed in LateUpdate (added to MonoManager's onLateUpdate in OnInit())
|
||||
public void LateUpdate(){
|
||||
// Decay jump power
|
||||
jumpPower.value = Mathf.Lerp(jumpPower.value, 0f, jumpPowerDecay.value * Time.deltaTime);
|
||||
}
|
||||
|
||||
//Called when the task is disabled.
|
||||
protected override void OnStop() {
|
||||
EndAction(true);
|
||||
}
|
||||
|
||||
//Called when the task is paused.
|
||||
protected override void OnPause() {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
using System;
|
||||
using NodeCanvas.Framework;
|
||||
using ParadoxNotion.Design;
|
||||
using Reset.Player.Movement;
|
||||
using Reset.Movement;
|
||||
using UnityEngine;
|
||||
|
||||
namespace NodeCanvas.Tasks.Actions {
|
||||
|
||||
73
Assets/Scripts/Core/Graph Tasks/UpdateGravityDirection.cs
Normal file
73
Assets/Scripts/Core/Graph Tasks/UpdateGravityDirection.cs
Normal file
@@ -0,0 +1,73 @@
|
||||
using NodeCanvas.Framework;
|
||||
using ParadoxNotion.Design;
|
||||
using ParadoxNotion.Services;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Reset.Movement {
|
||||
|
||||
[Category("Reset/Movement")]
|
||||
[Description("Process Y-axis movement for the agent")]
|
||||
// TODO: Rename to UpdateGravitytDirection
|
||||
public class UpdateGravityDirection : ActionTask<CharacterController>{
|
||||
public BBParameter<Vector3> moveDirection;
|
||||
public BBParameter<float> jumpPower;
|
||||
public BBParameter<float> jumpPowerDecay;
|
||||
|
||||
[Space(5)]
|
||||
public BBParameter<float> gravityAcceleration = 1f;
|
||||
public BBParameter<float> gravityMax = 8f;
|
||||
|
||||
public BBParameter<float> gravityPower;
|
||||
|
||||
//Use for initialization. This is called only once in the lifetime of the task.
|
||||
//Return null if init was successfull. Return an error string otherwise
|
||||
protected override string OnInit() {
|
||||
MonoManager.current.onLateUpdate += LateUpdate;
|
||||
return null;
|
||||
}
|
||||
|
||||
//This is called once each time the task is enabled.
|
||||
//Call EndAction() to mark the action as finished, either in success or failure.
|
||||
//EndAction can be called from anywhere.
|
||||
protected override void OnExecute() {
|
||||
}
|
||||
|
||||
//Called once per frame while the action is active.
|
||||
protected override void OnUpdate() {
|
||||
// Accelerate gravity
|
||||
gravityPower.value += gravityAcceleration.value * Time.deltaTime;
|
||||
gravityPower.value = Mathf.Min(gravityPower.value, gravityMax.value);
|
||||
|
||||
// Apply a constant gravity if the player is grounded
|
||||
if (agent.isGrounded) {
|
||||
gravityPower.value = .1f;
|
||||
}
|
||||
|
||||
// Create the gravity direction
|
||||
float gravityMoveDirection = jumpPower.value + Physics.gravity.y * gravityPower.value;
|
||||
|
||||
// Commit gravity to move direction, ignoring XZ since those are done in UpdateMovementDirection
|
||||
moveDirection.value = new Vector3(moveDirection.value.x, gravityMoveDirection, moveDirection.value.z);
|
||||
|
||||
Debug.Log("Gravity Done");
|
||||
|
||||
EndAction(true);
|
||||
|
||||
}
|
||||
public void LateUpdate(){
|
||||
// Decay jump power
|
||||
jumpPower.value = Mathf.Lerp(jumpPower.value, 0f, jumpPowerDecay.value * Time.deltaTime);
|
||||
}
|
||||
|
||||
|
||||
//Called when the task is disabled.
|
||||
protected override void OnStop() {
|
||||
|
||||
}
|
||||
|
||||
//Called when the task is paused.
|
||||
protected override void OnPause() {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5531fbd949d33204690c98dd89a5e97f
|
||||
118
Assets/Scripts/Core/Graph Tasks/UpdateMovementDirection.cs
Normal file
118
Assets/Scripts/Core/Graph Tasks/UpdateMovementDirection.cs
Normal file
@@ -0,0 +1,118 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using NodeCanvas.Framework;
|
||||
using ParadoxNotion.Design;
|
||||
using ParadoxNotion.Services;
|
||||
using Unity.Cinemachine;
|
||||
using Unity.Mathematics;
|
||||
using UnityEngine;
|
||||
using Reset.Movement;
|
||||
using Reset.Units;
|
||||
|
||||
namespace NodeCanvas.Tasks.Actions {
|
||||
|
||||
[Category("Reset/Movement")]
|
||||
[Description("Finalizes movement and sends the final move commands to the controller")]
|
||||
// TODO: Rename to UpdateMovementDirection
|
||||
public class UpdateMovementDirection : ActionTask<CharacterController>{
|
||||
[ParadoxNotion.Design.Header("References")]
|
||||
public BBParameter<Vector3> moveDirection;
|
||||
// TODO: Remove this reference and let each copy of this use their own settings.
|
||||
public BBParameter<PlayerFacingDirection> playerFacingDirection;
|
||||
|
||||
[ParadoxNotion.Design.Header("Settings")]
|
||||
public BBParameter<float> accelerationSmoothing = 5f;
|
||||
public BBParameter<float> deaccelerationSmoothing = 5f;
|
||||
public BBParameter<AnimationCurve> deaccelerationCurve;
|
||||
|
||||
public BBParameter<float> directionChangeMinimumMagnitude; // Unused. Use to only make input change if it's over a certain input threshold. Maybe smoothing can affect this?
|
||||
|
||||
private float lastLookMagnitude;
|
||||
private Vector3 currentMoveDir;
|
||||
|
||||
// References
|
||||
private PlayerControls controls;
|
||||
|
||||
//Use for initialization. This is called only once in the lifetime of the task.
|
||||
//Return null if init was successfull. Return an error string otherwise
|
||||
protected override string OnInit() {
|
||||
// Reference to controls
|
||||
controls = agent.GetComponent<PlayerControls>();
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
//This is called once each time the task is enabled.
|
||||
//Call EndAction() to mark the action as finished, either in success or failure.
|
||||
//EndAction can be called from anywhere.
|
||||
protected override void OnExecute(){
|
||||
// Initialize the smoothed direction with the value as is on input
|
||||
// currentMoveDir = new Vector3(moveDirection.value.x, moveDirection.value.y, moveDirection.value.z);
|
||||
}
|
||||
|
||||
//Called once per frame while the action is active.
|
||||
protected override void OnUpdate(){
|
||||
// Construct move direction
|
||||
Vector3 targetDirection = moveDirection.value;
|
||||
|
||||
// Get input value
|
||||
Vector3 inputMovement = new Vector3(controls.rawMoveInput.x, 0f, controls.rawMoveInput.y);
|
||||
|
||||
if (inputMovement.magnitude < .1f) {
|
||||
inputMovement = Vector3.zero;
|
||||
}
|
||||
|
||||
// Change how movement is managed based on facing state
|
||||
switch (playerFacingDirection.value) {
|
||||
case PlayerFacingDirection.TowardsTarget:
|
||||
break;
|
||||
case PlayerFacingDirection.MatchForward: // TODO: Recomment
|
||||
// targetDirection = agent.transform.forward * inputMovement.magnitude;
|
||||
targetDirection = inputMovement;
|
||||
break;
|
||||
case PlayerFacingDirection.MatchCamera:
|
||||
targetDirection = Quaternion.Euler(Camera.main.transform.forward.DirectionTo(agent.transform.forward)) * inputMovement; // NOTE: This used to be t: currentRotSpeed * Time.deltaTime.
|
||||
// See how it feels with a hard set value and go fro there.
|
||||
break;
|
||||
case PlayerFacingDirection.Static:
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
|
||||
// Remove Y from variables
|
||||
Vector3 targetNoY = new Vector3(targetDirection.x, 0f, targetDirection.z);
|
||||
Vector3 currentNoY = new Vector3(currentMoveDir.x, 0f, currentMoveDir.z);
|
||||
|
||||
// Smooth movement
|
||||
if (targetNoY.magnitude > currentNoY.magnitude) {
|
||||
currentMoveDir = Vector3.Lerp(currentMoveDir, targetNoY,accelerationSmoothing.value * Time.deltaTime);
|
||||
|
||||
} else {
|
||||
float deaccelValue = deaccelerationCurve.value.Evaluate(inputMovement.magnitude);
|
||||
|
||||
currentMoveDir = Vector3.Lerp(currentMoveDir, targetNoY, deaccelerationSmoothing.value * Time.deltaTime);
|
||||
}
|
||||
|
||||
|
||||
currentMoveDir.y = moveDirection.value.y;
|
||||
// Commit move direction
|
||||
moveDirection.value = currentMoveDir;
|
||||
// Debug.Log(moveDirection.value);
|
||||
EndAction(true);
|
||||
}
|
||||
|
||||
// Gravity is processed in LateUpdate (added to MonoManager's onLateUpdate in OnInit())
|
||||
|
||||
|
||||
//Called when the task is disabled.
|
||||
protected override void OnStop() {
|
||||
EndAction(true);
|
||||
}
|
||||
|
||||
//Called when the task is paused.
|
||||
protected override void OnPause() {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
60
Assets/Scripts/Core/Graph Tasks/UpdateMovementSpeed.cs
Normal file
60
Assets/Scripts/Core/Graph Tasks/UpdateMovementSpeed.cs
Normal file
@@ -0,0 +1,60 @@
|
||||
using System;
|
||||
using NodeCanvas.Framework;
|
||||
using ParadoxNotion.Design;
|
||||
using UnityEngine;
|
||||
|
||||
|
||||
namespace Reset.Movement {
|
||||
|
||||
[Category("Reset/Movement")]
|
||||
[Description("Updates the movespeed for this agent")]
|
||||
public class UpdateMovementSpeed : ActionTask{
|
||||
public BBParameter<float> target;
|
||||
public BBParameter<float> speed;
|
||||
public BBParameter<float> smoothing = 10f;
|
||||
|
||||
private float currentSpeed;
|
||||
|
||||
//Use for initialization. This is called only once in the lifetime of the task.
|
||||
//Return null if init was successfull. Return an error string otherwise
|
||||
protected override string OnInit() {
|
||||
if (!speed.useBlackboard) {
|
||||
Debug.LogError("This <b>Update Movement Speed</b> does not have it's current value attached to a Blackboard variable. Nothing will happen.", agent.gameObject);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
//This is called once each time the task is enabled.
|
||||
//Call EndAction() to mark the action as finished, either in success or failure.
|
||||
//EndAction can be called from anywhere.
|
||||
protected override void OnExecute(){
|
||||
// currentSpeed = speed.value;
|
||||
|
||||
}
|
||||
|
||||
//Called once per frame while the action is active.
|
||||
protected override void OnUpdate(){
|
||||
currentSpeed = Mathf.Lerp(currentSpeed, target.value, smoothing.value * Time.deltaTime);
|
||||
|
||||
speed.value = currentSpeed;
|
||||
|
||||
if (Mathf.Abs(currentSpeed - speed.value) < .01f) {
|
||||
|
||||
}
|
||||
|
||||
Debug.Log("Speed Done");
|
||||
EndAction(true);
|
||||
}
|
||||
|
||||
//Called when the task is disabled.
|
||||
protected override void OnStop() {
|
||||
|
||||
}
|
||||
|
||||
//Called when the task is paused.
|
||||
protected override void OnPause() {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6a4c5896d783ad845861edd0c9eea14b
|
||||
88
Assets/Scripts/Core/Graph Tasks/UpdateRotation.cs
Normal file
88
Assets/Scripts/Core/Graph Tasks/UpdateRotation.cs
Normal file
@@ -0,0 +1,88 @@
|
||||
using NodeCanvas.Framework;
|
||||
using ParadoxNotion.Design;
|
||||
using Reset.Movement;
|
||||
using UnityEngine;
|
||||
using UnityEngine.TextCore.Text;
|
||||
|
||||
|
||||
namespace Reset.Player.Movement {
|
||||
[Category("Reset/Movement")]
|
||||
[Description("Finalizes the character rotation and commits it to the Transform")]
|
||||
// TODO: Rename to UpdateRotation
|
||||
public class UpdateRotation : ActionTask<CharacterController> {
|
||||
// Rotation
|
||||
public BBParameter<Vector3> moveDirection;
|
||||
|
||||
public BBParameter<PlayerFacingDirection> playerFacingDirection;
|
||||
public BBParameter<float> rotationSpeed = 5f;
|
||||
public BBParameter<float> rotationSmoothing;
|
||||
|
||||
private Vector3 currentMoveDir;
|
||||
private PlayerControls controls;
|
||||
|
||||
private Quaternion targetRotation;
|
||||
private float currentRotSpeed;
|
||||
|
||||
[ShowIf("playerFacingDirection", 0)]
|
||||
public Vector3 rotationTargetPosition;
|
||||
|
||||
//Use for initialization. This is called only once in the lifetime of the task.
|
||||
//Return null if init was successfull. Return an error string otherwise
|
||||
protected override string OnInit() {
|
||||
controls = agent.GetComponent<PlayerControls>();
|
||||
return null;
|
||||
}
|
||||
|
||||
//Called once per frame while the action is active.
|
||||
protected override void OnUpdate() {
|
||||
// Calculate rotation speed
|
||||
currentRotSpeed = Mathf.Lerp(currentRotSpeed, rotationSpeed.value, rotationSmoothing.value * Time.deltaTime);
|
||||
|
||||
// Set ingitial rotation power
|
||||
currentRotSpeed = rotationSpeed.value;
|
||||
|
||||
// Get input value
|
||||
Vector3 inputMovement = new Vector3(controls.rawMoveInput.x, 0f, controls.rawMoveInput.y);
|
||||
|
||||
switch (playerFacingDirection.value) {
|
||||
case PlayerFacingDirection.TowardsTarget:
|
||||
// Set rotation to just the direction of the target
|
||||
targetRotation = Quaternion.LookRotation((agent.transform.position.DirectionTo(rotationTargetPosition)).Flatten(null, 0));
|
||||
|
||||
break;
|
||||
case PlayerFacingDirection.MatchForward:
|
||||
if (controls.rawMoveInput.magnitude < 0.01f) { break; }
|
||||
|
||||
targetRotation = Quaternion.LookRotation(inputMovement) *
|
||||
Quaternion.Euler(Camera.main.transform.rotation.eulerAngles.Flatten(0f, null, 0f));
|
||||
|
||||
break;
|
||||
case PlayerFacingDirection.MatchCamera:
|
||||
// Craft a new rotation that flattens the camera's rotation to the ground
|
||||
// Needed to keep the character from inheriting the camera's height-rotation
|
||||
targetRotation = Quaternion.Euler(Camera.main.transform.rotation.eulerAngles.Flatten(0, null, 0));
|
||||
break;
|
||||
case PlayerFacingDirection.Static:
|
||||
targetRotation = agent.transform.rotation;
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
// Set final rotation
|
||||
agent.transform.rotation = Quaternion.Lerp(agent.transform.rotation, targetRotation, 10f * Time.deltaTime).Flatten(0, null, 0);
|
||||
|
||||
Debug.Log("Rotation Done");
|
||||
EndAction(true);
|
||||
}
|
||||
|
||||
//Called when the task is disabled.
|
||||
protected override void OnStop() {
|
||||
|
||||
}
|
||||
|
||||
//Called when the task is paused.
|
||||
protected override void OnPause() {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
2
Assets/Scripts/Core/Graph Tasks/UpdateRotation.cs.meta
Normal file
2
Assets/Scripts/Core/Graph Tasks/UpdateRotation.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7a0fd0ebfb8888b4e8ab4c81fb3aa6c0
|
||||
488
Assets/Scripts/Core/ValueGroup.cs
Normal file
488
Assets/Scripts/Core/ValueGroup.cs
Normal file
@@ -0,0 +1,488 @@
|
||||
using System;
|
||||
using ParadoxNotion.Design;
|
||||
using Reset.Core;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Reset.Core{
|
||||
// Individual bool setting for each ring. Three of these will be used.
|
||||
public struct OrbitalFollowValueGroup{
|
||||
public string label;
|
||||
|
||||
public ValueChangeAction changeHeight;
|
||||
public float height;
|
||||
|
||||
public ValueChangeAction changeRadius;
|
||||
public float radius;
|
||||
|
||||
public OrbitalFollowValueGroup(string newLabel){
|
||||
label = newLabel;
|
||||
changeHeight = ValueChangeAction.NoChange;
|
||||
height = 0f;
|
||||
changeRadius = ValueChangeAction.NoChange;
|
||||
radius = 0f;
|
||||
}
|
||||
}
|
||||
|
||||
// Enum options for individual camera settings
|
||||
public enum ValueChangeAction{
|
||||
NoChange,
|
||||
NewValue,
|
||||
ResetValue,
|
||||
RelativeValue, // Placeholder for using as altering existing value
|
||||
}
|
||||
|
||||
public struct CurveValueGroup{
|
||||
public string label;
|
||||
public AnimationCurve newValue;
|
||||
|
||||
public ValueChangeAction changeValue;
|
||||
|
||||
public CurveValueGroup(string newLabel){
|
||||
changeValue = ValueChangeAction.NoChange;
|
||||
|
||||
newValue = new AnimationCurve();
|
||||
label = newLabel;
|
||||
}
|
||||
}
|
||||
|
||||
public struct EnumValueGroup{
|
||||
public string label;
|
||||
public Enum newValue;
|
||||
|
||||
public ValueChangeAction changeValue;
|
||||
|
||||
public EnumValueGroup(string newLabel, Enum enumType){
|
||||
changeValue = ValueChangeAction.NoChange;
|
||||
|
||||
newValue = enumType;
|
||||
label = newLabel;
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public struct Vector3ValueGroup{
|
||||
public string label;
|
||||
public Vector3 newValue;
|
||||
|
||||
public ValueChangeAction changeX;
|
||||
public ValueChangeAction changeY;
|
||||
public ValueChangeAction changeZ;
|
||||
|
||||
public Vector3ValueGroup(string newLabel){
|
||||
changeX = ValueChangeAction.NoChange;
|
||||
changeY = ValueChangeAction.NoChange;
|
||||
changeZ = ValueChangeAction.NoChange;
|
||||
|
||||
newValue = Vector3.zero;
|
||||
label = newLabel;
|
||||
}
|
||||
}
|
||||
|
||||
public struct Vector2ValueGroup{
|
||||
public string label;
|
||||
public Vector2 newValue;
|
||||
|
||||
public ValueChangeAction changeX;
|
||||
public ValueChangeAction changeY;
|
||||
|
||||
public Vector2ValueGroup(string newLabel){
|
||||
changeX = ValueChangeAction.NoChange;
|
||||
changeY = ValueChangeAction.NoChange;
|
||||
|
||||
newValue = Vector2.zero;
|
||||
label = newLabel;
|
||||
}
|
||||
}
|
||||
|
||||
public struct FloatValueGroup{
|
||||
public string label;
|
||||
public float value;
|
||||
|
||||
public ValueChangeAction changeValue;
|
||||
|
||||
public FloatValueGroup(string newLabel){
|
||||
label = newLabel;
|
||||
value = 0f;
|
||||
changeValue = ValueChangeAction.NoChange;
|
||||
}
|
||||
}
|
||||
|
||||
public struct BoolValueGroup{
|
||||
public string label;
|
||||
public bool value;
|
||||
|
||||
public ValueChangeAction changeValue;
|
||||
|
||||
public BoolValueGroup(string newLabel){
|
||||
label = newLabel;
|
||||
value = true;
|
||||
changeValue = ValueChangeAction.NoChange;
|
||||
}
|
||||
}
|
||||
|
||||
#if UNITY_EDITOR
|
||||
public class BoolValueGroupDrawer : ObjectDrawer<BoolValueGroup> {
|
||||
public override BoolValueGroup OnGUI(GUIContent content, BoolValueGroup _instance){
|
||||
// Remove label for floats
|
||||
EditorGUIUtility.labelWidth = 50;
|
||||
|
||||
// Set layout options for the label and the float fields
|
||||
GUILayoutOption[] floatOptions = new GUILayoutOption[] {
|
||||
GUILayout.Width(80.0f),
|
||||
GUILayout.MinWidth(20.0f),
|
||||
GUILayout.ExpandWidth(true),
|
||||
};
|
||||
|
||||
GUILayoutOption[] labelOptions = new GUILayoutOption[]{
|
||||
GUILayout.Width(200.0f),
|
||||
};
|
||||
|
||||
// Start the Vertical layout then add the label before adding a horizontal so the label will be on top of side-by-side options
|
||||
GUILayout.BeginVertical();
|
||||
GUILayout.Label(_instance.label, labelOptions);
|
||||
GUILayout.BeginHorizontal();
|
||||
|
||||
// Create the x settings enum
|
||||
_instance.changeValue = (ValueChangeAction)EditorGUILayout.EnumPopup("", instance.changeValue);
|
||||
|
||||
// Create the value/disabled information field
|
||||
if (_instance.changeValue == ValueChangeAction.NewValue){
|
||||
_instance.value = EditorGUILayout.Toggle(_instance.value, floatOptions);
|
||||
} else {
|
||||
EditorGUI.BeginDisabledGroup(true);
|
||||
EditorGUILayout.TextField(_instance.changeValue == ValueChangeAction.NoChange ? "Unchanged" : "Reset", floatOptions);
|
||||
EditorGUI.EndDisabledGroup();
|
||||
}
|
||||
|
||||
// Close this line up
|
||||
GUILayout.EndHorizontal();
|
||||
GUILayout.EndVertical();
|
||||
|
||||
// Reset to default so the rest of things don't get messed up
|
||||
EditorGUIUtility.labelWidth = 0;
|
||||
return _instance;
|
||||
}
|
||||
}
|
||||
|
||||
public class CurveVlueGroupDrawer : ObjectDrawer<CurveValueGroup> {
|
||||
public override CurveValueGroup OnGUI(GUIContent _content, CurveValueGroup _instance){
|
||||
// Remove label for floats
|
||||
EditorGUIUtility.labelWidth = 50;
|
||||
|
||||
// Set layout options for the label and the float fields
|
||||
GUILayoutOption[] floatOptions = new GUILayoutOption[] {
|
||||
GUILayout.Width(80.0f),
|
||||
GUILayout.MinWidth(20.0f),
|
||||
GUILayout.ExpandWidth(true),
|
||||
};
|
||||
|
||||
GUILayoutOption[] labelOptions = new GUILayoutOption[]{
|
||||
GUILayout.Width(200.0f),
|
||||
};
|
||||
|
||||
// Start the Vertical layout then add the label before adding a horizontal so the label will be on top of side-by-side options
|
||||
GUILayout.BeginVertical();
|
||||
GUILayout.Label(_instance.label, labelOptions);
|
||||
GUILayout.BeginHorizontal();
|
||||
|
||||
// Create the x settings enum
|
||||
_instance.changeValue = (ValueChangeAction)EditorGUILayout.EnumPopup("", instance.changeValue);
|
||||
|
||||
// Create the value/disabled information field
|
||||
if (_instance.changeValue == ValueChangeAction.NewValue){
|
||||
_instance.newValue = EditorGUILayout.CurveField(_instance.newValue, floatOptions);
|
||||
} else {
|
||||
EditorGUI.BeginDisabledGroup(true);
|
||||
EditorGUILayout.TextField(_instance.changeValue == ValueChangeAction.NoChange ? "Unchanged" : "Reset", floatOptions);
|
||||
EditorGUI.EndDisabledGroup();
|
||||
}
|
||||
|
||||
// Close this line up
|
||||
GUILayout.EndHorizontal();
|
||||
GUILayout.EndVertical();
|
||||
|
||||
// Reset to default so the rest of things don't get messed up
|
||||
EditorGUIUtility.labelWidth = 0;
|
||||
return _instance;
|
||||
}
|
||||
}
|
||||
|
||||
public class EnumValueGroupDrawer : ObjectDrawer<EnumValueGroup>{
|
||||
public override EnumValueGroup OnGUI(GUIContent _content, EnumValueGroup _instance){
|
||||
// Set layout options for the label and the float fields
|
||||
GUILayoutOption[] floatOptions = new GUILayoutOption[] {
|
||||
GUILayout.Width(200.0f),
|
||||
GUILayout.MinWidth(100.0f),
|
||||
GUILayout.ExpandWidth(true),
|
||||
};
|
||||
|
||||
GUILayoutOption[] labelOptions = new GUILayoutOption[]{
|
||||
GUILayout.Width(200.0f),
|
||||
};
|
||||
|
||||
// Start the Vertical layout then add the label before adding a horizontal so the label will be on top of side-by-side options
|
||||
GUILayout.BeginVertical();
|
||||
GUILayout.Label(_instance.label, labelOptions);
|
||||
GUILayout.BeginHorizontal();
|
||||
|
||||
// Create the x settings enum
|
||||
_instance.changeValue = (ValueChangeAction)EditorGUILayout.EnumPopup("", instance.changeValue);
|
||||
|
||||
// Create the value/disabled information field
|
||||
if (_instance.changeValue == ValueChangeAction.NewValue){
|
||||
_instance.newValue = EditorGUILayout.EnumPopup("", instance.newValue, floatOptions);
|
||||
} else {
|
||||
EditorGUI.BeginDisabledGroup(true);
|
||||
EditorGUILayout.TextField(_instance.changeValue == ValueChangeAction.NoChange ? "Unchanged" : "Reset", floatOptions);
|
||||
EditorGUI.EndDisabledGroup();
|
||||
}
|
||||
|
||||
// Close this line up
|
||||
GUILayout.EndHorizontal();
|
||||
GUILayout.EndVertical();
|
||||
|
||||
// Reset to default so the rest of things don't get messed up
|
||||
EditorGUIUtility.labelWidth = 0;
|
||||
return _instance;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
public class FloatValueGroupDrawer : ObjectDrawer<FloatValueGroup> {
|
||||
public override FloatValueGroup OnGUI(GUIContent _content, FloatValueGroup _instance){
|
||||
// Remove label for floats
|
||||
EditorGUIUtility.labelWidth = 50;
|
||||
|
||||
// Set layout options for the label and the float fields
|
||||
GUILayoutOption[] floatOptions = new GUILayoutOption[] {
|
||||
GUILayout.Width(80.0f),
|
||||
GUILayout.MinWidth(20.0f),
|
||||
GUILayout.ExpandWidth(true),
|
||||
};
|
||||
|
||||
GUILayoutOption[] labelOptions = new GUILayoutOption[]{
|
||||
GUILayout.Width(200.0f),
|
||||
};
|
||||
|
||||
// Start the Vertical layout then add the label before adding a horizontal so the label will be on top of side-by-side options
|
||||
GUILayout.BeginVertical();
|
||||
GUILayout.Label(_instance.label, labelOptions);
|
||||
GUILayout.BeginHorizontal();
|
||||
|
||||
// Create the x settings enum
|
||||
_instance.changeValue = (ValueChangeAction)EditorGUILayout.EnumPopup("", instance.changeValue);
|
||||
|
||||
// Create the value/disabled information field
|
||||
if (_instance.changeValue == ValueChangeAction.NewValue){
|
||||
_instance.value = EditorGUILayout.FloatField(_instance.value, floatOptions);
|
||||
} else {
|
||||
EditorGUI.BeginDisabledGroup(true);
|
||||
EditorGUILayout.TextField(_instance.changeValue == ValueChangeAction.NoChange ? "Unchanged" : "Reset", floatOptions);
|
||||
EditorGUI.EndDisabledGroup();
|
||||
}
|
||||
|
||||
// Close this line up
|
||||
GUILayout.EndHorizontal();
|
||||
GUILayout.EndVertical();
|
||||
|
||||
// Reset to default so the rest of things don't get messed up
|
||||
EditorGUIUtility.labelWidth = 0;
|
||||
return _instance;
|
||||
}
|
||||
}
|
||||
|
||||
public class Vector3ValueGroupDrawer : ObjectDrawer<Vector3ValueGroup> {
|
||||
public override Vector3ValueGroup OnGUI(GUIContent _content, Vector3ValueGroup _instance){
|
||||
// Remove label for floats
|
||||
EditorGUIUtility.labelWidth = 20;
|
||||
|
||||
// Set layout options for the label and the float fields
|
||||
GUILayoutOption[] floatOptions = new GUILayoutOption[] {
|
||||
GUILayout.Width(300.0f),
|
||||
GUILayout.MinWidth(20.0f),
|
||||
GUILayout.ExpandWidth(true),
|
||||
};
|
||||
|
||||
GUILayoutOption[] labelOptions = new GUILayoutOption[]{
|
||||
GUILayout.Width(200.0f),
|
||||
};
|
||||
|
||||
// Start the Vertical layout then add the label before adding a horizontal so the label will be on top of side-by-side options
|
||||
GUILayout.BeginVertical();
|
||||
GUILayout.Label(_instance.label, labelOptions);
|
||||
GUILayout.BeginHorizontal();
|
||||
|
||||
// Create the x settings enum
|
||||
_instance.changeX = (ValueChangeAction)EditorGUILayout.EnumPopup("", instance.changeX);
|
||||
|
||||
// Create the value/disabled information field
|
||||
if (_instance.changeX == ValueChangeAction.NewValue){
|
||||
_instance.newValue.x = EditorGUILayout.FloatField(_instance.newValue.x, floatOptions);
|
||||
} else {
|
||||
EditorGUI.BeginDisabledGroup(true);
|
||||
EditorGUILayout.TextField(_instance.changeX == ValueChangeAction.NoChange ? "Unchanged" : "Reset", floatOptions);
|
||||
EditorGUI.EndDisabledGroup();
|
||||
}
|
||||
|
||||
// It do what it do.
|
||||
GUILayout.Space(5);
|
||||
|
||||
// Create the y settings enum
|
||||
_instance.changeY = (ValueChangeAction)EditorGUILayout.EnumPopup("", _instance.changeY);
|
||||
|
||||
// Create the value/disabled information field
|
||||
if (_instance.changeY == ValueChangeAction.NewValue){
|
||||
_instance.newValue.y = EditorGUILayout.FloatField(_instance.newValue.y, floatOptions);
|
||||
} else {
|
||||
EditorGUI.BeginDisabledGroup(true);
|
||||
EditorGUILayout.TextField(_instance.changeY == ValueChangeAction.NoChange ? "Unchanged" : "Reset", floatOptions);
|
||||
EditorGUI.EndDisabledGroup();
|
||||
}
|
||||
|
||||
// It do what it do.
|
||||
GUILayout.Space(5);
|
||||
|
||||
// Create the y settings enum
|
||||
_instance.changeZ = (ValueChangeAction)EditorGUILayout.EnumPopup("", _instance.changeZ);
|
||||
|
||||
// Create the value/disabled information field
|
||||
if (_instance.changeZ == ValueChangeAction.NewValue){
|
||||
_instance.newValue.z = EditorGUILayout.FloatField(_instance.newValue.z, floatOptions);
|
||||
} else {
|
||||
EditorGUI.BeginDisabledGroup(true);
|
||||
EditorGUILayout.TextField(_instance.changeZ == ValueChangeAction.NoChange ? "Unchanged" : "Reset", floatOptions);
|
||||
EditorGUI.EndDisabledGroup();
|
||||
}
|
||||
|
||||
// Close this line up
|
||||
GUILayout.EndHorizontal();
|
||||
GUILayout.EndVertical();
|
||||
|
||||
// Reset to default so the rest of things don't get messed up
|
||||
EditorGUIUtility.labelWidth = 0;
|
||||
return _instance;
|
||||
}
|
||||
}
|
||||
|
||||
public class Vector2ValueGroupDrawer : ObjectDrawer<Vector2ValueGroup> {
|
||||
public override Vector2ValueGroup OnGUI(GUIContent _content, Vector2ValueGroup _instance){
|
||||
// Remove label for floats
|
||||
EditorGUIUtility.labelWidth = 50;
|
||||
|
||||
// Set layout options for the label and the float fields
|
||||
GUILayoutOption[] floatOptions = new GUILayoutOption[] {
|
||||
GUILayout.Width(300.0f),
|
||||
GUILayout.MinWidth(20.0f),
|
||||
GUILayout.ExpandWidth(true),
|
||||
};
|
||||
|
||||
GUILayoutOption[] labelOptions = new GUILayoutOption[]{
|
||||
GUILayout.Width(200.0f),
|
||||
};
|
||||
|
||||
// Start the Vertical layout then add the label before adding a horizontal so the label will be on top of side-by-side options
|
||||
GUILayout.BeginVertical();
|
||||
GUILayout.Label(_instance.label, labelOptions);
|
||||
GUILayout.BeginHorizontal();
|
||||
|
||||
// Create the x settings enum
|
||||
_instance.changeX = (ValueChangeAction)EditorGUILayout.EnumPopup("", instance.changeX);
|
||||
|
||||
// Create the value/disabled information field
|
||||
if (_instance.changeX == ValueChangeAction.NewValue){
|
||||
_instance.newValue.x = EditorGUILayout.FloatField(_instance.newValue.x, floatOptions);
|
||||
} else {
|
||||
EditorGUI.BeginDisabledGroup(true);
|
||||
EditorGUILayout.TextField(_instance.changeX == ValueChangeAction.NoChange ? "Unchanged" : "Reset", floatOptions);
|
||||
EditorGUI.EndDisabledGroup();
|
||||
}
|
||||
|
||||
// It do what it do.
|
||||
GUILayout.Space(5);
|
||||
|
||||
// Create the y settings enum
|
||||
_instance.changeY = (ValueChangeAction)EditorGUILayout.EnumPopup("", _instance.changeY);
|
||||
|
||||
// Create the value/disabled information field
|
||||
if (_instance.changeY == ValueChangeAction.NewValue){
|
||||
_instance.newValue.y = EditorGUILayout.FloatField(_instance.newValue.y, floatOptions);
|
||||
} else {
|
||||
EditorGUI.BeginDisabledGroup(true);
|
||||
EditorGUILayout.TextField(_instance.changeY == ValueChangeAction.NoChange ? "Unchanged" : "Reset", floatOptions);
|
||||
EditorGUI.EndDisabledGroup();
|
||||
}
|
||||
|
||||
// Close this line up
|
||||
GUILayout.EndHorizontal();
|
||||
GUILayout.EndVertical();
|
||||
|
||||
// Reset to default so the rest of things don't get messed up
|
||||
EditorGUIUtility.labelWidth = 0;
|
||||
return _instance;
|
||||
}
|
||||
}
|
||||
|
||||
// Custom editor for each orbital follow ring setting
|
||||
public class OrbitalFollowValueGroupDrawer : ObjectDrawer<OrbitalFollowValueGroup>{
|
||||
public override OrbitalFollowValueGroup OnGUI(GUIContent _content, OrbitalFollowValueGroup _instance){
|
||||
// Remove label for floats
|
||||
EditorGUIUtility.labelWidth = 1;
|
||||
|
||||
// Set layout options for the label and the float fields
|
||||
GUILayoutOption[] floatOptions = new GUILayoutOption[] {
|
||||
GUILayout.Width(300.0f),
|
||||
GUILayout.MinWidth(20.0f),
|
||||
GUILayout.ExpandWidth(true),
|
||||
};
|
||||
|
||||
GUILayoutOption[] labelOptions = new GUILayoutOption[]{
|
||||
GUILayout.Width(60.0f),
|
||||
};
|
||||
|
||||
// Start a Horiztonal Section
|
||||
GUILayout.BeginHorizontal();
|
||||
|
||||
// Add the left side label
|
||||
GUILayout.Label(_instance.label, labelOptions);
|
||||
|
||||
// Create the height settings enum
|
||||
_instance.changeHeight = (ValueChangeAction)EditorGUILayout.EnumPopup("", _instance.changeHeight);
|
||||
|
||||
// Create the value/disabled information field
|
||||
if (_instance.changeHeight == ValueChangeAction.NewValue){
|
||||
_instance.height = EditorGUILayout.FloatField(_instance.height, floatOptions);
|
||||
} else {
|
||||
EditorGUI.BeginDisabledGroup(true);
|
||||
EditorGUILayout.TextField(_instance.changeHeight == ValueChangeAction.NoChange ? "Unchanged" : "Reset", floatOptions);
|
||||
EditorGUI.EndDisabledGroup();
|
||||
}
|
||||
|
||||
// It do what it do.
|
||||
GUILayout.Space(5);
|
||||
|
||||
// Create the radius settings enum
|
||||
_instance.changeRadius = (ValueChangeAction)EditorGUILayout.EnumPopup("", _instance.changeRadius);
|
||||
|
||||
// Create the value/disabled information field
|
||||
if (_instance.changeRadius == ValueChangeAction.NewValue){
|
||||
_instance.radius = EditorGUILayout.FloatField(_instance.radius, floatOptions);
|
||||
} else {
|
||||
EditorGUI.BeginDisabledGroup(true);
|
||||
EditorGUILayout.TextField(_instance.changeRadius == ValueChangeAction.NoChange ? "Unchanged" : "Reset", floatOptions);
|
||||
EditorGUI.EndDisabledGroup();
|
||||
}
|
||||
|
||||
// Close this line up
|
||||
GUILayout.EndHorizontal();
|
||||
|
||||
// Reset to default so the rest of things don't get messed up
|
||||
EditorGUIUtility.labelWidth = 0;
|
||||
return _instance;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
2
Assets/Scripts/Core/ValueGroup.cs.meta
Normal file
2
Assets/Scripts/Core/ValueGroup.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 111e95d8d161f7d4887fa7ccfa6d1454
|
||||
@@ -5,12 +5,10 @@ using Sirenix.OdinInspector;
|
||||
|
||||
public class Player : MonoBehaviour{
|
||||
[HideInInspector] public PlayerControls controls;
|
||||
[HideInInspector] public PlayerMovement movement;
|
||||
[HideInInspector] public new PlayerCamera camera;
|
||||
|
||||
void Awake(){
|
||||
controls = GetComponent<PlayerControls>();
|
||||
movement = GetComponent<PlayerMovement>();
|
||||
}
|
||||
|
||||
void Start()
|
||||
|
||||
@@ -145,11 +145,23 @@ public class EnvironmentObserver{
|
||||
|
||||
// Setup the variables for boxcast, spherecast, etc
|
||||
// Create an offset start point for the center of the wirebox, since gizmos are drawn with their pivot in the center.
|
||||
Vector3 offsetWithRotationAndLength = (Quaternion.LookRotation(direction) * Quaternion.Euler(rotation)) * (Vector3.forward * (length / 2));
|
||||
Vector3 offsetWithRotationAndLength;
|
||||
if (direction == Vector3.zero) {
|
||||
offsetWithRotationAndLength = Quaternion.Euler(rotation) * (Vector3.forward * (length / 2));
|
||||
} else {
|
||||
offsetWithRotationAndLength = Quaternion.LookRotation(direction) * Quaternion.Euler(rotation) * (Vector3.forward * (length / 2));
|
||||
}
|
||||
|
||||
Vector3 offsetFromCenter = relativeStartWithRotation + source.transform.rotation * offsetWithRotationAndLength;
|
||||
|
||||
|
||||
// Also create a rotation for use with the gizmos. Mainly just to shorten the lines
|
||||
Quaternion gizmosRotation = source.transform.rotation * Quaternion.LookRotation(direction) * Quaternion.Euler(rotation);
|
||||
Quaternion gizmosRotation;
|
||||
|
||||
if (direction == Vector3.zero) {
|
||||
gizmosRotation = source.transform.rotation * Quaternion.Euler(rotation);
|
||||
} else {
|
||||
gizmosRotation = source.transform.rotation * Quaternion.LookRotation(direction) * Quaternion.Euler(rotation);
|
||||
}
|
||||
Vector3 firstBoxOffset = gizmosRotation * (Vector3.forward * size.z);
|
||||
|
||||
Color gizmoColor = Evaluate(source) ? Color.green : Color.red;
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
using UnityEngine;
|
||||
using Drawing;
|
||||
|
||||
public class PlayerMovement : MonoBehaviour
|
||||
{
|
||||
// Raycasts
|
||||
public RaycastHit forwardRay;
|
||||
public RaycastHit leftRay;
|
||||
public RaycastHit rightRay;
|
||||
|
||||
// References
|
||||
private Player thisPlayer;
|
||||
|
||||
void Awake(){
|
||||
thisPlayer = GetComponent<Player>();
|
||||
}
|
||||
|
||||
// void Update(){
|
||||
// // Create Ray Colors
|
||||
// Color forwardRayStatus = Color.red;
|
||||
// Color leftRayStatus = Color.red;
|
||||
// Color rightRayStatus = Color.red;
|
||||
//
|
||||
// if (forwardRay.collider&& forwardRay.transform.gameObject.layer == LayerMask.NameToLayer("Environment")){ forwardRayStatus = Color.green;}
|
||||
// if (leftRay.collider&& leftRay.transform.gameObject.layer == LayerMask.NameToLayer("Environment")){ leftRayStatus = Color.green;}
|
||||
// if (rightRay.collider&& rightRay.transform.gameObject.layer == LayerMask.NameToLayer("Environment")){ rightRayStatus = Color.green;}
|
||||
//
|
||||
// using (Draw.WithColor(forwardRayStatus)) {
|
||||
// Draw.Line(transform.position + transform.up, transform.position + transform.forward * 2.5f + transform.up);
|
||||
// }
|
||||
//
|
||||
// using (Draw.WithColor(leftRayStatus)) {
|
||||
// Draw.Line(transform.position + transform.up, transform.position + -transform.right * 2f + transform.up);
|
||||
// }
|
||||
//
|
||||
// using (Draw.WithColor(rightRayStatus)) {
|
||||
// Draw.Line(transform.position + transform.up, transform.position + transform.right * 2f + transform.up);
|
||||
// }
|
||||
// }
|
||||
|
||||
// void FixedUpdate(){
|
||||
// LayerMask environmentLayer = LayerMask.NameToLayer("Environment");
|
||||
//
|
||||
// if (Physics.Raycast(transform.position + Vector3.up, transform.forward, out forwardRay, 2.5f, ~environmentLayer)){
|
||||
// thisPlayer.controls.graph.SendEvent("ForwardRay", true, null);
|
||||
// }
|
||||
//
|
||||
// if (Physics.Raycast(transform.position + Vector3.up, transform.position + Vector3.left, out leftRay, maxDistance: 2f, ~environmentLayer )) {
|
||||
// thisPlayer.controls.graph.SendEvent("LeftRay", true, null);
|
||||
// }
|
||||
//
|
||||
// if (Physics.Raycast(transform.position + Vector3.up, transform.position + Vector3.right, out rightRay, maxDistance: 2f, ~environmentLayer )) {
|
||||
// thisPlayer.controls.graph.SendEvent("RightRay", true, null);
|
||||
// }
|
||||
// }
|
||||
}
|
||||
257
Assets/Scripts/Player/UnitMovementHandler.cs
Normal file
257
Assets/Scripts/Player/UnitMovementHandler.cs
Normal file
@@ -0,0 +1,257 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using Drawing;
|
||||
using Reset.Movement;
|
||||
using Sirenix.OdinInspector;
|
||||
|
||||
public enum PlayerFacingDirection{
|
||||
TowardsTarget = 0,
|
||||
MatchForward,
|
||||
MatchCamera,
|
||||
Static,
|
||||
Momentum,
|
||||
SpecifiedDirection
|
||||
}
|
||||
|
||||
namespace Reset.Units{
|
||||
// public interface IBuffSource{ - Unused good idea?
|
||||
// public Object sourceObject();
|
||||
// public
|
||||
// }
|
||||
|
||||
[Serializable]
|
||||
public class UnitMovementData : ICloneable{
|
||||
// Movement Direction
|
||||
public float accelerationSmoothing = 5f;
|
||||
public float deaccelerationSmoothing = 5f;
|
||||
public AnimationCurve deaccelerationCurve;
|
||||
|
||||
// Move Speed
|
||||
public float moveSpeedTarget = 15f;
|
||||
public float moveSpeedSoothing = 10f;
|
||||
|
||||
// Jumping
|
||||
[ShowInInspector, ReadOnly] public float jumpPower;
|
||||
public float jumpPowerDecay = 3f;
|
||||
|
||||
// Gravity
|
||||
[ShowInInspector, ReadOnly] public float gravityPower;
|
||||
public float gravityMax = 8f;
|
||||
public float gravityAcceleration = 1f;
|
||||
public float gravityScale = 1f;
|
||||
|
||||
// Rotation
|
||||
[ShowInInspector, SerializeReference]
|
||||
public Enum rotateFacing;
|
||||
public float rotationSpeedTarget = 5f;
|
||||
public float rotationSmoothing = 1f;
|
||||
|
||||
public object Clone(){
|
||||
return this.MemberwiseClone();
|
||||
}
|
||||
}
|
||||
|
||||
public class UnitMovementHandler : MonoBehaviour{
|
||||
// class MovementFloatModifier{
|
||||
// // IBuffSource source
|
||||
// public float value;
|
||||
// }
|
||||
|
||||
// Debug viewing
|
||||
// Smoothed Values
|
||||
[ShowInInspector, ReadOnly] private float outputSpeed;
|
||||
[ShowInInspector, ReadOnly] private float additionalSpeed;
|
||||
[ShowInInspector, ReadOnly] private Vector3 outputMoveDirection;
|
||||
[ShowInInspector, ReadOnly] private Vector3 additionalMoveDirection;
|
||||
[ShowInInspector, ReadOnly] private Quaternion outputRotation;
|
||||
[ShowInInspector, ReadOnly] private Quaternion specifiedRotation;
|
||||
[ShowInInspector, ReadOnly] private float outputRotationSpeed;
|
||||
|
||||
|
||||
private CharacterController controller;
|
||||
public PlayerControls controls;
|
||||
|
||||
[ShowInInspector, PropertyOrder(2)]
|
||||
public UnitMovementData data = new UnitMovementData();
|
||||
|
||||
[HideInInspector]
|
||||
public UnitMovementData defaultData;
|
||||
|
||||
[Button, PropertyOrder(1)]
|
||||
void ResetMovementData(){
|
||||
data = new UnitMovementData();
|
||||
}
|
||||
|
||||
void Awake(){
|
||||
controller = GetComponent<CharacterController>();
|
||||
}
|
||||
|
||||
private void Start(){
|
||||
defaultData = (UnitMovementData)data.Clone();
|
||||
}
|
||||
|
||||
void Update(){
|
||||
UpdateCurrentDirection();
|
||||
UpdateCurrentSpeed();
|
||||
UpdateCurrentGravity();
|
||||
UpdateCurrentRotation();
|
||||
|
||||
DoMovement();
|
||||
}
|
||||
|
||||
public void AddToCurrentDirection(Vector3 inputDirection, float power){
|
||||
additionalMoveDirection += inputDirection.normalized;
|
||||
additionalSpeed = power;
|
||||
}
|
||||
|
||||
public void SetSpecifiedRotation(Quaternion inputRotation){
|
||||
specifiedRotation = inputRotation;
|
||||
}
|
||||
|
||||
private void UpdateCurrentDirection(){
|
||||
// Get input value
|
||||
Vector3 inputMovement = new Vector3(controls.rawMoveInput.x, 0f, controls.rawMoveInput.y);
|
||||
|
||||
// Construct move direction
|
||||
Vector3 targetDirection = inputMovement;
|
||||
|
||||
if (inputMovement.magnitude < .1f) {
|
||||
targetDirection = Vector3.zero;
|
||||
}
|
||||
|
||||
// Remove Y from variables
|
||||
Vector3 targetNoY = new Vector3(targetDirection.x, 0f, targetDirection.z);
|
||||
Vector3 currentNoY = new Vector3(outputMoveDirection.x, 0f, outputMoveDirection.z);
|
||||
|
||||
// Smooth movement
|
||||
if (targetNoY.magnitude > currentNoY.magnitude) {
|
||||
currentNoY = Vector3.Slerp(currentNoY, targetNoY,data.accelerationSmoothing * Time.deltaTime);
|
||||
|
||||
} else {
|
||||
// float deaccelValue = data.deaccelerationCurve.Evaluate(inputMovement.magnitude);
|
||||
|
||||
currentNoY = Vector3.Lerp(currentNoY, targetNoY, data.deaccelerationSmoothing * Time.deltaTime);
|
||||
}
|
||||
|
||||
// Commit move direction
|
||||
outputMoveDirection = new Vector3(currentNoY.x, outputMoveDirection.y, currentNoY.z);
|
||||
}
|
||||
|
||||
private void UpdateCurrentSpeed(){
|
||||
outputSpeed = Mathf.Lerp(outputSpeed, data.moveSpeedTarget, data.moveSpeedSoothing * Time.deltaTime);
|
||||
}
|
||||
|
||||
private void UpdateCurrentGravity(){
|
||||
// Accelerate gravity
|
||||
data.gravityPower += data.gravityAcceleration * Time.deltaTime;
|
||||
data.gravityPower = Mathf.Min(data.gravityPower, data.gravityMax);
|
||||
|
||||
// Apply a constant gravity if the player is grounded
|
||||
if (controller.isGrounded) {
|
||||
data.gravityPower = .1f;
|
||||
}
|
||||
|
||||
// Create the final gravity value
|
||||
float gravityMoveDirection = data.jumpPower + (Physics.gravity.y * data.gravityPower);
|
||||
|
||||
// Commit gravity to move direction, ignoring XZ since those are done in UpdateMovementDirection
|
||||
outputMoveDirection.y = gravityMoveDirection;
|
||||
}
|
||||
|
||||
private void UpdateCurrentRotation(){
|
||||
// Get input value
|
||||
Vector3 inputMovement = new Vector3(controls.rawMoveInput.x, 0f, controls.rawMoveInput.y);
|
||||
|
||||
switch (data.rotateFacing) {
|
||||
// TODO: Recomment
|
||||
case PlayerFacingDirection.TowardsTarget:
|
||||
Debug.LogError("Not implemented...");
|
||||
break;
|
||||
case PlayerFacingDirection.Momentum:
|
||||
if (inputMovement.magnitude > .03f){
|
||||
outputRotation = Camera.main.transform.rotation * Quaternion.LookRotation(outputMoveDirection);
|
||||
}
|
||||
break;
|
||||
case PlayerFacingDirection.MatchForward:
|
||||
if (controls.rawMoveInput.magnitude < 0.01f) { break; }
|
||||
outputRotation = Camera.main.transform.rotation * Quaternion.LookRotation(inputMovement);
|
||||
|
||||
break;
|
||||
case PlayerFacingDirection.MatchCamera:
|
||||
|
||||
outputRotation = Quaternion.Euler(Camera.main.transform.rotation.eulerAngles.Flatten(0, null, 0));
|
||||
break;
|
||||
case PlayerFacingDirection.Static:
|
||||
outputRotation = transform.rotation;
|
||||
break;
|
||||
case PlayerFacingDirection.SpecifiedDirection:
|
||||
outputRotation = specifiedRotation;
|
||||
break;
|
||||
}
|
||||
|
||||
// Calculate rotation speed
|
||||
outputRotationSpeed = Mathf.Lerp(outputRotationSpeed, data.rotationSpeedTarget, data.rotationSmoothing * Time.deltaTime);
|
||||
|
||||
// Set final rotation
|
||||
transform.rotation = Quaternion.Lerp(transform.rotation, outputRotation, outputRotationSpeed * Time.deltaTime).Flatten(0, null, 0);
|
||||
}
|
||||
|
||||
public void DoMovement(){
|
||||
DoMovement(outputMoveDirection, outputSpeed, data.gravityScale);
|
||||
}
|
||||
|
||||
public void DoMovement(Vector3 moveDir, float speed, float gravity){
|
||||
// Commit the move, with respect to the camera's rotation
|
||||
Vector3 moveXZDir = new Vector3(moveDir.x, 0f, moveDir.z);
|
||||
Vector3 moveYDir = new Vector3(0f, moveDir.y, 0f);
|
||||
Vector3 addDir = additionalMoveDirection;
|
||||
|
||||
moveXZDir *= speed * Time.deltaTime;
|
||||
moveYDir *= gravity * Time.deltaTime;
|
||||
addDir *= additionalSpeed * Time.deltaTime;
|
||||
|
||||
Vector3 finalDir = moveXZDir + moveYDir;
|
||||
|
||||
controller.Move((Camera.main.transform.rotation.Flatten(0, null, 0) * finalDir) + addDir);
|
||||
}
|
||||
|
||||
void LateUpdate(){
|
||||
UpdateGravityLate();
|
||||
DecayAdditionalDirection();
|
||||
}
|
||||
|
||||
void DecayAdditionalDirection(){
|
||||
// Get input value
|
||||
Vector3 inputMovement = new Vector3(controls.rawMoveInput.x, 0f, controls.rawMoveInput.y);
|
||||
|
||||
// Ignore values under deadzone
|
||||
if (inputMovement.magnitude < .1f) {
|
||||
inputMovement = Vector3.zero;
|
||||
}
|
||||
|
||||
// Remove Y from variables
|
||||
Vector3 currentNoY = new Vector3(additionalMoveDirection.x, 0f, additionalMoveDirection.z);
|
||||
|
||||
if (inputMovement.magnitude < currentNoY.magnitude) {
|
||||
additionalMoveDirection = Vector3.Slerp(additionalMoveDirection, Vector3.zero,data.accelerationSmoothing * Time.deltaTime);
|
||||
|
||||
} else {
|
||||
// float deaccelValue = data.deaccelerationCurve.Evaluate(inputMovement.magnitude);
|
||||
|
||||
additionalMoveDirection = Vector3.Lerp(additionalMoveDirection, Vector3.zero, data.deaccelerationSmoothing * Time.deltaTime);
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateGravityLate(){
|
||||
// Decay jump power
|
||||
data.jumpPower -= data.jumpPowerDecay * Time.deltaTime;
|
||||
data.jumpPower = Mathf.Max(0f, data.jumpPower);
|
||||
}
|
||||
|
||||
public void AssignNewData(UnitMovementData movementData){
|
||||
data = (UnitMovementData)movementData.Clone();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user