UnityAR中滑动屏幕使物体旋转,大小与屏幕UI冲突的解决方法~

以往的AR教程里都是使用屏幕点击事件来实现 识别图物体的放大,缩小,旋转, 然后问题就是会和UI冲突,很长见得一个ScrollRcst滑动UI发现 你滑动UI时 物体也跟着旋转 , 这样 给人的体验很不好,解决方法如下(本人菜鸡一枚,只是想分享下,勿喷~)

 

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class ChangeModelScale : MonoBehaviour {

    public float xspeed = 150.0f;
    private Touch oldTouch1;
    private Touch oldTouch2;
    public static Vector3 scale;
    public GameObject chanGeModel;
    
    Ray ray;

    Quaternion rotation;
    
  
    void Start () {
        
    }
    

    void Update()
    {
        if (DaYe.rayCanUse)
        {
            ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit))
            {

                if (hit.collider.gameObject.layer == LayerMask.NameToLayer("Tmd"))
                {
                    Debug.Log(hit.transform.gameObject.layer + "检测到了");
                    EarthRotation();
                    ChangeScale();
                }

            }
        }

        
    }
    void EarthRotation()
    {
        //单点触摸控制地球的旋转
        if(Input.GetMouseButton(0))
        {
            if (Input.touchCount == 1)
            {
                if (Input.GetTouch(0).phase == TouchPhase.Moved)
                {
                    transform.Rotate(Vector3.up * Input.GetAxis("Mouse X") * -xspeed * Time.deltaTime, Space.World);
                }
            }
        }
        
    }


    public void ChangeScale()
    {

       
       

        if (Input.touchCount == 2)
        {
            Touch newTouch1 = Input.GetTouch(0);
            Touch newTouch2 = Input.GetTouch(1);
            //第二点刚开始触摸屏幕,只记录,不作处理
            if (newTouch2.phase == TouchPhase.Began)
            {
                oldTouch1 = newTouch1;
                oldTouch2 = newTouch2;
                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;
            scale = new Vector3(localScale.x + scaleFactor, localScale.y + scaleFactor, localScale.z + scaleFactor);
            //最小缩小到0.3倍
            if (scale.x > 0.3f && scale.x < 2.5f)
            {
                transform.localScale = scale;
            }
            //记住最新的触摸点,下次使用
            oldTouch1 = newTouch1;
            oldTouch2 = newTouch2;
        }
    }
}

 

在新建一个脚本不用挂载

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



public static class DaYe
{
    public static bool rayCanUse = true;
}

public class LitterItems : MonoBehaviour {

}

 

 

挂在物体上  加上Collider 就ok啦~嘿嘿~

屏幕UI记得要在相机面前加Panle 哦

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值