unity3D物体鼠标拖动事件

:2018-07-18    :260 次   :10364 字   

主摄影设置如下


image.png


3D设置如下


image.png


两个脚本代码如下,拖到3d物体上


using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
//拖拽物体脚本
public class DragObject : MonoBehaviour, IDragHandler
{
    public void OnDrag(PointerEventData eventData)
    {
        Vector3 screenPosition = Camera.main.WorldToScreenPoint(transform.position);
        transform.position = Camera.main.ScreenToWorldPoint(new Vector3(eventData.position.x, eventData.position.y, screenPosition.z));
    }
}



第二个脚本(可以用上面的,也可以用这个,同样用在物体上)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using Unity;
public class CubeControl : MonoBehaviour
{
    // Use this for initialization
    void Start()
    {
        StartCoroutine(OnMouseDown());
    }
    IEnumerator OnMouseDown()
    {
        //将物体由世界坐标系转换为屏幕坐标系
        Vector3 screenSpace = Camera.main.WorldToScreenPoint(transform.position);//三维物体坐标转屏幕坐标
        //完成两个步骤 1.由于鼠标的坐标系是2维,需要转换成3维的世界坐标系 
        //             2.只有3维坐标情况下才能来计算鼠标位置与物理的距离,offset即是距离
        //将鼠标屏幕坐标转为三维坐标,再算出物体位置与鼠标之间的距离
        Vector3 offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z));
        while (Input.GetMouseButton(0))
        {
            //得到现在鼠标的2维坐标系位置
            Vector3 curScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z);
            //将当前鼠标的2维位置转换成3维位置,再加上鼠标的移动量
            Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset;
            //curPosition就是物体应该的移动向量赋给transform的position属性
            transform.position = curPosition;
            yield return new WaitForFixedUpdate(); //循环执行
        }
    }
}

鼠标右键视角的转变(脚本绑定摄影机,固定一个中心点)


using UnityEngine;
using System.Collections;
public class FreeView : MonoBehaviour
{
    //观察目标
    public  Transform Target;
    //观察距离
    public float Distance = 10;
    //旋转速度
    private float SpeedX = 240;
    private float SpeedY = 200;
    //角度限制
    private float MinLimitY = -30;
    private float MaxLimitY = 60;
    //旋转角度
    private float mX = 0.0F;
    private float mY = 0.0F;
    //鼠标缩放距离最值
    private float MaxDistance = 50;
    private float MinDistance = 10;
    //鼠标缩放速率
    private float ZoomSpeed = 5F;
    //是否启用差值
    public bool isNeedDamping = true;
    //速度
    public float Damping = 10F;
    //存储角度的四元数
    private Quaternion mRotation;
    //定义鼠标按键枚举
    private enum MouseButton
    {
        //鼠标左键
        MouseButton_Left = 0,
        //鼠标右键
        MouseButton_Right = 1,
        //鼠标中键
        MouseButton_Midle = 2
    }
    //相机移动速度
    //private float MoveSpeed=5.0F;
    //屏幕坐标
    private Vector3 mScreenPoint;
    //坐标偏移
    private Vector3 mOffset;
    void Start()
    {
        Camera.main.fieldOfView = Camera.main.fieldOfView;
        //初始化旋转角度
        mX = transform.eulerAngles.x;
        mY = transform.eulerAngles.y;
    }
    void LateUpdate()
    {
        //鼠标右键旋转
        if (Target != null && Input.GetMouseButton((int)MouseButton.MouseButton_Right))
        {
            //获取鼠标输入
            mX += Input.GetAxis("Mouse X") * SpeedX * 0.02F;
            mY -= Input.GetAxis("Mouse Y") * SpeedY * 0.02F;
            //范围限制
            mY = ClampAngle(mY, MinLimitY, MaxLimitY);
            //计算旋转
            mRotation = Quaternion.Euler(mY, mX, 0);
            //根据是否插值采取不同的角度计算方式
            if (isNeedDamping)
            {
                transform.rotation = Quaternion.Lerp(transform.rotation, mRotation, Time.deltaTime * Damping);
            }
            else
            {
                transform.rotation = mRotation;
            }
        }
        //鼠标中键平移
        //不需要
        //鼠标滚轮缩放
        Distance -= Input.GetAxis("Mouse ScrollWheel") * ZoomSpeed;
        Distance = Mathf.Clamp(Distance, MinDistance, MaxDistance);
        //重新计算位置 
        //注:Target.position为监视目标的坐标,所以调整监视目标的position就可以调整刚开始时摄像机的位置
          Vector3 mPosition = mRotation * new Vector3(0.0F, 0.0F, -Distance) + Target.position;
        //设置相机的位置
        if (isNeedDamping)
        {
            transform.position = Vector3.Lerp(transform.position, mPosition, Time.deltaTime * Damping);
        }
        else
        {
            transform.position = transform.position;
        }
    }
    //角度限制
    private float ClampAngle(float angle, float min, float max)
    {
        if (angle < -360) angle += 360;
        if (angle > 360) angle -= 360;
        return Mathf.Clamp(angle, min, max);
    }
}








    暂无评论,快来抢沙发吧!
×