Unity双指控制缩放

Unity双指控制缩放

缩放原理

我所使用的缩放逻辑原理与其他人的可能不太一样,但也不是什么非常复杂的算法,可以说就是摄像机的拉近拉远,通过这种方式实现图像上的放大缩小。

代码

protected readonly Transform m_zoom = null;
private float max = 3.7f;
private float min = 0;
protected static float current = 0;
private float last = -1;
public void Update()
{
    if (Input.touchCount == 2)
    {
        float dis = Vector2.Distance(Input.touches[0].position, Input.touches[1].position);//两指之间的距离
        if (-1 == last) last = dis;
        float result = dis - last;//与上一帧比较变化
        if (result + current < min)//区间限制:最小
            result = min - current;
        else if (result + current > max)//区间限制:最大
            result = max - current;
        result *= 0.1f;//系数
        m_zoom.position += m_zoom.forward.normalized * result;
        current += result;//累计当前
        last = dis;//记录为上一帧的值
    }
    else
    {
        last = -1;//不触发逻辑时
    }
}

属性与方法

  • m_zoom是摄像机的对象,或摄像机某层父节点的对象,通过对它与场景中物体之间的位置变换,达到图像上放大缩小的效果。
  • Input.touchCount用于检测当前触碰的数量。Input.touchCount == 2表示当前接收到2个触碰信息。
  • Input.touches[0]Input.touches[1]是获取触碰信息,其中的数字便是触碰信息的相关索引。
### 实现 Unity双指缩放手势 在 Unity 中实现双指缩放功能涉及检测触摸输入并相应调整对象的比例。为了确保缩放操作平滑且位置固定,需跟踪两个手之间的距离变化。 #### 处理多点触控事件 当有两个或更多接触点时触发特定行为。通过 `Input.touchCount` 判断是否有恰好两次触摸发生,并利用 `Touch.phase` 来识别这些触摸的状态(如开始、移动)。对于每次更新循环中的有效击情况,计算两根手间的新旧间距比率作为缩放因子[^1]。 ```csharp if (Input.touchCount == 2) { Touch touchZero = Input.GetTouch(0); Touch touchOne = Input.GetTouch(1); if (touchZero.phase == TouchPhase.Moved || touchOne.phase == TouchPhase.Moved) { Vector2 prevTouchDeltaPos = touchZero.position - touchOne.position; float prevMagnitude = prevTouchDeltaPos.magnitude; Vector2 touchDeltaPos = touchZero.deltaPosition - touchOne.deltaPosition; float magnitude = touchDeltaPos.magnitude; float scaleRatio = magnitude / prevMagnitude; // 缩放比例 ... } } ``` #### 应用缩放到目标物体上 一旦获得了正确的缩放系数,则可以通过改变所选 UI 组件或其他游戏对象的本地尺度来反映这种变换效果。考虑到 Canvas 的尺寸可能影响最终视觉呈现的效果,在某些情况下适当调节增量值可能是必要的[^2]。 ```csharp // 假设已经获取到了初始规模 oriScale 和当前缩放量 scale targetT.localScale = new Vector3( Mathf.Clamp(oriScale.x + scale * adjustmentFactor, minLimit, maxLimit), Mathf.Clamp(oriScale.y + scale * adjustmentFactor, minLimit, maxLimit), oriScale.z); ``` 这里需要注意的是,为了避免过度放大缩小造成不良用户体验,通常会对新的 Scale 进行上下限约束处理;另外就是关于 `adjustmentFactor` 参数的选择——它决定了整体响应灵敏度,可以根据实际需求灵活设定。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天富儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值