先上代码 ↓↓↓
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ScaleByTwoFinger : MonoBehaviour
{
private RectTransform targetT;
bool isInit;
Vector2 touch1, touch2, oriPos, pos;
float disX, disY;
float scale , oriScale;
public float scaleSpeed = 1;
public bool isLimitScale;
public float min, max;
private void Start()
{
targetT = GameObject.Find("Video").GetComponent<RectTransform>();
}
private void Update()
{
//不是双指就关闭
if (Input.touchCount != 2)
{
isInit = false;
}
//初始化
if (Input.touchCount == 2 && !isInit)
{
//两指点位
touch1 = Camera.main.ScreenToWorldPoint(Input.GetTouch(0).position);
touch2 = Camera.main.ScreenToWorldPoint(Input.GetTouch(1).position);
//目标初始点位
oriPos = new Vector3(targetT.position.x, targetT.position.y, 0);
//两指中点
pos = new Vector3((Camera.main.ScreenToWorldPoint(Input.GetTouch(0).position).x + Camera.main.ScreenToWorldPoint(Input.GetTouch(1).position).x) / 2, (Camera.main.ScreenToWorldPoint(Input.GetTouch(0).position).y + Camera.main.ScreenToWorldPoint(Input.GetTouch(1).position).y) / 2, 0);
//两指中点和目标距离
disX = pos.x - oriPos.x;
disY = pos.y - oriPos.y;
oriScale = targetT.localScale.x;
isInit = true;
}
if (Input.touchCount == 2)
{
//两指缩放比例
scale = Vector2.Distance(Camera.main.ScreenToWorldPoint(Input.GetTouch(0).position), Camera.main.ScreenToWorldPoint(Input.GetTouch(1).position)) / Vector2.Distance(touch1, touch2);
//利用scaleSpeed控制缩放速度
scale = (scale - 1) * scaleSpeed;
//给缩放比例加限制
if (isLimitScale && targetT.localScale.x <= min && scale < 0)
{
return;
}
if (isLimitScale && targetT.localScale.x >= max && scale > 0)
{
return;
}
//缩放目标大小
targetT.localScale = new Vector2(oriScale + scale*0.01f, oriScale + scale* 0.01f);
//改变目标位置,让位置保持不变
targetT.position = new Vector2(oriPos.x - ((targetT.localScale.x - oriScale) * disX), oriPos.y - ((targetT.localScale.y - oriScale) * disY));
}
}
}
代码是搬运大佬“我寄人间雪满头丶”的文章进行修改的,如果需要照搬使用的话,记得把以下的第18代码进行更改,把Video改成你自己对应的图片名称(我这里叫Video是因为挂了个视频播放器在上面,可以实现视频双指缩放,看你自己的需求吧!)
targetT = GameObject.Find("Video").GetComponent<RectTransform>();
如果双指缩放的速度太快或者太慢,是因为canvas的大小不同导致的,自己可以微调一下第72行代码。(把0.01f进行修改,控制你的缩放速度,别问为什么不直接改scale,这样对我来说方便些哈哈哈哈!)
targetT.localScale = new Vector2(oriScale + scale*0.01f, oriScale + scale* 0.01f);