unity 鼠标拖动物体

作者: 齊葩 | 来源:发表于2017-12-08 16:24 被阅读91次

这个直接加到被拖动的对象上即可使用

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 添加这个组件后,该物体就可以被拖动
/// 也可以把他加到一个背景上,手动指定被拖动的物体
/// </summary>
public class TouchMove : MonoBehaviour {

    public int layerId = 8; //射线碰撞层编号
    int layerMask = 0; //射线碰撞层
    public int rayDraction = 30; //射线长度
    public Transform target = null; //移动目标
    public Camera eyeCamera = null; // 视图相机

    Vector3? beginP = null;
    Vector3 targetBeginP;

    void Start()
    {
        if (target == null) {
            target = transform;
        }
        if (eyeCamera == null) {
            eyeCamera = Camera.main;
        }
        layerMask = (1 << layerId);
    }

    // Update is called once per frame
    void FixedUpdate()
    {
        if (Input.touchCount == 1)
        {
            UpdateTargetPositon();
        }

    }
    //移动对象
    void UpdateTargetPositon()
    {
        RaycastHit hit;
        if (RayDetection(out hit))
        {
            if (beginP == null || Input.GetTouch(0).phase == TouchPhase.Began)
            {
                MoveBegin(hit.point);
            }
            else if (Input.GetTouch(0).phase == TouchPhase.Moved)
            {
                Moveing(hit.point);
            }
            else if (Input.GetTouch(0).phase == TouchPhase.Canceled || Input.GetTouch(0).phase == TouchPhase.Ended)
            {
                MoveEnd();
            }
        }
    }

    public void OnGUI()
    {
#if !UNITY_EDITOR && (UNITY_IOS || UNITY_ANDROID)
            return;
#endif
        if (Event.current.type == EventType.MouseDown)
        {
            RaycastHit hit;
            if (RayDetection(out hit))
            {
                MoveBegin(hit.point);
            }
        }
        else if (Event.current.type == EventType.MouseDrag)
        {
            RaycastHit hit;
            if (RayDetection(out hit))
            {
                if (beginP == null)
                {
                    MoveBegin(hit.point);
                }
                Moveing(hit.point);
            }

        }
        else if(Event.current.type == EventType.mouseUp)
        {
            MoveEnd();
        }
        else if (Event.current.type == EventType.MouseLeaveWindow)
        {
            MoveEnd();
        }
    }

    ///检测是否点击到了要移动的物体,并返回射线碰撞与是否发生碰撞
    bool RayDetection(out RaycastHit hit)
    {
        Ray ray = eyeCamera.ScreenPointToRay(Input.mousePosition);
        return Physics.Raycast(ray, out hit, 30, layerMask);
    }
    ///初始化位置,为接下来的move做准备
    void MoveBegin(Vector3 point) {
        beginP = point;
        
        targetBeginP = target.transform.position;
    }
    ///更新目标位置
    void Moveing(Vector3 point)
    {
        Vector3 discance = point - beginP.Value;
        target.transform.position = targetBeginP + discance;
    }
    ///Move结束,清除数据
    void MoveEnd()
    {
        beginP = null;
    }
}

基于这套理论的unity 开源框架(我在维护,有线上产品)

仓库地址 https://gitee.com/qipaworld/QPUnityFramework

Demo仓库 https://gitee.com/qipaworld/QPUnityFrameWorkTest


点击这里可以看到作者的其他文章


相关文章

  • Unity物体跟随鼠标拖动

  • unity 鼠标拖动物体

    这个直接加到被拖动的对象上即可使用 基于这套理论的unity 开源框架(我在维护,有线上产品) 仓库地址 http...

  • unity 鼠标拖动

    using UnityEngine; using System.Collections; public class...

  • html5

    1、拖拽事件 (1)概念具有拖动物体、投放区两个注意点。 (2)拖动物体事件(关注鼠标动作) ondragstar...

  • 鼠标拖动物体

    using System.Collections; using System.Collections.Generi...

  • 鼠标拖动物体(物体旋转)

    、、、using System.Collections;using System.Collections.Gene...

  • Unity拖动旋转物体

  • 在unity中实现鼠标拖动物体移动

    主要步骤 得到物体屏幕坐标的Z值 物体由世界坐标转为屏幕坐标 得到鼠标的世界坐标(Z值是物体的屏幕坐标) 鼠标三维...

  • 鼠标拖动物体移动

    简单来说,项目需要用鼠标点击物体然后拖动物体移动。一开始我想到的方法是:把鼠标的屏幕坐标转换为世界坐标,在让物体跟...

  • U3d 射线Ray

    现在想要实现这样一个需求:当鼠标放到物体上的时候,让物体的大小发生改变,并且不停的旋转,当鼠标点击进行拖动的时候,...

网友评论

    本文标题:unity 鼠标拖动物体

    本文链接:https://www.haomeiwen.com/subject/ouneixtx.html