直播APP源碼點擊拖拽物體、雙指放大縮小

1.點擊拖拽3D物體,適用於PC、安卓
1.需要UGUI

2.需要Collider、場景中要存在EventSystem

3.將腳本掛載物體上即可

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
 
//安卓 PC都好用 點擊物體移動
/// <summary>
/// 物體上要有collider
/// 場景中要存在EventSystem
/// </summary>
[RequireComponent(typeof(RectTransform))]
public class EventClick : MonoBehaviour, IPointerClickHandler
{ 
    public Text text;
 
    private bool isDrag = false;
    //偏移量
    private Vector3 offset = Vector3.zero;
 
 
    public void OnPointerClick(PointerEventData eventData)
    {
        text.text="點到我啦!!!";
    }
    IEnumerator OnMouseDown()
    {
        //將物體由世界座標系轉化爲屏幕座標系,由vector3 結構體變量ScreenSpace存儲,以用來明確屏幕座標系Z軸的位置
        Vector3 ScreenSpace = Camera.main.WorldToScreenPoint(transform.position);
        //完成了兩個步驟,1由於鼠標的座標系是2維的,需要轉化成3維的世界座標系,2只有三維的情況下才能來計算鼠標位置與物體的距離,offset即是距離
        Vector3 offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, ScreenSpace.z));
        Debug.Log("down");
        //當鼠標左鍵按下時
        while (Input.GetMouseButton(0))
        {
            //得到現在鼠標的2維座標系位置
            Vector3 curScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, ScreenSpace.z);
            //將當前鼠標的2維位置轉化成三維的位置,再加上鼠標的移動量
            Vector3 CurPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset;
            //CurPosition就是物體應該的移動向量賦給transform的position屬性
            transform.position = CurPosition;
            yield return new WaitForFixedUpdate();
        }
 
    }
}

2.UGUI雙指放大縮放旋轉物體
1.安卓端好用,PC端不行

2.需要Collider、場景中要存在EventSystem

3.將腳本掛載物體上即可

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public enum FingerIE
{
    zero,
    OneFinger,
    TwoFinger,
}
public class Demo : MonoBehaviour
{
 
    public Vector3 initialRot;
    public Vector3 initialSca;
    public static Demo instance;
    IEnumerator ie;
    FingerIE finger_num = FingerIE.zero;
    void Awake()
    {
        instance = this;
    }
    // Update is called once per frame
    void Update()
    {
 
        if (Input.touchCount == 0)
        {
            if (finger_num != FingerIE.zero)
            {
                StopCoroutine(ie);
                ie = null;
                finger_num = FingerIE.zero;
            }
        }
        else if (Input.touchCount == 1)
        {
            if (finger_num != FingerIE.OneFinger)
            {
                if (ie != null)
                {
                    StopCoroutine(ie);
                }
                ie = IMonitorMouseOneFinger();
                StartCoroutine(ie);
                finger_num = FingerIE.OneFinger;
            }
        }
        else if (Input.touchCount == 2)
        {
            if (finger_num != FingerIE.TwoFinger)
            {
                if (ie != null)
                {
                    StopCoroutine(ie);
                }
                ie = IIMonitorMouseTwoFinger();
                StartCoroutine(ie);
                finger_num = FingerIE.TwoFinger;
            }
        }
 
    }
    /// <summary>
    /// 一根手指控制轉動
    /// </summary>
    /// <returns></returns>
    IEnumerator IMonitorMouseOneFinger()
    {
        //單手操作
        Touch oneFingerTouch;
        while (true)
        {
            oneFingerTouch = Input.GetTouch(0);
            if (oneFingerTouch.phase == TouchPhase.Moved)
            {
                Vector2 deltaPos = oneFingerTouch.deltaPosition;
                transform.Rotate(-Vector3.up * deltaPos.x * 0.2f, Space.World);
                transform.Rotate(-Vector3.left * deltaPos.y * 0.2f, Space.World);
            }
            yield return 0;
        }
    }
    /// <summary>
    /// 兩個手指控制縮放
    /// </summary>
    /// <returns></returns>
    IEnumerator IIMonitorMouseTwoFinger()
    {
        Touch firstOldTouch;
        Touch secondOldTouch;
        Touch firstNewTouch;
        Touch secondNewTouch;
        float oldDistance;
        float newDistance;
        while (true)
        {
            firstOldTouch = Input.GetTouch(0);
            secondOldTouch = Input.GetTouch(1);
            oldDistance = Vector2.Distance(firstOldTouch.position, secondOldTouch.position);
            yield return 0;
            firstNewTouch = Input.GetTouch(0);
            secondNewTouch = Input.GetTouch(1);
            newDistance = Vector2.Distance(firstNewTouch.position, secondNewTouch.position);
            if (oldDistance > newDistance && this.transform.localScale.x > 0.25f)
            {
                this.transform.localScale -= Vector3.one * 0.1f;
            }
            else if (oldDistance < newDistance && this.transform.localScale.x < 2f)
            {
                this.transform.localScale += Vector3.one * 0.1f;
            }
        }
    }
    /// <summary>
    /// 復位
    /// </summary>
    public void ResetRot()
    {
        this.transform.localEulerAngles = initialRot;
        this.transform.localScale = initialSca;
    }
 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章