如何在UNITY中缩放距离canvas中心的物体?
How to scale a object with distance from the center of the canvas in UNITY?
我需要为滚动视图实现跑步机效果,即在滚动中心对象时需要在远离中心时缩小比例,反之亦然?有人能给我指出正确的方向吗,我已经从元素中计算出滚动视图的中心以实现捕捉效果。
*通过非常便宜的方法解决 可能并不适合所有人该过程是通过获取滚动视图中 button/elements 到中心的距离并学习所述距离与所需比例
istReposition = center.GetComponent<RectTransform>().position.x - bttn.GetComponent<RectTransform>().position.x;
distance = Mathf.Abs(distReposition);
Vector3 minscale = Vector3.one * maximundistanceScale;
Vector3 maxScale = Vector3.one * minimundistanceScale;
bttn[i].GetComponent<RectTransform>().localScale = Vector3.Lerp(maxScale,minscale, distance);
Stack Overflow 不是脚本服务:下次请尝试 post 您已经尝试过的内容。
无论如何你可以这样做:
- 获取从 UI 元素到 ScrollView 中心的距离(仅当跑步机是水平的或 y 轴(如果它是垂直的)
- 将此值除以 canvas
宽度的一半
- 获取结果的绝对值
- 您现在有一个从 0 到 1 的值(1 表示元素位于 canvas 的中间,0 位于两侧)
一个快速的实现是:
[RequireComponent(typeof(RectTransform))]
public class TestScript : MonoBehaviour
{
[SerializeField]
private float m_CenterScale;
[SerializeField]
private float m_BorderScale;
[SerializeField]
private AnimationCurve m_ScalingCurve; // Must be from 1 to 0 on y axis and from 0 to 1 on x axis
protected override void Update()
{
float scrollviewCenterPosition = GetComponentInParent<ScrollRect>().GetComponent<RectTransform>().position.x;
float distanceFromCenter = transform.position.x - scrollviewCenterPosition ;
float ratio = Mathf.Abs(distanceFromCenter / (GetComponentInParent<ScrollRect>().GetComponent<RectTransform>().rect.width * 0.5f));
float scaleValue = m_BorderScale + (m_CenterScale - m_BorderScale) * m_ScalingCurve.Evaluate(ratio);
(transform as RectTransform).localScale = Vector3.one * scaleValue;
}
}
请注意我添加了一个 AnimationCurve
属性 以便能够轻松控制缩放效果:曲线应该像这样从 [0:1] 开始并在 [1:0] 结束:
希望对您有所帮助,
我需要为滚动视图实现跑步机效果,即在滚动中心对象时需要在远离中心时缩小比例,反之亦然?有人能给我指出正确的方向吗,我已经从元素中计算出滚动视图的中心以实现捕捉效果。
*通过非常便宜的方法解决 可能并不适合所有人该过程是通过获取滚动视图中 button/elements 到中心的距离并学习所述距离与所需比例
istReposition = center.GetComponent<RectTransform>().position.x - bttn.GetComponent<RectTransform>().position.x;
distance = Mathf.Abs(distReposition);
Vector3 minscale = Vector3.one * maximundistanceScale;
Vector3 maxScale = Vector3.one * minimundistanceScale;
bttn[i].GetComponent<RectTransform>().localScale = Vector3.Lerp(maxScale,minscale, distance);
Stack Overflow 不是脚本服务:下次请尝试 post 您已经尝试过的内容。
无论如何你可以这样做:
- 获取从 UI 元素到 ScrollView 中心的距离(仅当跑步机是水平的或 y 轴(如果它是垂直的)
- 将此值除以 canvas 宽度的一半
- 获取结果的绝对值
- 您现在有一个从 0 到 1 的值(1 表示元素位于 canvas 的中间,0 位于两侧)
一个快速的实现是:
[RequireComponent(typeof(RectTransform))]
public class TestScript : MonoBehaviour
{
[SerializeField]
private float m_CenterScale;
[SerializeField]
private float m_BorderScale;
[SerializeField]
private AnimationCurve m_ScalingCurve; // Must be from 1 to 0 on y axis and from 0 to 1 on x axis
protected override void Update()
{
float scrollviewCenterPosition = GetComponentInParent<ScrollRect>().GetComponent<RectTransform>().position.x;
float distanceFromCenter = transform.position.x - scrollviewCenterPosition ;
float ratio = Mathf.Abs(distanceFromCenter / (GetComponentInParent<ScrollRect>().GetComponent<RectTransform>().rect.width * 0.5f));
float scaleValue = m_BorderScale + (m_CenterScale - m_BorderScale) * m_ScalingCurve.Evaluate(ratio);
(transform as RectTransform).localScale = Vector3.one * scaleValue;
}
}
请注意我添加了一个 AnimationCurve
属性 以便能够轻松控制缩放效果:曲线应该像这样从 [0:1] 开始并在 [1:0] 结束:
希望对您有所帮助,