Unity-用鼠标右键拖动?

时间:2020-10-22 11:45:06

标签: unity3d

我正在Unity 2019.4.12f1中创建一个版本,需要使用鼠标右键拖动对象。 到目前为止,我的C#技能非常有限,但是我尝试了。

此脚本是我尝试通过按住鼠标右键并拖动游戏中的内容来旋转游戏对象的尝试。

但这是错误的。 有人可以帮我改正吗?’


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class mouseM : MonoBehaviour
{
     bool dragging = false;

     void Start()
    {
        if (Input.GetMouseButtonDown(1))
        {
            dragging = true;
        }
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(1))
        {
            yourOnMouseDownFunction();
            dragging = true;
        }
        if (Input.GetMouseButtonUp(1))
        {
            yourOnMouseUpFunction();
            dragging = false;
        }

        if (dragging)
        {
            yourOnMouseDragFunction();
        }
    }
}

3 个答案:

答案 0 :(得分:1)

我了解到您需要在3d世界中拖动对象,所以这是我的代码,只需创建新脚本并附加到要拖动它的对象上

您需要拖动的对象应该具有对撞机

using UnityEngine;
public class DragableObject : MonoBehaviour
{
    private Vector3 mOffset;
    private float mZCoord;

    private void OnMouseDrag()
    {
        transform.position = GetMouseWorldPos() + mOffset;
    }

    private void OnMouseDown()
    {
        mZCoord = Camera.main.WorldToScreenPoint(gameObject.transform.position).z;
        mOffset = transform.position - GetMouseWorldPos();
    }

    private Vector3 GetMouseWorldPos()
    {
        Vector3 mosePoint = Input.mousePosition;
        mosePoint.z = mZCoord;
        var result = Camera.main.ScreenToWorldPoint(mosePoint);
        return result;
    }
}

您可以通过将其添加到球体或立方体中来进行尝试,如果您使用自定义形状,则应确保对撞机的尺寸合适或具有网格物体 Demo

编辑

using UnityEngine;
public class DragableObject : MonoBehaviour
{
    private bool isMouseDragging;
    private Vector3 screenPosition;
    private Vector3 offset;
    private GameObject target;

    GameObject ReturnClickedObject(out RaycastHit hit)
    {
        GameObject targetObject = null;
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        if (Physics.Raycast(ray.origin, ray.direction * 10, out hit))
        {
            targetObject = hit.collider.gameObject;
        }
        return targetObject;
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(1))
        {
            RaycastHit hitInfo;
            target = ReturnClickedObject(out hitInfo);
            if (target != null)
            {
                    isMouseDragging = true;
                    Debug.Log("our target position :" + target.transform.position);
                    //Here we Convert world position to screen position.
                    screenPosition = Camera.main.WorldToScreenPoint(target.transform.position);
                offset = target.transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPosition.z));
            }
        }

        if (Input.GetMouseButtonUp(1))
        {
            isMouseDragging = false;
        }

        if (isMouseDragging)
        {
            //tracking mouse position.
            Vector3 currentScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPosition.z);

            //convert screen position to world position with offset changes.
            Vector3 currentPosition = Camera.main.ScreenToWorldPoint(currentScreenSpace) + offset;

            //It will update target gameobject's current postion.
            target.transform.position = currentPosition;
        }

    }
}

答案 1 :(得分:0)

您可以尝试使用Input.GetMouseButton方法,该方法应返回一个值,具体取决于是否按住该按钮。

答案 2 :(得分:0)

如果将来有人需要,这个也可以。 这是为了旋转。 抱歉,我不知道为什么它不能让我以代码形式发布,所以我发布了一张图片。

enter image description here