1. 程式人生 > >Unity 移動端簡單手勢控制(移動,旋轉,縮放)

Unity 移動端簡單手勢控制(移動,旋轉,縮放)

using UnityEngine;
using System.Collections;
using System.IO;
/// <summary>
/// 點選螢幕實現縮放與旋轉,移動
/// </summary>
public class FingerTouch : MonoBehaviour
{


    private Touch oldTouch1;  //上次觸控點1(手指1)  
    private Touch oldTouch2;  //上次觸控點2(手指2)  

    void Update()
    {

            //沒有觸控  
            if
(Input.touchCount <= 0) { return; } //單點觸控, 水平上下移動 if (Input.touchCount ==1&& Input.GetTouch(0).phase == TouchPhase.Moved) { var deltaposition = Input.GetTouch(0).deltaPosition; transform.Translate(-deltaposition.x * 0.1
f, 0f, -deltaposition.y * 0.1f); } //單點觸控, 水平上下旋轉 if (1 == Input.touchCount) { Touch touch = Input.GetTouch(0); Vector2 deltaPos = touch.deltaPosition; transform.Rotate(Vector3.down * deltaPos.x, Space.World); transform.Rotate(Vector3.right * deltaPos.y, Space.World); } //多點觸控, 放大縮小
Touch newTouch1 = Input.GetTouch(0); Touch newTouch2 = Input.GetTouch(1); //第2點剛開始接觸螢幕, 只記錄,不做處理 if (newTouch2.phase == TouchPhase.Began) { oldTouch2 = newTouch2; oldTouch1 = newTouch1; 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 / 100f; Vector3 localScale = transform.localScale; Vector3 scale = new Vector3(localScale.x + scaleFactor, localScale.y + scaleFactor, localScale.z + scaleFactor); //最小縮放到 0.3 倍 if (scale.x > 0.3f && scale.y > 0.3f && scale.z > 0.3f) { transform.localScale = scale; } //記住最新的觸控點,下次使用 oldTouch1 = newTouch1; oldTouch2 = newTouch2; } }

2017.09.18
考慮到在移動端介面上可能有大量的UI ,上述方法在點選到UI的時候照樣會觸發移動旋轉縮放等相關功能,所以多上述方法進行了部分修改以及修改了一個bug。

public class FingerTouch : MonoBehaviour
{
    private float minScale = 0.3f;
    private float maxScale = 3f;

    private Touch oldTouch1;  //上次觸控點1(手指1)  
    private Touch oldTouch2;  //上次觸控點2(手指2)  

    void Update()
    {

        //沒有觸控  
        if (Input.touchCount <= 0)
        {
            return;
        }

        //單點觸控, 水平上下移動
        if (Input.touchCount == 1 && Input.GetTouch(0).phase == TouchPhase.Moved)
        {   
            //EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId)為true表示點到了UI
            if (!EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId))
            {
                var deltaposition = Input.GetTouch(0).deltaPosition;
                transform.Translate(-deltaposition.x * 0.1f, 0f, -deltaposition.y * 0.1f);
            }
        }
        //單點觸控, 水平上下旋轉  
        if (1 == Input.touchCount)
        {

            if (!EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId))
            {
                Touch touch = Input.GetTouch(0);
                Vector2 deltaPos = touch.deltaPosition;
                transform.Rotate(Vector3.down * deltaPos.x, Space.World);
                transform.Rotate(Vector3.right * deltaPos.y, Space.World);
            }
        }

        //多點觸控, 放大縮小  
        Touch newTouch1 = Input.GetTouch(0);
        Touch newTouch2 = newTouch1;
        Debug.Log(Input.touchCount);
        if (Input.touchCount == 2)
        {
            newTouch2 = Input.GetTouch(1);
            //第2點剛開始接觸螢幕, 只記錄,不做處理  
            if (newTouch2.phase == TouchPhase.Began)
            {
                oldTouch2 = newTouch2;
                oldTouch1 = newTouch1;
                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 / 100f;
            Vector3 localScale = transform.localScale;
            Vector3 scale = new Vector3(localScale.x + scaleFactor,
                                        localScale.y + scaleFactor,
                                        localScale.z + scaleFactor);
            if (!EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId)
                && !EventSystem.current.IsPointerOverGameObject(Input.GetTouch(1).fingerId))
            {
                //最小縮放到 0.3 倍 ,最大放大到 3 倍
                if (scale.x > minScale && scale.y > minScale && scale.z > minScale && scale.x < maxScale && scale.y < maxScale && scale.z < maxScale)
                {
                    transform.localScale = scale;
                }
                //記住最新的觸控點,下次使用  
                oldTouch1 = newTouch1;
                oldTouch2 = newTouch2;
            }
        }
    }
}

相關推薦

Unity 移動簡單手勢控制移動旋轉

using UnityEngine; using System.Collections; using System.IO; /// <summary> /// 點選螢幕實現縮放與旋轉,移動 /// </summary> public cl

七、Sketchup用ruby進行二次開發--利用Transformation實現Move工具平移、旋轉

 在Sketchup中,move工具使用的非常廣泛,,可以移動、拉伸和複製幾何體,也可以用來旋轉元件。舉一個簡單地例子。 我們要做一個建築物的尖頂,如下圖所示,就是使用move工具實現的。                   接下來我們就要學習如何使用ruby實現這樣的功能

vtkPolyData 的空間變換平移、旋轉

vtkPolydata的空間變化主要基於vtkTransform與vtkTransformPolyDataFilter兩個類實現,示例程式碼如下: vtkSmartPointer<vtkTr

opengl繪製桌子平移、旋轉

主要儀器裝置 VisualStudio C++2015 Windows10環境 Glut壓縮包 Ex2工程 操作方法和實驗步驟 1.繪製立方體 桌子由立方體組成,我們可以通過繪製六個面來構造一個立方體。六個面的繪製需要八個頂點的引數,而每個頂點均有x,y,z三個引數,如

iOS transform平移、旋轉

一、平移 //平移 [UIView animateWithDuration:0.5 animations:^{ //使用Make,它是相對於最原始的位置做的形變. //self.imageV.tr

移動 圖片手勢控制 雙指 單指移動

var pageX,pageY,position_top,position_left; function setGesture(el) { var obj = {}; //定義一個物件 var istouch = fals

移動tabbar按鈕滑動給div加橫向滾動條

手寫程式碼乾貨,已測試(請在移動端中開啟除錯) <!DOCTYPE html> <html> <head> <title>底部tabbar欄滑動</title> <script type="text/ja

Axure中移動原型設計方法附IPhoneX和IPhone8最新模板

Axure中移動端原型設計方法(附IPhoneX和IPhone8最新模板) 2018年4月16日luodonggan Axure中基於裝置模板的移動端原型設計方法(附IPhoneX和IPhone8最新模板) 文章作者分享了一種基於裝置模板的移動端原型設計方法,相信能夠對你的原型設計

Unity客戶框架筆記二元件實體開發模式的思考

https://blog.csdn.net/langresser_king/article/details/46324977 Unity客戶端框架筆記二(元件實體開發模式的思考) 2015年06月02日 11:40:13 langresser 閱讀數:4315更多 個

自定義Imageview控制元件實現多種手勢操作 拖動、水平、豎直、等比例、雙擊、長按

專案中需要使用自定義控制元件的多種手勢操作,之前在網上查閱資料的時候發現能找到的一般是隻實現了其中的幾種,這次就把我做的控制元件分享一下,人人為我,我為人人嘛,哈哈! 這個自定義控制元件實現的主要功能是控制元件的拖動和縮放(注意:不是對控制元件中的圖片進行操作,話說很多帖子

Unity3D——學習分享簡單程式碼控制主角移動

簡單的程式碼控制主角的移動 首先先分享個概念,方便大家對移動程式碼的理解 Time.deltaTime 它是系統變數,封裝在Time類中,含義是距離上一幀所經歷的時間(單位為秒)。它不受遊戲幀率的影響,我們有時需要主角移動以秒為單位而不是以幀為單位,乘以Time.deltaTim

關於移動滑動手勢

drop mobile https htm rop zha obi .html top 背景: 基於要嘗試的移動端項目需要有一個通過上拉下滑手勢達成加載不同數據的功能,其涉及到滑動手勢和ajax數據加載方面的知識點。故對整個實現過程做一個記錄整理。個人JS功底有限,看了諸多

移動權限控制--設置每個登錄用戶的sessionId

sessionid前言: 在pc端,每個用戶首次登錄後,瀏覽器會返回一個sessionId,存放在瀏覽器的響應中。當再次訪問其他接口時,瀏覽器會自動將sessionId放在請求頭中的Cookie中。後臺會自動識別sessionId,判斷是哪個用戶發過來的請求。 但是在移動端,瀏覽器沒有實現這個功

移動rem設置部分安卓機型不兼容

settime body 安卓 屏幕 gpo color ref rect() refresh (function(win) { var doc = win.document; var docEl = doc.documentElement;

Unity —— 通過鼠標點擊控制物體移動

技術 aps this lap sep CA sha pub mon 1 //ClickMove - - 通過鼠標點擊控制物體移動 2 3 using System.Collections; 4 using System.Collections.Generic

移動調試神器eruda

發的 真機測試 str 顯示 targe scrip nbsp 調試工具 wid Eruda 是一個專為手機網頁前端設計的調試面板,類似 DevTools 的迷你版,其主要功能包括:捕獲 console 日誌、檢查元素狀態、顯示性能指標、捕獲XHR請求、顯示本地存儲和 Co

前端 移動簡單了解

har 文件 name () log 啟動會 bottom orien red html文件:rem和html有關 em和當前盒子有關 <!DOCTYPE html> <html> <head> <me

移動觸控上拉隱藏指定模組內容有過度效果同時頁面iscroll滾動

應用場景:觸碰螢幕進行上拉隱藏指定模組內容,有過度效果;在滾動到第一條內容的時候,才可以進行下拉重新出現該模組內容。 style樣式: *{ margin: 0; padding: 0; font-family: "微軟雅黑"; } html,body{ width: 100%; height: 100%

關於rem換算、移動通過js控制動態控制rem寬高比的一個函式

(function () { // rem換算zx var resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize'; var do

移動簡單的遮罩層案例

一.CSS樣式 #loadingBg{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);z-index:15000;display:none;} #loadingBg img{positio