unity3d:控制模型单指旋转,双指缩放,并停止控制一段时间后自转

2023-08-24 14:27:17 浏览数 (2)

控制模型:移动端:单指旋转,双指缩放 PC:左键旋转,滚轮缩放

代码语言:javascript复制
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Framework.Event;
public class ModelCtrl : MonoBehaviour {
    public Transform m_tar;

    public float m_xAngles = 0.0f;
    public float m_yAngles = 0.0f;

    //物体的旋转角度
    public float m_rotateSpeed = 0.2f;

    public float m_scale = 1.0f;
    public float m_scaleStep = 0.5f;
    public float m_scaleMax = 10.0f;
    public float m_scaleMin = 1.0f;

    bool m_isRotate = false;
    bool m_isScale = false;
    private float m_yMinLimit = -90;
    private float m_yMaxLimit = 90;

    Vector2 m_oldPos0;
    Vector2 m_oldPos1;
    // Use this for initialization
    void Start () {

        m_scale = m_tar.localScale.x;
        m_scaleMax = 1.5f * m_scale;
        m_scaleMin = 0.5f * m_scale;
    }

    // Update is called once per frame
    void Update () {
        m_isRotate = false;
        m_isScale = false;

        if (Application.platform == RuntimePlatform.IPhonePlayer || Application.platform == RuntimePlatform.Android)
        {
            if (Input.touchCount == 1)
            {
                if (Input.GetTouch(0).phase == TouchPhase.Moved)
                {
                    m_xAngles = Input.GetAxis("Mouse X");
                    m_yAngles = Input.GetAxis("Mouse Y");

                    EventManager.Instance.DispatchEvent((uint)ZCY.EventType.StopSelfRotate);
                    m_isRotate = true;
                }
            }
            else if (Input.touchCount == 2)
            {
                if (Input.GetTouch(0).phase == TouchPhase.Moved && Input.GetTouch(1).phase == TouchPhase.Moved)
                {

                    var curPos0 = Input.GetTouch(0).position;
                    var curPos1 = Input.GetTouch(1).position;

                    if (IsEnlarge(m_oldPos0, m_oldPos1, curPos0, curPos1))
                    {
                        FullRenderScale(true, m_scaleStep);
                    }
                    else
                    {

                        FullRenderScale(false, m_scaleStep);
                    }
                    EventManager.Instance.DispatchEvent((uint)ZCY.EventType.StopSelfRotate);
                    m_oldPos0 = curPos0;
                    m_oldPos1 = curPos1;
                    m_isScale = true;
                }
            }

        }
        else //别的平台
        {
            if (Input.GetAxis("Mouse ScrollWheel") < 0)
            {
                FullRenderScale(false, m_scaleStep);

                EventManager.Instance.DispatchEvent((uint)ZCY.EventType.StopSelfRotate);
                m_isScale = true;
            }
            else if (Input.GetAxis("Mouse ScrollWheel") > 0)
            {
                FullRenderScale(true, m_scaleStep);

                EventManager.Instance.DispatchEvent((uint)ZCY.EventType.StopSelfRotate);
                m_isScale = true;
            }
            else if (Input.GetMouseButton(0))
            {
                m_xAngles = Input.GetAxis("Mouse X");
                m_yAngles = Input.GetAxis("Mouse Y");

                EventManager.Instance.DispatchEvent((uint)ZCY.EventType.StopSelfRotate);
                m_isRotate = true;
            }
        }

    }

    bool IsEnlarge(Vector2 old0, Vector2 old1, Vector2 cur0, Vector2 cur1)
    {
        var leng1 = Mathf.Sqrt((old0.x - old1.x) * (old0.x - old1.x)   (old0.y - old1.y) * (old0.y - old1.y));
        var leng2 = Mathf.Sqrt((cur0.x - cur1.x) * (cur0.x - cur1.x)   (cur0.y - cur1.y) * (cur0.y - cur1.y));
        if (leng1 < leng2)
        {
            return true;
        }
        else
        {
            return false;
        }
    }


    void FullRenderScale(bool isBig, float scale)
    {
        if (isBig)
        {
            if (m_scale < m_scaleMax)
            {
                m_scale  = scale;
            }
        }
        else
        {
            if (m_scale > m_scaleMin)
            {
                m_scale -= scale;
            }
        }
    }

    private void LateUpdate()
    {
        if (m_isRotate == true)
        {
            m_tar.Rotate(Vector3.up, -m_xAngles, Space.World);
            m_tar.Rotate(Vector3.right, m_yAngles , Space.World);

            //m_tar.GetComponent<Rigidbody>().AddTorque( m_yAngles* m_rotateSpeed, -m_xAngles* m_rotateSpeed, 0);
        }

        if (m_isScale == true)
        {
            m_tar.transform.localScale = new Vector3(m_scale, m_scale, m_scale);
        }
    }

    static float ClampAngle(float angle, float min, float max)
    {
        if (angle < -360)
            angle  = 360;
        if (angle > 360)
            angle -= 360;
        if (angle > 180)
            angle -= 360;
        return Mathf.Clamp(angle, min, max);
    }
}

当有控制模型旋转,缩放是,停止模型的自转,等待5s后无控制事件,再恢复自转

代码语言:javascript复制
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Framework.Event;
using System.Diagnostics;

public class SelfRotate : MonoBehaviour {
    float _RotationSpeed = 1.0f;
    Stopwatch m_watch = new Stopwatch();
    bool m_isEnable = true;
    // Use this for initialization
    void Start () {
        m_watch.Stop();
        m_watch.Reset();
        EventManager.Instance.AddEventListener((uint)ZCY.EventType.StopSelfRotate, OnStopSelfRotate);

    }

    private void OnDestroy()
    {
        EventManager.Instance.RemoveEventListener((uint)ZCY.EventType.StopSelfRotate, OnStopSelfRotate);
    }

    // Update is called once per frame
    void Update ()
    {
        if (m_isEnable == false && m_watch.ElapsedMilliseconds > 5000)
        {
            m_isEnable = true;
            m_watch.Stop();
            m_watch.Reset();
        }
        if (m_isEnable)
        {
            transform.Rotate(Vector3.down * _RotationSpeed, Space.World); //物体自转
        }
    }

    void OnStopSelfRotate(EventData note)
    {
        m_isEnable = false;
        m_watch.Stop();
        m_watch.Reset();
        m_watch.Start();
    }
}

0 人点赞