feat: rebuilt dragging mechanic slightly, and it's now more agnostic to collider type
This commit is contained in:
51
Assets/Scripts/Core/Graph Tasks/DragUnits.cs
Normal file
51
Assets/Scripts/Core/Graph Tasks/DragUnits.cs
Normal file
@@ -0,0 +1,51 @@
|
||||
using System.Collections.Generic;
|
||||
using NodeCanvas.Framework;
|
||||
using ParadoxNotion.Design;
|
||||
using UnityEngine;
|
||||
|
||||
|
||||
namespace Reset.Units {
|
||||
|
||||
[Category("Reset/Units/Combat")]
|
||||
[Description("Drag a collection of units along with the attackers movement or actions")]
|
||||
public class DragUnits : ActionTask<UnitCombat>{
|
||||
public BBParameter<List<Collider>> unitsToDrag;
|
||||
public BBParameter<float> dragTime;
|
||||
|
||||
//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() {
|
||||
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() {
|
||||
foreach (Collider col in unitsToDrag.value) {
|
||||
if (dragTime.value == 0f) {
|
||||
agent.AddDragCollider(col);
|
||||
} else {
|
||||
agent.AddDragCollider(col, dragTime.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() {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
2
Assets/Scripts/Core/Graph Tasks/DragUnits.cs.meta
Normal file
2
Assets/Scripts/Core/Graph Tasks/DragUnits.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a15fb8c5108ca6a47a12fcf6278579fd
|
||||
@@ -7,7 +7,8 @@ using UnityEngine;
|
||||
using Random = UnityEngine.Random;
|
||||
|
||||
public class UnitCombat : UnitComponent {
|
||||
public List<Collider> draggedUnits = new List<Collider>();
|
||||
// public List<Collider> draggedUnits = new List<Collider>();
|
||||
public Dictionary<Collider, float> draggedColliders = new Dictionary<Collider, float>();
|
||||
|
||||
private UnitMovementHandler movement;
|
||||
|
||||
@@ -18,9 +19,15 @@ public class UnitCombat : UnitComponent {
|
||||
private float speedDelta;
|
||||
private float sinAmplitude;
|
||||
private float sinOffset;
|
||||
|
||||
private List<Collider> activelyDraggedColliders;
|
||||
private List<Collider> expiredColliders;
|
||||
|
||||
void Awake(){
|
||||
movement = GetComponent<UnitMovementHandler>();
|
||||
|
||||
activelyDraggedColliders = new List<Collider>();
|
||||
expiredColliders = new List<Collider>();
|
||||
}
|
||||
|
||||
void Start(){
|
||||
@@ -31,7 +38,48 @@ public class UnitCombat : UnitComponent {
|
||||
|
||||
// Update is called once per frame
|
||||
void Update(){
|
||||
// Calculate movement for dragged units
|
||||
DragAttackedUnits();
|
||||
|
||||
// Check timers to make sure an object doesn't stay dragged
|
||||
CheckUnitTimers();
|
||||
}
|
||||
|
||||
// dragTime is set as a maximum. If no time is provided then it defaults to two seconds.
|
||||
public void AddDragCollider(Collider newCollider, float dragTime = 2f){
|
||||
if (draggedColliders.ContainsKey(newCollider)) {
|
||||
draggedColliders[newCollider] = dragTime;
|
||||
} else {
|
||||
draggedColliders.Add(newCollider, dragTime);
|
||||
activelyDraggedColliders.Add(newCollider);
|
||||
}
|
||||
}
|
||||
|
||||
public void RemoveDragCollider(Collider colliderToRemove){
|
||||
draggedColliders.Remove(colliderToRemove);
|
||||
activelyDraggedColliders.Remove(colliderToRemove);
|
||||
}
|
||||
|
||||
void CheckUnitTimers(){
|
||||
// Decrease the timer of the dragged colliders
|
||||
foreach (Collider thisCollider in activelyDraggedColliders) {
|
||||
draggedColliders[thisCollider] -= 1f * Time.deltaTime;
|
||||
|
||||
// Pend them for removal when ready
|
||||
if (draggedColliders[thisCollider] < 0f) {
|
||||
expiredColliders.Add(thisCollider);
|
||||
}
|
||||
}
|
||||
|
||||
// Remove expired colliders
|
||||
for (int i = 0; i < expiredColliders.Count; i++) {
|
||||
RemoveDragCollider(expiredColliders[i]);
|
||||
}
|
||||
|
||||
// Clear list if not empty
|
||||
if (expiredColliders.Count > 0f) {
|
||||
expiredColliders.Clear();
|
||||
}
|
||||
}
|
||||
|
||||
void DragAttackedUnits(){
|
||||
@@ -58,7 +106,7 @@ public class UnitCombat : UnitComponent {
|
||||
lastPosition = transform.position;
|
||||
|
||||
// Apply the speed, direction, and rotation to each unit
|
||||
foreach (Collider draggedUnit in draggedUnits) {
|
||||
foreach (Collider draggedUnit in activelyDraggedColliders) {
|
||||
UnitMovementHandler draggedUnitMovement = draggedUnit.GetComponent<UnitMovementHandler>();
|
||||
if (!draggedUnitMovement) {
|
||||
Debug.LogError($"No available UnitMovement on {draggedUnit.name}. Aborting drag on this unit.");
|
||||
|
||||
Reference in New Issue
Block a user