Before 优化 机场
This commit is contained in:
@@ -0,0 +1,94 @@
|
||||
// Designed by KINEMATION, 2024.
|
||||
|
||||
using Kinemation.MotionWarping.Runtime.Core;
|
||||
using Kinemation.MotionWarping.Runtime.Utility;
|
||||
|
||||
using UnityEngine;
|
||||
using Quaternion = UnityEngine.Quaternion;
|
||||
using Vector3 = UnityEngine.Vector3;
|
||||
|
||||
namespace Kinemation.MotionWarping.Runtime.Examples
|
||||
{
|
||||
public class AlignComponent : MonoBehaviour, IWarpPointProvider
|
||||
{
|
||||
[SerializeField] [Range(0f, 180f)] private float interactionAngle = 0f;
|
||||
[SerializeField] [Range(-180f, 180f)] private float offsetAngle = 0f;
|
||||
[SerializeField] [Min(0f)] private float distance = 0f;
|
||||
[SerializeField] private MotionWarpingAsset motionWarpingAsset;
|
||||
[SerializeField] private string targetAnimName;
|
||||
|
||||
private Animator _animator;
|
||||
|
||||
private void OnDrawGizmos()
|
||||
{
|
||||
Gizmos.color = Color.red;
|
||||
|
||||
Vector3 position = transform.position;
|
||||
Vector3 forward = Quaternion.Euler(0f, offsetAngle, 0f) * transform.forward;
|
||||
float debugRadius = 0.05f;
|
||||
|
||||
Vector3 left = Quaternion.Euler(0f, interactionAngle, 0f) * forward;
|
||||
Vector3 right = Quaternion.Euler(0f, -interactionAngle, 0f) * forward;
|
||||
|
||||
Gizmos.DrawLine(position, position + left * distance);
|
||||
Gizmos.DrawLine(position, position + right * distance);
|
||||
|
||||
Gizmos.DrawWireSphere(position, debugRadius);
|
||||
Gizmos.DrawWireSphere(position + left * distance, debugRadius);
|
||||
Gizmos.DrawWireSphere(position + right * distance, debugRadius);
|
||||
}
|
||||
|
||||
private void Start()
|
||||
{
|
||||
_animator = GetComponent<Animator>();
|
||||
}
|
||||
|
||||
public WarpInteractionResult Interact(GameObject instigator)
|
||||
{
|
||||
WarpInteractionResult result = new WarpInteractionResult()
|
||||
{
|
||||
success = false,
|
||||
points = null,
|
||||
asset = null,
|
||||
};
|
||||
|
||||
if (instigator == null || motionWarpingAsset == null)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
if ((instigator.transform.position - transform.position).magnitude > distance)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
Vector3 forward = Quaternion.Euler(0f, offsetAngle, 0f) * transform.forward;
|
||||
float angle = Mathf.Acos(Vector3.Dot(-instigator.transform.forward, forward)) * Mathf.Rad2Deg;
|
||||
|
||||
if (angle > interactionAngle)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
result.asset = motionWarpingAsset;
|
||||
result.points = new[]
|
||||
{
|
||||
new WarpPoint()
|
||||
{
|
||||
transform = this.transform,
|
||||
position = Vector3.zero,
|
||||
rotation = Quaternion.identity
|
||||
}
|
||||
};
|
||||
|
||||
result.success = true;
|
||||
|
||||
if (_animator != null)
|
||||
{
|
||||
_animator.CrossFade(targetAnimName, 0.15f);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user