IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> C#在unity上实现双指缩放 -> 正文阅读

[游戏开发]C#在unity上实现双指缩放

这个只是实现了双指缩放,至于单指挪动的,是用unity的SCrollView实现的,只需要单指的时候,打开ScrollView,双指的时候,关闭ScrollView就行,如果不关闭的话,ScrollView的平移会和C#中的逻辑产生冲突。TRACE.TraceLn这个是打印日志的,可以忽略。这个感觉还是可以讨论的,当初在网上搜的时候,也是都没有说的很具体,就只能自己摸索,自己尝试。

public class ZoomMap : UIWindow
    {
        public Image mOriginTexture;//地图
        public Image mBaseSize;// 显示区域
        private Touch oldTouch1;  //上次触摸点1(手指1)  
        private Touch oldTouch2;  //上次触摸点2(手指2)  
        public ScrollRect m_scrollRect;
        void Update()
        {
            //TRACE.TraceLn("双指缩放地图");
            //没有触摸  
            if (Input.touchCount <= 1)
            {
                m_scrollRect.enabled = true; // 打开ScrollView
                //TRACE.TraceLn("双指缩放地图,Input.touchCount = "+ Input.touchCount+ "isCanDrag = "+ isCanDrag);
                return;
            }
            if (Input.touchCount >= 2)
            {
                m_scrollRect.enabled = false;// 关闭ScrollView
                //TRACE.TraceLn("双指缩放地图,Input.touchCount = " + Input.touchCount + "isCanDrag = " + isCanDrag);
            }
            else
            {
                m_scrollRect.enabled = true;	// 打开ScrollView
                //TRACE.TraceLn("双指缩放地图,Input.touchCount = " + Input.touchCount + "isCanDrag = " + isCanDrag);
            }


            //多点触摸, 放大缩小  
            Touch newTouch1 = Input.GetTouch(0);
            Touch newTouch2 = Input.GetTouch(1);

            //第2点刚开始接触屏幕, 只记录,不做处理  
            if (newTouch2.phase == TouchPhase.Began)
            {
                oldTouch2 = newTouch2;
                oldTouch1 = newTouch1;

                TRACE.TraceLn("双指缩放地图,oldTouch2 = " + oldTouch2 + "oldTouch1 = " + oldTouch1);
                return;
            }


            //计算老的两点距离和新的两点间距离,变大要放大模型,变小要缩放模型  
            float oldDistance = Vector2.Distance(oldTouch1.position, oldTouch2.position);
            float newDistance = Vector2.Distance(newTouch1.position, newTouch2.position);

            //两个距离之差,为正表示放大手势, 为负表示缩小手势  
            float offset = newDistance - oldDistance;

            //放大因子, 一个像素按 0.01倍来算(100可调整)  
            float scaleFactor = offset / 1000f;

            //获取地图当前的缩放比例
            Vector3 localScale = mOriginTexture.rectTransform.localScale;

            //获取地图显示区域的左右上下间距
            Vector3 localSizeDelta = mBaseSize.rectTransform.sizeDelta;

            //根据地图显示区域的左右间距,结合分辨率,计算显示区域的实际宽或高
            float HWBase;

            //获取地图的宽和高
            float localMapWidth = mOriginTexture.rectTransform.rect.width;
            float localMapHight = mOriginTexture.rectTransform.rect.height;

            //计算实际显示区域的宽和高
            float localShowAreaWidth = localSizeDelta.x + UIHelper.Instance.contentWidth;
            float localShowAreaHight = localSizeDelta.y + UIHelper.Instance.contentHeight;

            //显示区域中心点和地图中心点的距离
            float RemovHMax = localShowAreaHight - localMapHight * 1.5f;
            float RemovWMax = localShowAreaWidth - localMapWidth * 1.5f;

            //计算宽和高的最小基准值,从中间取最大的
            float BaseOne = localShowAreaWidth / localMapWidth;
            float BaseTwo = localShowAreaHight / localMapHight;

            //根据实际大小计算缩放的最小比例
            float WidthMin = Math.Max(BaseOne,BaseTwo) - localScale.y;

            //最大的放大比例
            float WidthMan = 1.5f - localScale.x;

            //放大:如果大于最大比例,就置为最大比例
            if (offset > 0)
            {
                if (scaleFactor >= WidthMan)
                {
                    scaleFactor = WidthMan;
                }
            }
            //缩小:如果小于最小比例,就置为最小
            if (offset < 0)
            {
                if (scaleFactor <= WidthMin)
                {
                    scaleFactor = WidthMin;
                }
            }

            ZoomRemove(localMapWidth, localMapHight, localShowAreaWidth, localShowAreaHight, localScale.x + scaleFactor);

            //记住最新的触摸点,下次使用  
            oldTouch1 = newTouch1;
            oldTouch2 = newTouch2;
        }

        public void ZoomRemove(float localMapWidth, float localMapHight, float localShowAreaWidth, float localShowAreaHight,float scale)
        {
            float Map_X = mOriginTexture.rectTransform.anchoredPosition.x;
            float Map_Y = mOriginTexture.rectTransform.anchoredPosition.y;
            bool IsRemove = false;

            // 计算当前比例边界的极限值
            float Limit_X = (localMapWidth * scale * 0.5f) - localShowAreaWidth * 0.5f;
            float Limit_Y = (localMapHight * scale * 0.5f) - localShowAreaHight * 0.5f;

            if (Map_X < 0 && Map_Y < 0)
            {
                Limit_X = Limit_X * -1;
                Limit_Y = Limit_Y * -1;
            }
            else if (Map_X > 0 && Map_Y < 0)
            {
                Limit_Y = Limit_Y * -1;
            }
            else if (Map_X < 0 && Map_Y > 0)
            {
                Limit_X = Limit_X * -1;
            }

            if (System.Math.Abs(Map_X) > System.Math.Abs(Limit_X))
            {
                Map_X = Limit_X;
                IsRemove = true;
            }

            if (System.Math.Abs(Map_Y) > System.Math.Abs(Limit_Y))
            {
                Map_Y = Limit_Y;
                IsRemove = true;
            }

            if (IsRemove)
            {

                Vector3 PosXY = new Vector3(Map_X, Map_Y, 0);

                TRACE.TraceLn("双指缩放地图, scale = " + scale + " PosXY = " + PosXY);
                TRACE.TraceLn("双指缩放地图,参数 localMapWidth = " + localMapWidth + "localMapHight = " + localMapHight);
                TRACE.TraceLn("双指缩放地图,参数 localShowAreaWidth = " + localShowAreaWidth + "localShowAreaHight = " + localShowAreaHight);
                TRACE.TraceLn("双指缩放地图,当前的距离 Map_X = " + Map_X + "Map_Y = " + Map_Y);
                TRACE.TraceLn("双指缩放地图,卡边的极限距离 Limit_X = " + Limit_X + "Limit_Y = " + Limit_Y);

                mOriginTexture.rectTransform.anchoredPosition = PosXY;
            }

            Vector3 Scale = new Vector3(scale, scale, scale);

            mOriginTexture.rectTransform.localScale = Scale;
        }
    }
  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-11-11 13:02:12  更:2021-11-11 13:03:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 0:32:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码