Unity2D:实现正方形仅从上到下缩小的非Canvas氧气条效果
解决非Canvas对象氧气条从上到下缩小的问题
核心思路
默认缩放是围绕对象的轴心(Pivot)进行的,你的正方形轴心在中心,所以缩放时会上下同时缩小。要实现仅从上到下缩小且整体底部保持原位,需要同步调整Y轴缩放和Y轴位置:每缩小一点Y轴缩放,就将对象向下移动对应距离,抵消轴心缩放带来的位置偏移。
修改后的完整代码
using UnityEngine; public class OxygenBar : MonoBehaviour { public Transform oxygenOverlay; // 拖拽你的正方形对象到这里 private float remainingAir = 100f; // 当前剩余氧气 private float defaultYScale; // 初始Y轴缩放值 private float defaultPosY; // 初始Y轴位置 private readonly float maxAir = 100f; // 氧气最大值 void Start() { // 记录初始状态 defaultYScale = oxygenOverlay.localScale.y; defaultPosY = oxygenOverlay.localPosition.y; } void AdjustOxygenBar() { // 计算当前Y轴缩放比例 float currentYScale = defaultYScale * (remainingAir / maxAir); oxygenOverlay.localScale = new Vector3(oxygenOverlay.localScale.x, currentYScale, oxygenOverlay.localScale.z); // 计算并调整Y轴位置,让底部保持原位 // 偏移量 = (当前高度 - 初始高度) / 2,这里高度用缩放值代替(本地空间下) float newPosY = defaultPosY + (currentYScale - defaultYScale) / 2f; oxygenOverlay.localPosition = new Vector3(oxygenOverlay.localPosition.x, newPosY, oxygenOverlay.localPosition.z); } // 示例:模拟氧气减少,你可以替换成实际的氧气消耗逻辑 void Update() { if (remainingAir > 0) { remainingAir -= Time.deltaTime * 10f; AdjustOxygenBar(); } } }
原理说明
- 初始状态记录:在Start方法里保存对象初始的Y轴缩放和位置,作为基准值。
- 缩放计算:用剩余氧气占最大值的比例,乘以初始Y缩放,得到当前的Y轴缩放值。
- 位置调整:
- 初始时,对象轴心在中心,底部到轴心的距离是
defaultYScale / 2。 - 缩放后,新的底部到轴心的距离是
currentYScale / 2。 - 要让底部位置不变,需要将轴心向下移动
(defaultYScale - currentYScale) / 2,对应代码里的newPosY = defaultPosY + (currentYScale - defaultYScale) / 2f(等价于defaultPosY - (defaultYScale - currentYScale)/2)。
- 初始时,对象轴心在中心,底部到轴心的距离是
可选优化方案
如果可以修改模型的轴心,直接将正方形的Pivot设置为底部(在Unity编辑器里选中对象,点击Inspector里的Pivot按钮,切换到Local模式,拖动轴心到底部),这样只需要调整Y轴缩放,不需要修改位置就能实现从上到下缩小的效果。
内容的提问来源于stack exchange,提问作者Intra Preneur
相关产品推荐
相关产品推荐

