Unity触摸激活旋转缩放

RotateAndZoom

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Assertions.Comparers;

public class RotateAndZoom : MonoBehaviour
{
    public int id;
    public bool isMain;

    public static RotateAndZoom _instance;

    private Quaternion startQuaternion;
    private Vector3 startScale;
    private Vector3 startPos;
    private Vector3 centerPos;

    private Touch frisTouch;
    private Touch secondTouch;

    private bool autoRotate;
    private bool isRecover;
    [HideInInspector]
    public float coolTime;

    private bool isCenter;

    private float waitTime;
    private float recoverTime;
    private float centerTime;
    private bool isTouch;

    private bool isCool;

    void Awake()
    {
        _instance = this;
    }

    void Start()
    {
        isCool = true;
        centerPos = new Vector3(0,0,-1);
        startQuaternion = transform.rotation;
        startScale = transform.localScale;
        startPos = transform.position;
        autoRotate = true;
    }

    void Update()
    {
        AutoRoattionAndRecover();

        if (Input.touchCount < 0)
            return;

        if (isTouch)
        {
            if (Input.touchCount > 0)
            {
                Touch touch = Input.GetTouch(0);
                Vector2 deltaPos = touch.deltaPosition;

                transform.Rotate(Vector3.down*deltaPos.x*2, Space.World);
                transform.Rotate(Vector3.right*deltaPos.y*2, Space.World);
            }

            if (Input.touchCount > 0)
            {
                Touch newTouch1 = Input.GetTouch(0);
                Touch newTouch2 = Input.GetTouch(1);

                if (newTouch2.phase == TouchPhase.Began)
                {
                    frisTouch = newTouch1;
                    secondTouch = newTouch2;
                    return;
                }


                float startDistance = Vector2.Distance(frisTouch.position, secondTouch.position);
                float newDistance = Vector2.Distance(newTouch1.position, newTouch2.position);

                float offset = newDistance - startDistance;


                float scaleFactor = offset/100f;
                Vector3 localScale = transform.localScale;
                Vector3 scale = new Vector3(localScale.x + scaleFactor, localScale.y + scaleFactor,
                    localScale.z + scaleFactor);

                if (scale.x > 0.3f && scale.y > 0.3f && scale.z > 0.3f)
                {
                    transform.localScale = scale;
                }

                float scale1 = Mathf.Clamp(transform.localScale.x, 3f, 4.5f);
                transform.localScale = Vector3.one*scale1;
                ;
                frisTouch = newTouch1;
                secondTouch = newTouch2;
            }
        }

        if (isMain && !isRecover)
        {
            if (Input.touchCount > 0)
            {
                if (Input.GetTouch(0).phase == TouchPhase.Began || Input.GetTouch(0).phase == TouchPhase.Moved)
                {
                    coolTime = 0;
                }
            }

            if (isCool)
                isCenter = true;

            autoRotate = false;
            waitTime += Time.deltaTime;
            if (waitTime >= 2)
            {
                isTouch = true;
            }
            coolTime += Time.deltaTime;
            if (coolTime >= 3)
            {
                coolTime = 0;
                isRecover = true;
                isTouch = false;
                waitTime = 0;
                isMain = false;
                isCenter = false;
            }
        }


    }

    void AutoRoattionAndRecover()
    {
        if (autoRotate)
            transform.RotateAround(transform.position, Vector3.up, 30 * Time.deltaTime);

        if (isRecover)
        {
            transform.position = Vector3.Lerp(transform.position, startPos, 2*Time.deltaTime);
            transform.rotation = Quaternion.Lerp(transform.rotation, startQuaternion, 2*Time.deltaTime);
            transform.localScale = Vector3.Lerp(transform.localScale, startScale, 2*Time.deltaTime);

            recoverTime += Time.deltaTime;
            if (recoverTime >= 2)
            {
                recoverTime = 0;
                autoRotate = true;
                isRecover = false;
                isCool = true;
            }
        }

        if (isCenter)
        {
            transform.position = Vector3.Lerp(transform.position, centerPos, 2*Time.deltaTime);
            transform.localScale = Vector3.Lerp(transform.localScale, Vector3.one*2.8f, 2*Time.deltaTime);
            centerTime += Time.deltaTime;
            if (centerTime >= 2)
            {
                centerTime = 0;
                isCool = false;
                isCenter = false;
            }
        }

    }
}

GameManager

using System.Collections;
using System.Collections.Generic;
using System.Security.Policy;
using UnityEngine;
using UnityEngine.UI;

public class GameManager : MonoBehaviour
{
    public static GameManager _instance;
    
    public Transform[] spawnTargetpos;
    public GameObject targetGo;
    public Transform parent;
    public Text getText;
    [HideInInspector]
    public List<GameObject> goList = new List<GameObject>(); 
    private int touchIndex = -1;
    private bool isStop;
    private RaycastHit hitInfor;

    private RotateAndZoom touchGo_RotateZoom ;

    void Awake()
    {
        _instance = this;
    }

    void Start()
    {
        isStop = true;
    }


    void Update()
    {

        if (Input.touchCount > 0)
        {
            if (Input.GetTouch(0).phase == TouchPhase.Began)
            {
                LoopAddGameObject();

                touchIndex++;
                GameObject go = GameObject.Instantiate(targetGo) as GameObject;
                go.transform.position = spawnTargetpos[touchIndex].position;
                RotateAndZoom rotateAndZoom = go.GetComponent<RotateAndZoom>();
                rotateAndZoom.id = touchIndex;
                goList.Add(go);

                Ray ray = Camera.main.ScreenPointToRay(Input.GetTouch(0).position);
                Physics.Raycast(ray, out hitInfor, 100);

                if (!hitInfor.collider)
                {

                }
                else
                {
                    touchGo_RotateZoom = hitInfor.collider.gameObject.GetComponent<RotateAndZoom>();
                    touchGo_RotateZoom.isMain = true;
                    touchGo_RotateZoom.coolTime = 0;
                    HeadOtherCollider(touchGo_RotateZoom.id);
                    getText.text = touchGo_RotateZoom.id.ToString();
                }
            }
        }

        CheckTouchObjectState();
    }
    
    void HeadOtherCollider(int id)
    {
        for (int i = 0; i < goList.Count; i++)
        {
            RotateAndZoom rotateAndZoom = goList[i].GetComponent<RotateAndZoom>();
            if (rotateAndZoom.id == id)
            {
                Collider collider = rotateAndZoom.GetComponent<Collider>();
                //MeshRenderer renderer = rotateAndZoom.GetComponent<MeshRenderer>();
                collider.enabled = true;
                //renderer.material.color =  Color.red;
            }
            else
            {
                Collider collider = rotateAndZoom.GetComponent<Collider>();
                //MeshRenderer renderer = rotateAndZoom.GetComponent<MeshRenderer>();
                collider.enabled = false;
                //renderer.material.color = Color.blue;
            }
        }
    }


    void CheckTouchObjectState()
    {
        if (touchGo_RotateZoom == null)
        {
            return;
        }

        if (!touchGo_RotateZoom.isMain)
        {
            for (int i = 0; i < goList.Count; i++)
            {
                Collider collider = goList[i].GetComponent<Collider>();
                //MeshRenderer renderer = goList[i].GetComponent<MeshRenderer>();
                collider.enabled = true;
                //renderer.material.color = Color.blue;
            }
        }
    }


    void LoopAddGameObject()
    {
        if (goList.Count > 10)
        {
            print(touchIndex);
            for (int i = 0; i < goList.Count; i++)
            {
                RotateAndZoom rotateAndZoom1 = goList[i].GetComponent<RotateAndZoom>();

                if (rotateAndZoom1.id == touchIndex - 10)
                {
                    MeshRenderer[] renderers = rotateAndZoom1.GetComponentsInChildren<MeshRenderer>();
                    for (int j = 0; j < renderers.Length; j++)
                    {
                        renderers[i].enabled = false;
                    }
                    goList.Remove(rotateAndZoom1.gameObject);
                    GameObject.Destroy(rotateAndZoom1.gameObject, 0.5f);
                }

            }
        }
    }
}

Unity是一款功能齐全的游戏引擎,它提供了一系列便捷的工具和模块让程序员开发游戏更加容易。其中包括了触摸屏控制模型旋转缩放的功能。 想要在Unity中实现模型的旋转缩放,我们需要编写一些代码。首先,我们需要定义一个变量来存储触摸屏幕的位置,当用户触摸屏幕时,我们可以利用Input.touchCount语句来查询触摸的数量。然后,我们可以使用Input.GetTouch (int index)语句来获得特定触摸的信息,例如触摸的位置。我们可以使用这些触摸信息来改变模型的旋转缩放。 例如,我们可以定义一个变量来存储我们想要缩放的对象: [SerializeField] private Transform _myObject; 然后,我们可以在Update()的一段代码中来处理触摸缩放的相关逻辑: void Update(){ if(Input.touchCount == 2){ Touch touchZero = Input.GetTouch(0); Touch touchOne = Input.GetTouch(1); Vector2 touchZeroPreviousPosition = touchZero.position - touchZero.deltaPosition; Vector2 touchOnePreviousPosition = touchOne.position - touchOne.deltaPosition; float previousTouchDeltaMagnitude = (touchZeroPreviousPosition - touchOnePreviousPosition).magnitude; float touchDeltaMagnitude = (touchZero.position - touchOne.position).magnitude; float deltaMagnitudeDiff = previousTouchDeltaMagnitude - touchDeltaMagnitude; _myObject.localScale -= Vector3.one * deltaMagnitudeDiff * 0.01f; } } 这段代码会侦测两个手指是否点击了屏幕,然后读取触摸的位置信息,计算两个触摸点之间的距离差, 用扩展因子(0.01f)乘以这个距离差作为缩放的参数来调整模型的大小。 Unity触摸控制和旋转缩放功能让游戏开发变得更加轻松和快捷,它使程序员能够专注于游戏的设计和娱乐性,而不需要关注底层细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值