Unity3d 简单实现物体旋转缩放移动

由于项目运行在安卓上,运用到了插件,比较麻烦。你们可以在触发条件上进行修改,不用插件也可以。

1.下载FingerGestures 插件 下载地址 点击打开链接


2.导入插件,创建场景 将预设Finger Gestures Initializer 拖拽到 Hierarchy 视图中


3。添加脚本,拖拽到摄像机上。创建一个方块拖拽到脚本target 属性上。

using UnityEngine;
using System.Collections;

public class ObjectControl : MonoBehaviour
{
    public Transform target;
    public float yawSensitivity = 80.0f;
    public float pitchSensitivity = 160.0f;
    public bool clampPitchAngle = true;
    public float pinchZoomSensitivity = 0.5f;//缩放速度
    public float smoothZoomSpeed = 10.0f;
    public float smoothOrbitSpeed = 20.0f;
    public float distance = 0;

    float yaw = 0;
    float pitch = 0;
    float idealYaw = 0;
    float idealPitch = 0;
    float fChangeScale = 0;
    float fChangeideal = 0;
    public Transform[] movementP;

    /// 
    /// 控制模式枚举
    /// 
    public enum ControlModel
    {
        Zoom, Rotate, Translate
    }

    public ControlModel controlModel = ControlModel.Rotate;

    //Vector3 position=new Vector3();
    public bool bArrive = false;//鼠标是否到达零件箱边界区域
    //平移方式是否根据鼠标拖动距离还是直接置为鼠标位置
    public bool ifDragMove = false;
    //平移方式为:根据鼠标拖动距离 时,评议的速度
    public float moveSpeed = 1.0f;
    //是够需要画出按钮(缩放、旋转、平移)
    public bool ifDrawBtn = true;
    //缩放方式改为:改变相机范围
    public bool zoomCamera = false;
    //zoomCamera = true ,相机的最小范围值
    public float minZoom = 0f;
    //zoomCamera = true ,相机的最大范围值
    public float maxZoom = 179f;
    //平移对象
    public Transform moveTarget;
    //平移对象的初始位置
    Vector3 moveTargetPos;
    //模型的直接父对象
    public Transform parentModel;
    Vector3 parentModelPos;

    void Start()
    {
        zoomCamera = true;
    }

    void OnEnable()
    {

        FingerGestures.OnDragMove += FingerGestures_OnDragMove;
        FingerGestures.OnPinchMove += FingerGestures_OnPinchMove;
        FingerGestures.OnFingerDragEnd += OnFingerDragEnd;

    }

    void OnDisable()
    {
        FingerGestures.OnDragMove -= FingerGestures_OnDragMove;
        FingerGestures.OnPinchMove -= FingerGestures_OnPinchMove;
        FingerGestures.OnFingerDragEnd -= OnFingerDragEnd;
    }

    public void setRotation()
    {
        Vector3 angles = target.eulerAngles;
        yaw = idealYaw = angles.y;
        pitch = idealPitch = angles.x;
    }

    void FingerGestures_OnDragMove(Vector2 fingerPos, Vector2 delta)
    {
        onDrag = true;
        try
        {
            Screen.showCursor = false;
        }
        catch
        {
            Screen.showCursor = false;
        }
        if (controlModel == ControlModel.Rotate && !bArrive)
        {
            idealYaw -= delta.x * yawSensitivity * 0.02f;
            idealPitch += delta.y * pitchSensitivity * 0.02f;
            len = delta;
            if (target) target.transform.Rotate(new Vector3(delta.y, -delta.x, 0), Space.World);
        }
        if (controlModel == ControlModel.Translate && !bArrive)
        {
            if (ifDragMove)
            {
                if (moveTarget == null)
                {
                    target.position = new Vector3(target.position.x + delta.x * moveSpeed, target.position.y + delta.y * moveSpeed, target.localPosition.z);// GetWorldPos( fingerPos );
                }
                else
                {
                    moveTarget.position = new Vector3(moveTarget.position.x + delta.x * moveSpeed, moveTarget.position.y + delta.y * moveSpeed, moveTarget.localPosition.z);
                }
            }
            else
            {
                if (moveTarget == null)
                {
                    target.position = GetWorldPos(fingerPos);
                }
                else
                {
                    moveTarget.position = GetWorldPos(fingerPos);
                }
            }
        }

    }

    void FingerGestures_OnPinchMove(Vector2 fingerPos1, Vector2 fingerPos2, float delta)
    {

        if (controlModel == ControlModel.Zoom && !bArrive)
        {
            if (zoomCamera)
            {
                float fZoom = camera.fieldOfView - delta * pinchZoomSensitivity * 800 * Time.deltaTime;
                fZoom = Mathf.Min(fZoom, maxZoom);
                fZoom = Mathf.Max(fZoom, minZoom);
                camera.fieldOfView = Mathf.Lerp(camera.fieldOfView, fZoom, Time.deltaTime * smoothZoomSpeed);
                // camera.transform.position = target.position - fZoom * camera.transform.forward;
            }
            else
            {

                fChangeScale = target.localScale.x + delta * pinchZoomSensitivity;

                Vector3 vc = new Vector3(fChangeScale, fChangeScale, fChangeScale);
            }
        }
    }
    //滑动结束
    void OnFingerDragEnd(int fingerIndex, Vector2 fingerPos)
    {
        Screen.showCursor = true;

        onDrag = false;
    }


    //把Unity屏幕坐标换算成3D坐标
    Vector3 GetWorldPos(Vector2 screenPos)
    {
        // Camera mainCamera = Camera.main;
        Camera mainCamera = GameObject.FindGameObjectWithTag("MainCamera").GetComponent();
        if (!mainCamera.enabled)
        {
            mainCamera = mainCamera.transform.parent.FindChild("CameraOne").GetComponent();
        }
        return mainCamera.ScreenToWorldPoint(new Vector3(screenPos.x, screenPos.y, Mathf.Abs(target.position.z - mainCamera.transform.position.z)));
    }

    void Apply()
    {
        if (controlModel == ControlModel.Rotate && !bArrive)
        {
            yaw = Mathf.Lerp(yaw, idealYaw, Time.deltaTime * smoothOrbitSpeed);
            pitch = Mathf.Lerp(pitch, idealPitch, Time.deltaTime * smoothOrbitSpeed);
        }
    }
    bool onDrag;
    Vector2 len;

    void LateUpdate()
    {
        if (Input.GetMouseButtonUp(1) || Input.GetMouseButtonUp(0))
        {
            Screen.showCursor = true;
        }
        Apply();
    }

    static float ClampAngle(float angle, float min, float max)
    {
        if (angle < -360)
            angle += 360;

        if (angle > 360)
            angle -= 360;

        return Mathf.Clamp(angle, min, max);
    }

    void Update()
    {
        ///自由切换

        if (Input.GetMouseButtonDown(0))
        {

            controlModel = ControlModel.Translate;
        }

        if (Input.GetMouseButtonDown(1))
        {

            controlModel = ControlModel.Rotate;
        }

        if (Input.GetAxis("Mouse ScrollWheel") != 0)
        {
            controlModel = ControlModel.Zoom;
        }

    }

    /// 
    /// 复位
    /// 
    public void ResetValue()
    {
        if (moveTarget != null)
        {
            moveTarget.localPosition = moveTargetPos;
        }
        if (parentModel != null)
        {
            parentModel.localPosition = parentModelPos;
        }
        yaw = 0;
        pitch = 0;
        idealYaw = 0;
        idealPitch = 0;
    }

}


你可能感兴趣的:(Unity3d)