和移动相机比较类似,更改的值换为了image的RectTransform
文中用到的GameManager在这篇文章:Unity学习笔记:在GameManager里记录手游操作框架_努力长头发的程序猿的博客-CSDN博客_gamemanager unity
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ShowMove : MonoBehaviour
{
private RectTransform rect , canvasRect;
public float scale;
private Vector3 lastclickpos, lastmappos;
private Vector2 nextpos, v;
private Vector2 lastLeftHandPos, lastRightHandPos;
private float handDistancke,lastHandDistance;
private bool mapmove;
private float minSizeChange;
private float maxSize = 2.0f, minSize = 1.0f;
private float maxPosX = 2250.0f , maxPosY = 1250.0f;
void Start()
{
rect = transform as RectTransform;
canvasRect = transform.root as RectTransform;
minSizeChange =
canvasRect.sizeDelta.x < canvasRect.sizeDelta.y
? canvasRect.sizeDelta.x * 0.5f
: canvasRect.sizeDelta.y * 0.5f;
scale = 1;
}
void Update()
{
if (GameManager.Main.GetDoubleClick())
{
lastLeftHandPos = Input.GetTouch(0).position;
lastRightHandPos = Input.GetTouch(1).position;
lastHandDistance = Vector2.Distance(lastLeftHandPos, lastRightHandPos);
}
if (GameManager.Main.GetDoubleClickUp())
{
if (Input.GetTouch(0).phase == TouchPhase.Ended && Input.GetTouch(1).phase == TouchPhase.Ended)
{
mapmove = false;
GameManager.Main.canchange = true;
}
if (Input.GetTouch(0).phase == TouchPhase.Ended)
{
lastclickpos = Input.GetTouch(1).position;
}
else
{
lastclickpos = Input.GetTouch(0).position;
}
lastmappos = rect.anchoredPosition;
}
if (GameManager.Main.GetDoubleClickAlways())
{
if (Input.GetTouch(0).phase == TouchPhase.Ended || Input.GetTouch(1).phase == TouchPhase.Ended)
{
goto one;
}
if (Input.GetTouch(0).phase == TouchPhase.Began || Input.GetTouch(1).phase == TouchPhase.Began)
{
goto one;
}
handDistancke = Vector2.Distance(Input.GetTouch(0).position, Input.GetTouch(1).position);
if (handDistancke < lastHandDistance && scale >= minSize)
{
scale += (handDistancke - lastHandDistance) / minSizeChange;
}
else if (handDistancke > lastHandDistance && scale <= maxSize)
{
scale += (handDistancke - lastHandDistance) / minSizeChange;
}
if (scale < transform.localScale.x){MoveNear();}
transform.localScale = new Vector3(scale,scale,scale);
lastLeftHandPos = Input.GetTouch(0).position;
lastRightHandPos = Input.GetTouch(1).position;
lastHandDistance = Vector2.Distance(lastLeftHandPos, lastRightHandPos);
return;
}
one:
if (GameManager.Main.GetClick())
{
mapmove = true;
lastclickpos = GameManager.Main.GetNumPos();
lastmappos = rect.anchoredPosition;
}
if (GameManager.Main.GetClickUp())
{
mapmove = false;
GameManager.Main.canchange = true;
}
if (mapmove)
{
if (Application.platform != RuntimePlatform.WindowsEditor)
{
if (Input.GetTouch(0).phase == TouchPhase.Ended)
{
return;
}
if (Input.GetTouch(0).phase == TouchPhase.Began)
{
return;
}
}
nextpos = lastmappos + (GameManager.Main.GetNumPos() - lastclickpos);
v = nextpos - rect.anchoredPosition;
if (Vector3.Distance(GameManager.Main.GetNumPos(), lastclickpos) > 1.0f)
{
GameManager.Main.canchange = false;
}
if (rect.anchoredPosition.x - canvasRect.sizeDelta.x * 0.5f < -maxPosX * 0.5f * scale && v.x < 0)
{
v.x = 0;
}
if (rect.anchoredPosition.x + canvasRect.sizeDelta.x * 0.5f > maxPosX * 0.5f * scale && v.x > 0)
{
v.x = 0;
}
if (rect.anchoredPosition.y - canvasRect.sizeDelta.y * 0.5f < -maxPosY * 0.5f * scale && v.y < 0)
{
v.y = 0;
}
if (rect.anchoredPosition.y + canvasRect.sizeDelta.y * 0.5f > maxPosY * 0.5f * scale && v.y > 0)
{
v.y = 0;
}
rect.anchoredPosition += v;
}
}
private void MoveNear()
{
Vector2 pos = rect.anchoredPosition;
if (rect.anchoredPosition.x - canvasRect.sizeDelta.x * 0.5f < -maxPosX * 0.5f * scale)
{
pos.x = -maxPosX * 0.5f * scale + canvasRect.sizeDelta.x * 0.5f;
}
if (rect.anchoredPosition.x + canvasRect.sizeDelta.x * 0.5f > maxPosX * 0.5f * scale)
{
pos.x = maxPosX * 0.5f * scale - canvasRect.sizeDelta.x * 0.5f;
}
if (rect.anchoredPosition.y - canvasRect.sizeDelta.y * 0.5f < -maxPosY * 0.5f * scale)
{
pos.y = -maxPosY * 0.5f * scale + canvasRect.sizeDelta.y * 0.5f;
}
if (rect.anchoredPosition.y + canvasRect.sizeDelta.y * 0.5f > maxPosY * 0.5f * scale)
{
pos.y = maxPosY * 0.5f * scale - canvasRect.sizeDelta.y * 0.5f;
}
rect.anchoredPosition = pos;
}
private void OnDisable()
{
scale = 1;
transform.localScale = Vector3.one;
rect.anchoredPosition = Vector2.zero;
}
}