Unity 觸控實現模型的旋轉和放大縮小


首先介紹一下Input.touches結構,這是一個觸摸數組,每個記錄代表着手指在屏幕上的觸碰狀態。每個手指觸控都是通過Input.touches來描述的:

fingerId

觸摸的唯一索引

position

觸摸屏幕的位置

deltatime

從最后狀態到目前狀態所經過的時間

tapCount

點擊數。Andorid設備不對點擊計數,這個方法總是返回1

deltaPosition

自最后一幀所改變的屏幕位置

phase

相位,也即屏幕操作狀態

其中phase(狀態)有以下這幾種:

Began

手指剛剛觸摸屏幕

Moved

手指在屏幕上移動

Stationary

手指觸摸屏幕,但自最后一陣沒有移動

Ended

手指離開屏幕

Canceled

系統取消觸控跟蹤,原因如把設備放在臉上或同時超過5個觸摸點

 

 

在Unity 游戲運行在手機上時鼠標左鍵的操作可以用觸摸屏幕來代替,但是無法代替多點的觸控。(也就是說在調用getaxis和getmousebutton等方法時手機上進行觸摸屏幕也可以響應)

下面是通過在手機上進行操作來實現旋轉和放大縮小的代碼

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    public float rotateSpeed;
    public Vector2 nTouchPos1;
    public Vector2 nTouchPos2;
    public Vector2 oTouchPos1;
    public Vector2 oTouchPos2;

    // Update is called once per frame
    void Update()
    {
        //旋轉
        if (Input.GetMouseButton(0))
        {
            if (Input.touchCount == 1)
            {
                if (Input.GetTouch(0).phase == TouchPhase.Moved)
                {
                    Debug.Log("開始旋轉");
                    float moveX = Input.GetTouch(0).deltaPosition.x;
                    Debug.Log("滑動的距離" + moveX);
                    transform.Rotate(Vector3.up * -rotateSpeed * moveX * Time.deltaTime);
                }
            }
        }

        ZoomInOut();
        if (this.transform.position.y > 0)
        {
            return;
        }
        this.transform.Translate(new Vector3(0, 0.5f, 0) * Time.deltaTime);
        
    }


    bool IsEnLarge(Vector2 nPos1,Vector2 nPos2,Vector2 oPos1,Vector2 oPos2)
    {
        float nDis = Vector2.Distance(nPos1, nPos2);
        float oDis = Vector2.Distance(oPos1, oPos2);

        if(nDis<oDis)
        {
            return false;
        }
        else
        {
            return true;
        }
    }

    void ZoomInOut()
    {
        if(Input.touchCount==2)
        {
            if(Input.GetTouch(0).phase==TouchPhase.Moved||Input.GetTouch(1).phase==TouchPhase.Moved)
            {
                nTouchPos1 = Input.GetTouch(0).position;
                nTouchPos2 = Input.GetTouch(1).position;

                if(IsEnLarge(nTouchPos1,nTouchPos2,oTouchPos1,oTouchPos2))
                {
                    Vector3 nScale = transform.localScale*1.01f;
                    transform.localScale = new Vector3(nScale.x, nScale.y, nScale.z);
                }
                else
                {
                    Vector3 nScale = transform.localScale *0.99f;
                    transform.localScale = new Vector3(nScale.x, nScale.y, nScale.z);
                }

                oTouchPos1 = nTouchPos1;
                oTouchPos2 = nTouchPos2;
            }
        }
    }
}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM