// Copyright (c) Meta Platforms, Inc. and affiliates. All rights reserved. using Meta.XR.Movement.Retargeting; using TMPro; using UnityEngine; using UnityEngine.Assertions; namespace Meta.XR.Movement.Samples { /// /// A simple script that allows toggling an animation on and off. /// public class MovementBodyAnimationToggle : MonoBehaviour { /// /// Animators to control. /// [SerializeField] private Animator[] _animators; [SerializeField] private CharacterRetargeter[] _retargeters; /// /// True if animation is enabled, false is not. /// [SerializeField] private bool _customAnimEnabled; /// /// Text to update to based on animation state. /// [SerializeField] private TMP_Text _worldText; [SerializeField, InspectorButton("SwapAnimState")] private bool _toggleButton; private const string _animOffText = "Anim off"; private const string _animOnText = "Anim on"; private AnimationSkeletalProcessor[] _processors; private void Awake() { Assert.IsNotNull(_worldText); Assert.IsTrue(_animators is { Length: > 0 }); foreach (var animator in _animators) { Assert.IsNotNull(animator); } var processorIndex = 0; _processors = new AnimationSkeletalProcessor[_retargeters.Length]; foreach (var retargeter in _retargeters) { _processors[processorIndex] = retargeter.GetTargetProcessor(); processorIndex++; } } private void Start() { EnforceAnimState(); } /// /// Swaps the custom animation state on/off. /// public void SwapAnimState() { _customAnimEnabled = !_customAnimEnabled; EnforceAnimState(); } private void EnforceAnimState() { foreach (var animator in _animators) { animator.enabled = _customAnimEnabled; } foreach (var processor in _processors) { processor.Weight = _customAnimEnabled ? 1.0f : 0.0f; } _worldText.text = _customAnimEnabled ? _animOnText : _animOffText; } } }