#if ENABLE_PROPERTY_VARIANTS || PACKAGE_DOCS_GENERATION
using System;
using System.Collections.Generic;
using UnityEngine.Localization.PropertyVariants.TrackedProperties;
using UnityEngine.ResourceManagement.AsyncOperations;
namespace UnityEngine.Localization.PropertyVariants.TrackedObjects
{
///
/// Tracks and applies variant changes to a [Transform](https://docs.unity3d.com/ScriptReference/Transform.html).
///
[Serializable]
[DisplayName("Transform")]
[CustomTrackedObject(typeof(Transform), false)]
public class TrackedTransform : TrackedObject
{
Vector3 m_PositionToApply;
Quaternion m_RotationToApply;
Vector3 m_ScaleToApply;
Dictionary> m_PropertyHandlers;
protected virtual void AddPropertyHandlers(Dictionary> handlers)
{
handlers["m_LocalPosition.x"] = val => m_PositionToApply.x = val;
handlers["m_LocalPosition.y"] = val => m_PositionToApply.y = val;
handlers["m_LocalPosition.z"] = val => m_PositionToApply.z = val;
handlers["m_LocalRotation.x"] = val => m_RotationToApply.x = val;
handlers["m_LocalRotation.y"] = val => m_RotationToApply.y = val;
handlers["m_LocalRotation.z"] = val => m_RotationToApply.z = val;
handlers["m_LocalRotation.w"] = val => m_RotationToApply.w = val;
handlers["m_LocalScale.x"] = val => m_ScaleToApply.x = val;
handlers["m_LocalScale.y"] = val => m_ScaleToApply.y = val;
handlers["m_LocalScale.z"] = val => m_ScaleToApply.z = val;
}
// Note: m_RootOrder has been removed in 2023 and may be backported in the future. (LOC-917)
public override bool CanTrackProperty(string propertyPath) => !(propertyPath.StartsWith("m_LocalEulerAnglesHint") || propertyPath == "m_RootOrder");
public override AsyncOperationHandle ApplyLocale(Locale variantLocale, Locale defaultLocale)
{
var transform = (Transform)Target;
if (m_PropertyHandlers == null)
{
m_PropertyHandlers = new Dictionary>();
AddPropertyHandlers(m_PropertyHandlers);
}
// Grab the current values
m_PositionToApply = transform.localPosition;
m_RotationToApply = transform.rotation;
m_ScaleToApply = transform.localScale;
// Iterate through the tracked properties and use the property handlers to apply changes.
var variantIdentifier = variantLocale.Identifier;
var fallbackIdentifier = defaultLocale != null ? defaultLocale.Identifier : default;
foreach (var property in TrackedProperties)
{
#if UNITY_EDITOR
VariantsPropertyDriver.RegisterProperty(Target, property.PropertyPath);
#endif
var floatProperty = (FloatTrackedProperty)property;
if (floatProperty.GetValue(variantIdentifier, fallbackIdentifier, out var val) &&
m_PropertyHandlers.TryGetValue(property.PropertyPath, out var handler))
{
handler(val);
}
}
// Apply the changes
transform.position = m_PositionToApply;
transform.rotation = m_RotationToApply;
transform.localScale = m_ScaleToApply;
return default;
}
}
}
#endif