VR4Medical/ICI/Library/PackageCache/com.unity.learn.iet-framework@4bd5247958fc/Editor/Criteria/SceneViewCameraMovedCriterion.cs
2025-07-29 13:45:50 +03:00

82 lines
2.8 KiB
C#

using System;
using UnityEditor;
using UnityEngine;
namespace Unity.Tutorials.Core.Editor
{
/// <summary>
/// Criterion for checking that Scene View Camera has moved.
/// </summary>
public class SceneViewCameraMovedCriterion : Criterion
{
[NonSerialized]
bool m_InitialPositionInitialized = false;
[NonSerialized]
Vector3 m_InitialCameraPosition;
[NonSerialized]
Quaternion m_InitialCameraOrientation;
/// <summary>
/// Starts testing of the criterion.
/// </summary>
public override void StartTesting()
{
base.StartTesting();
UpdateInitialCameraPositionIfNeeded();
UpdateCompletion();
EditorApplication.update += UpdateCompletion;
}
void UpdateInitialCameraPositionIfNeeded()
{
if (m_InitialPositionInitialized)
return;
if (SceneView.lastActiveSceneView == null)
return;
m_InitialPositionInitialized = true;
m_InitialCameraPosition = SceneView.lastActiveSceneView.camera.transform.position;
m_InitialCameraOrientation = SceneView.lastActiveSceneView.camera.transform.localRotation;
}
/// <summary>
/// Stops testing of the criterion.
/// </summary>
public override void StopTesting()
{
base.StopTesting();
EditorApplication.update -= UpdateCompletion;
m_InitialPositionInitialized = false;
}
/// <summary>
/// Evaluates if the criterion is completed.
/// </summary>
/// <returns>True if the criterion is completed</returns>
protected override bool EvaluateCompletion()
{
if (SceneView.lastActiveSceneView == null)
return false;
UpdateInitialCameraPositionIfNeeded();
var currentPosition = SceneView.lastActiveSceneView.camera.transform.position;
var currentOrientation = SceneView.lastActiveSceneView.camera.transform.localRotation;
return m_InitialCameraPosition != currentPosition || m_InitialCameraOrientation != currentOrientation;
}
/// <summary>
/// Auto-completes the criterion.
/// </summary>
/// <returns>True if the auto-completion succeeded.</returns>
public override bool AutoComplete()
{
// NOTE SceneView.lastActiveSceneView.camera.transform.position should not be used for moving the camera,
// must use the SceneView.lastActiveSceneView.pivot instead, https://forum.unity.com/threads/moving-scene-view-camera-from-editor-script.64920/#post-415327
SceneView.lastActiveSceneView.pivot = m_InitialCameraPosition + Vector3.back;
return true;
}
}
}