从与滑块值相关的脚本触发动画

Triggering an animation from a script related to the value of a slider

我有一个脚本可以为我提供设置为 animationTime

的滑块的标准化值

我希望沿着这个滑块出现一些小弹出窗口,以便在它们发生时向用户指示重要的日期,但是只有它们 'appear' 非常无聊而且不吸引眼球,所以我想要像弹出动画一样的小祝酒词。

如何在到达滑块上的正确点时触发此动画?

到目前为止,为了让它们出现,我正在使用这个脚本。

    float t = animationTime;
    if (0.256f < t)
    {
        pilingFinished.gameObject.SetActive(true);
    }
    else
    {
        pilingFinished.gameObject.SetActive(false);
    }

    if (0.39f < t)
    {
        basementFinished.gameObject.SetActive(true);
    }
    else
    {
        basementFinished.gameObject.SetActive(false);
    }
}

根据我有限的知识,我确信这也可以清理,考虑到时间轴上将有多个吐司弹出窗口来指示要查看的许多不同的重要日期。

非常感谢

此解决方案有相当多的设置,但都是相对简单的逻辑。我使用了两个 类,它自动沿着滑块定位元素并处理滑块的 OnChange 事件,另一个控制元素的动画器。

TimelineController.cs

[RequireComponent(typeof(Slider))]
public class TimelineController : MonoBehaviour
{
    private RectTransform       m_transform;
    private Slider              m_slider;
    private TimelineElement[]   m_elements;
    private Vector3             m_tempPosition;

    public void Start()
    {
        m_transform         = GetComponent<RectTransform>();
        m_slider            = GetComponent<Slider>();
        m_elements          = GetComponentsInChildren<TimelineElement>();
        m_slider.maxValue   = m_elements.Length - 1;
        m_tempPosition      = m_elements[0].GetComponent<RectTransform>().localPosition;

        for(int element = 0; element < m_elements.Length; element++)
        {
            m_tempPosition.x = (m_transform.rect.width - 20f) * ((float)element / (m_elements.Length - 1));
            Debug.Log(m_transform.rect.width);
            m_elements[element].GetComponent<RectTransform>().localPosition = m_tempPosition;
        }

        m_elements[0].SetVisible(true);
    }

    public void OnChange()
    {
        m_elements[(int)m_slider.value].SetVisible(true);

        for (int element = 0; element < m_elements.Length; element++)
        {
            if (element != (int)m_slider.value)
                m_elements[element].SetVisible(false);
        }
    }
}

为了定位所有元素,获取子元素中TimelineElement组件的数量,将滑块的maxValue设置为检索到的元素数量,并获取元素的初始Vector3。

(m_transform.rect.width - 20f) * ((float)element / (m_elements.Length - 1));

每个位置都是根据百分比确定的(当前元素除以元素数组的长度),然后乘以滑块的宽度减去 20f(手柄的宽度)。

TimelineElement.cs

[RequireComponent(typeof(Animator))]
public class TimelineElement : MonoBehaviour
{
    private Animator m_animator;

    public void Start()
    {
        m_animator = GetComponent<Animator>();
    }

    public void SetVisible(bool p_visible)
    {
        m_animator.SetBool("Visible", p_visible);
    }
}

如前所述,这个简单的方法将动画器中的布尔值设置为 true 或 false,从而播放相关动画。剩下的就是在动画器中使用 bool Visible 设置类似于上面示例的层次结构,并将滑块 Whole Numbers 设置为 true.

希望对您有所帮助。