从与滑块

时间:2016-03-01 10:42:01

标签: c# animation unity3d slider unity5

我有一个脚本,它为我提供了一个设置为animationTime的滑块的标准化值

沿着这个滑块,我想看一些小弹出窗口,以便在用户出现时向用户显示重要日期,但只是让他们出现'是超级无聊,并没有吸引眼球,所以我喜欢像弹出动画一样的小吐司。

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

到目前为止,只是让他们看起来我正在使用这个脚本。

    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);
    }
}

根据我有限的知识,我确信这也可以清理,考虑到时间线上会有多个Toast弹出窗口,表示需要查看许多不同的重要日期。

非常感谢

1 个答案:

答案 0 :(得分:1)

enter image description here

这个解决方案有相当多的设置,但它都是相对简单的逻辑。我使用两个类,欠自动定位滑块上的元素并处理滑块的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

希望这会有所帮助。