shenjianxing 6b341ae2b4 适配VR
2025-04-01 16:16:45 +08:00

111 lines
3.7 KiB
C#

////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2007-2020 , Inc. All Rights Reserved.
//
////////////////////////////////////////////////////////////////////////////////
#if UNITY_EDITOR
using UnityEditor;
using UnityEngine;
namespace GCSeries.Core.Input
{
public abstract partial class ZPointer
{
////////////////////////////////////////////////////////////////////////
// MonoBehaviour Callbacks
////////////////////////////////////////////////////////////////////////
private void OnDrawGizmos()
{
// Update the hit info.
if (!Application.isPlaying)
{
this._hitInfo.distance = this.DefaultHitDistance;
this._hitInfo.worldPosition =
this.transform.position +
(this.transform.forward * this.DefaultHitDistance);
this._hitInfo.worldNormal = -this.transform.forward;
}
}
private void OnDrawGizmosSelected()
{
if (this.EventCamera != null)
{
Vector3 startPoint = this.transform.position;
Vector3 hitPoint = this.HitInfo.worldPosition;
Vector3 hitNormal = this.HitInfo.worldNormal;
// Draw the hit distance.
Handles.color = Color.white;
Handles.DrawDottedLine(startPoint, hitPoint, 5);
Handles.Label(
(startPoint + hitPoint) / 2,
string.Format("{0:0.000} m", this.HitInfo.distance));
// Draw the hit normal.
Handles.color = new Color32(0, 191, 255, 155);
this.DrawNormal(hitPoint, hitNormal, this.transform.up);
// Draw the hit radius information.
float hitRadius = this.DefaultHitRadius;
if (hitRadius > 0)
{
Vector3 direction = this.transform.forward;
Vector3 projectedHitPoint =
Vector3.Project(hitPoint - startPoint, direction) +
startPoint;
Handles.color = Color.white;
this.DrawDiscs(startPoint, projectedHitPoint, hitRadius, 5);
Handles.DrawLine(startPoint, projectedHitPoint);
Handles.DrawDottedLine(hitPoint, projectedHitPoint, 5);
}
}
}
////////////////////////////////////////////////////////////////////////
// Private Methods
////////////////////////////////////////////////////////////////////////
private void DrawNormal(Vector3 position, Vector3 normal, Vector3 up)
{
Quaternion rotation = Quaternion.LookRotation(normal, up);
float size = HandleUtility.GetHandleSize(position) * 0.75f;
Handles.ArrowHandleCap(
0, position, rotation, size, EventType.Repaint);
}
private void DrawDiscs(Vector3 a, Vector3 b, float radius, int count)
{
float t = 0;
float step = 1 / (float)(count - 1);
Color originalColor = Handles.color;
Color startColor = Handles.color;
startColor.a = 0.2f;
Color endColor = Handles.color;
endColor.a = 0.8f;
for (int i = 0; i < count; ++i)
{
Handles.color = Color.Lerp(endColor, startColor, t);
Handles.DrawWireDisc(Vector3.Lerp(b, a, t), b - a, radius);
t += step;
}
Handles.color = originalColor;
}
}
}
#endif // UNITY_EDITOR