123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- using FairyGUI;
- using GFGGame.Launcher;
- using UnityEngine;
- namespace GFGGame
- {
- public class ScaleGestureController : SingletonMonoBase<ScaleGestureController>
- {
- public Transform target; //目标
- //缩放
- public bool isScaling;
- Vector3 touch1, touch2, oriPos, scaleCenter;
- float scale, disX, disY, oriScale;
- public float scaleSpeed = 1;
- public float min = 1f;
- public float max = 1.7f;
- //移动
- private bool isDraging;
- private Vector3 offset = Vector3.zero;
- public Vector2 uiSize;
- private void Update()
- {
- if (target == null)
- {
- isScaling = false;
- isDraging = false;
- return;
- }
- if(Input.touchCount != 2)
- {
- isScaling = false;
- }
- if (isScaling)
- {
- //两指缩放比例
- scale = Vector3.Distance(Camera.main.ScreenToWorldPoint(Input.GetTouch(0).position), Camera.main.ScreenToWorldPoint(Input.GetTouch(1).position)) / Vector3.Distance(touch1, touch2);
- //利用scaleSpeed控制缩放速度
- scale = (scale - 1) * scaleSpeed;
- var targetScale = oriScale + scale;
- //给缩放比例加限制
- if (targetScale <= min && scale < 0)
- {
- targetScale = min;
- }
- if (targetScale >= max && scale > 0)
- {
- targetScale = max;
- }
- LogUtil.LogDev($"scaling {oriScale} {scale}");
- //缩放目标大小
- target.localScale = new Vector3(targetScale, targetScale, 1);
- //改变目标位置,让位置保持不变
- target.position = new Vector3(oriPos.x - ((target.localScale.x - oriScale) * disX), oriPos.y - ((target.localScale.y - oriScale) * disY), 0);
- UpdatePos();
- }
- if (Input.touchCount == 2)
- {
- //两指点位
- touch1 = Camera.main.ScreenToWorldPoint(Input.GetTouch(0).position);
- touch2 = Camera.main.ScreenToWorldPoint(Input.GetTouch(1).position);
- //目标初始点位
- oriPos = new Vector3(target.position.x, target.position.y, 0);
- //两指中点
- scaleCenter = 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 = scaleCenter.x - oriPos.x;
- disY = scaleCenter.y - oriPos.y;
- oriScale = target.localScale.x;
- LogUtil.LogDev($"start scale {oriPos} {oriScale}");
- isScaling = true;
- }
- if (!Input.GetMouseButton(0) || isScaling)
- {
- isDraging = false;
- return;
- }
- if (isDraging)
- {
- target.position = Camera.main.ScreenToWorldPoint(Input.mousePosition - offset);
- UpdatePos();
- }
- else if (Input.GetMouseButtonDown(0))
- {
- //LogUtil.LogEditor($"DragGestureController {GRoot.inst.touchTarget} {Input.touchCount}");
- if (GRoot.inst.touchTarget != null && !(GRoot.inst.touchTarget is GGraph)) return;
- isDraging = true;
- offset = Input.mousePosition - Camera.main.WorldToScreenPoint(target.position);
- }
- }
- public void UpdatePos()
- {
- if (target == null) return;
- Vector2 size = target.Find("Bg").GetComponent<SpriteRenderer>().size * target.localScale.x;
- float deviationWidth = (size.x - uiSize.x / 100) / 2;
- float deviationHeigh = (size.y - uiSize.y / 100) / 2;
- Vector2 pos = target.transform.position;
- if (pos.x <= -deviationWidth)
- {
- target.transform.position = new Vector2(-deviationWidth, target.transform.position.y);
- }
- if (pos.x >= deviationWidth)
- {
- target.transform.position = new Vector2(deviationWidth, target.transform.position.y);
- }
- if (pos.y <= -deviationHeigh)
- {
- target.transform.position = new Vector2(target.transform.position.x, -deviationHeigh);
- }
- if (pos.y >= deviationHeigh)
- {
- target.transform.position = new Vector2(target.transform.position.x, deviationHeigh);
- }
- }
- }
- }
|