105 lines
3.6 KiB
C#
105 lines
3.6 KiB
C#
using UnityEngine;
|
|
|
|
namespace Passer.Humanoid {
|
|
using Passer.Tracking;
|
|
|
|
/// <summary>
|
|
/// A custom sensor used on the leg of a humanoid.
|
|
/// </summary>
|
|
/// This tracking option supports a custom developed SensorComponent on the leg or foot.
|
|
[System.Serializable]
|
|
public class CustomLeg : LegSensor {
|
|
|
|
public override string name => "Custom Sensor";
|
|
|
|
/// <summary>
|
|
/// The bone on the leg controlled by the sensor
|
|
/// </summary>
|
|
public LegBones attachedBone = LegBones.Foot;
|
|
|
|
#if hCUSTOM
|
|
public override HumanoidTracker tracker => humanoid.custom;
|
|
#endif
|
|
|
|
#region Manage
|
|
|
|
/// <summary>
|
|
/// Updates the leg targets based on the current sensor position and rotation
|
|
/// </summary>
|
|
public override void SetSensor2Target() {
|
|
if (sensorComponent == null)
|
|
return;
|
|
|
|
HumanoidTarget.TargetedBone targetBone = footTarget.GetTargetBone(attachedBone);
|
|
if (targetBone == null)
|
|
return;
|
|
|
|
sensor2TargetRotation = Quaternion.Inverse(sensorComponent.transform.rotation) * targetBone.target.transform.rotation;
|
|
sensor2TargetPosition = -targetBone.target.transform.InverseTransformPoint(sensorComponent.transform.position);
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// Updates the sensor position and rotation based on the current position of the leg targets
|
|
/// </summary>
|
|
/// <param name="_">Not used</param>
|
|
public override void UpdateSensorTransformFromTarget(Transform _) {
|
|
HumanoidTarget.TargetedBone targetBone = footTarget.GetTargetBone(attachedBone);
|
|
base.UpdateSensorTransformFromTarget(targetBone.target.transform);
|
|
}
|
|
|
|
#endregion Manage
|
|
|
|
#region Start
|
|
|
|
/// <summary>
|
|
/// Prepares the leg for tracking with the sensor
|
|
/// </summary>
|
|
/// <param name="_humanoid">The humanoid for which this leg is tracked</param>
|
|
/// <param name="targetTransform">The transform of the foot target</param>
|
|
/// It will initialze the sensor2TargetPosition and sensor2TargetRotation values.
|
|
/// It will determine whether the sensor should be shown and rendered.
|
|
/// It will start the tracking of the sensor.
|
|
public override void Start(HumanoidControl _humanoid, Transform targetTransform) {
|
|
base.Start(_humanoid, targetTransform);
|
|
|
|
SetSensor2Target();
|
|
ShowSensor(footTarget.humanoid.showRealObjects && target.showRealObjects);
|
|
|
|
if (sensorComponent != null) {
|
|
if (tracker.trackerComponent != null)
|
|
sensorComponent.StartComponent(tracker.trackerComponent.transform);
|
|
else
|
|
sensorComponent.StartComponent(sensorComponent.transform.parent);
|
|
}
|
|
}
|
|
|
|
#endregion Start
|
|
|
|
#region Update
|
|
|
|
/// <summary>
|
|
/// Updates the leg target based on the status of the tracked sensor
|
|
/// </summary>
|
|
public override void Update() {
|
|
status = Tracker.Status.Unavailable;
|
|
if (tracker == null || !tracker.enabled || !enabled)
|
|
return;
|
|
|
|
if (sensorComponent == null)
|
|
return;
|
|
|
|
sensorComponent.UpdateComponent();
|
|
status = sensorComponent.status;
|
|
if (status != Tracker.Status.Tracking)
|
|
return;
|
|
|
|
HumanoidTarget.TargetedBone targetBone = footTarget.GetTargetBone(attachedBone);
|
|
|
|
UpdateTarget(targetBone.target, sensorComponent);
|
|
}
|
|
|
|
#endregion Update
|
|
}
|
|
|
|
} |