BITFALL/Assets/Plugins/Character Controller Pro/Demo/Scripts/CharacterDetector/PositionAndRotationModifier.cs

132 lines
4.4 KiB
C#

using UnityEngine;
using Lightbug.CharacterControllerPro.Core;
using Lightbug.Utilities;
namespace Lightbug.CharacterControllerPro.Demo
{
public class PositionAndRotationModifier : CharacterDetector
{
public enum CallbackType
{
Enter,
Exit
}
[Header("Callbacks")]
public CallbackType callbackType = CallbackType.Enter;
[Header("Position")]
public bool teleport = false;
[Condition("teleport", ConditionAttribute.ConditionType.IsTrue, ConditionAttribute.VisibilityType.NotEditable)]
public Transform teleportTarget = null;
[Header("Rotation")]
public bool rotate = false;
[Condition("rotate", ConditionAttribute.ConditionType.IsTrue, ConditionAttribute.VisibilityType.Hidden)]
public RotationMode rotationMode = RotationMode.ModifyUp;
[Condition("rotationMode", ConditionAttribute.ConditionType.IsEqualTo, ConditionAttribute.VisibilityType.Hidden, (int)RotationMode.ModifyUp)]
[Tooltip("The target Transform.up vector to use.")]
public Transform referenceTransform = null;
[Condition(
new string[] { "rotationMode", "rotate" },
new ConditionAttribute.ConditionType[] { ConditionAttribute.ConditionType.IsEqualTo, ConditionAttribute.ConditionType.IsTrue },
new float[] { (int)RotationMode.AlignWithObject, 0f },
ConditionAttribute.VisibilityType.Hidden)]
[Tooltip("The target transform to use as the reference.")]
public Transform verticalAlignmentReference = null;
[Condition(
new string[] { "rotationMode", "rotate" },
new ConditionAttribute.ConditionType[] { ConditionAttribute.ConditionType.IsEqualTo, ConditionAttribute.ConditionType.IsTrue },
new float[] { (int)RotationMode.AlignWithObject, 0f },
ConditionAttribute.VisibilityType.Hidden)]
public VerticalAlignmentSettings.VerticalReferenceMode upDirectionReferenceMode = VerticalAlignmentSettings.VerticalReferenceMode.Away;
public enum RotationMode
{
/// <summary>
///
/// </summary>
ModifyUp,
/// <summary>
///
/// </summary>
AlignWithObject
}
void Teleport(CharacterActor characterActor)
{
if (!teleport)
return;
if (teleportTarget == null)
return;
Vector3 targetPosition = teleportTarget.position;
// If the character is 2D, don't change the position z component (Transform).
if (characterActor.Is2D)
targetPosition.z = characterActor.transform.position.z;
characterActor.Teleport(targetPosition);
}
void Rotate(CharacterActor characterActor)
{
if (!rotate)
return;
switch (rotationMode)
{
case RotationMode.ModifyUp:
if (referenceTransform != null)
characterActor.Up = referenceTransform.up;
if (characterActor.constraintRotation)
{
characterActor.upDirectionReference = null;
characterActor.constraintUpDirection = characterActor.Up;
}
break;
case RotationMode.AlignWithObject:
// Just in case the rotation constraint is active ...
characterActor.constraintRotation = true;
characterActor.upDirectionReference = verticalAlignmentReference;
characterActor.upDirectionReferenceMode = upDirectionReferenceMode;
characterActor.constraintUpDirection = characterActor.Up;
break;
}
}
protected override void ProcessEnterAction(CharacterActor characterActor)
{
if (callbackType != CallbackType.Enter)
return;
Teleport(characterActor);
Rotate(characterActor);
}
protected override void ProcessExitAction(CharacterActor characterActor)
{
if (callbackType != CallbackType.Exit)
return;
Teleport(characterActor);
Rotate(characterActor);
}
}
}