如何用鼠标单击并拖动游戏对象?

How can i click and drag a gameobject with the mouse?

创建了新脚本

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

public class mouseDrag : MonoBehaviour
{
    float distance = 10;

        void OnMouseDrag()
        {
            Vector3 mousePosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, distance);
            Vector3 objPosition = Camera.main.ScreenToWorldPoint(mousePosition);

            transform.position = objPosition;
        }
    }

然后在启动函数的另一个脚本中,我创建了 4 个立方体并将 mouseDrag 添加到每个立方体。但是当 运行 并单击和拖动时没有任何反应。我没有收到任何错误或异常。

void Start()
    {
        lp = gameObjectToRaise.transform.localPosition;
        ls = gameObjectToRaise.transform.localScale;

        List<GameObject> cubes = new List<GameObject>();

        GameObject cube = Cube.CreatePrimitive(Cube.CubePivotPoint.UPLEFT);
        GameObject cube1 = Cube.CreatePrimitive(Cube.CubePivotPoint.UPRIGHT);
        GameObject cube2 = Cube.CreatePrimitive(Cube.CubePivotPoint.BACKUP);
        GameObject cube3 = Cube.CreatePrimitive(Cube.CubePivotPoint.UPRIGHT);

        cubes.Add(cube);
        cubes.Add(cube1);
        cubes.Add(cube2);
        cubes.Add(cube3);

        cube.GetComponentInChildren<Renderer>().material.color = Color.blue;
        cube1.GetComponentInChildren<Renderer>().material.color = Color.red;
        cube2.GetComponentInChildren<Renderer>().material.color = Color.green;
        cube3.GetComponentInChildren<Renderer>().material.color = Color.yellow;

        cube.transform.position = new Vector3(lp.x, lp.y, lp.z - 0.5f);
        cube1.transform.position = new Vector3(lp.x, lp.y, lp.z);
        cube2.transform.position = new Vector3(lp.x, lp.y, lp.z + 5);
        cube3.transform.position = new Vector3(lp.x + 5, lp.y, lp.z);

        cube1.transform.Rotate(0, 90, 0);
        cube3.transform.Rotate(0, 90, 0);

        StartCoroutine(scaleCube(cube.transform));
        StartCoroutine(scaleCube(cube1.transform));
        StartCoroutine(scaleCube(cube2.transform));
        StartCoroutine(scaleCube(cube3.transform));

        foreach (GameObject go in cubes)
        {
            go.AddComponent<mouseDrag>();
        }
    }

    IEnumerator scaleCube(Transform trans)
    {
        while (raiseAmount < raiseTotal)
        {
            raiseAmount += 1f;
            trans.localScale += new Vector3(speed * Time.deltaTime, speed * Time.deltaTime, 0);
            yield return null;
        }
    }
}

I just tried now with a single cube gameobject i added for testing it and it's working fine. But when i'm using the cubes using the CUBE class helper it's not working.

在这种情况下,mouseDrag 脚本应附加到子多维数据集(而不是 CubeHolder 对象)。之后,您应该移动多维数据集的父级 "CubeHolder".

如果您移动子立方体,您将打破枢轴点。

简单改变

transform.position = objPosition;

transform.parent.position = objPosition;

然后将 mouseDrag 脚本附加到子多维数据集而不是 "CubeHolder".

Maybe the problem is that it's attaching the script to the parentObject "CubeHolder" and not to the created cubes ?

是的。 OnMouseDrag 仅在附加到具有 Collider 的对象且子多维数据集是唯一具有 Collider 的对象时才会被调用。父对象仅用作枢轴点特征。

注意:

你不应该为此使用 OnMouseDrag。您应该将 cube/Object 与新的 UI 事件一起拖动。 答案中列出了很多回调函数。

下面的脚本是您应该使用的。将 CubeDrag 脚本附加到子多维数据集,然后将显示 transform.position 的所有内容更改为 transform.parent.position.

using UnityEngine;
using UnityEngine.EventSystems;
public class CubeDrag: MonoBehaviour, IPointerDownHandler, IDragHandler, IEndDragHandler
{
    Camera mainCamera;
    float zAxis = 0;
    Vector3 clickOffset = Vector3.zero;

    // Use this for initialization
    void Start()
    {
        addEventSystem();
        zAxis = transform.position.z;
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        Vector3 tempPos = eventData.position;
        tempPos.z = Vector3.Distance(transform.position, Camera.main.transform.position);
        clickOffset = transform.position - mainCamera.ScreenToWorldPoint(tempPos);
        Debug.Log("Mouse Down");
    }

    public void OnDrag(PointerEventData eventData)
    {
        Vector3 tempPos = eventData.position;
        tempPos.z = Vector3.Distance(transform.position, Camera.main.transform.position);
        Vector3 tempVec = mainCamera.ScreenToWorldPoint(tempPos) + clickOffset;
        tempVec.z = zAxis;

        transform.position = tempVec;
        Debug.Log("Dragging Cube");
    }

    public void OnEndDrag(PointerEventData eventData)
    {

    }

    void addEventSystem()
    {
        mainCamera = Camera.main;
        if (mainCamera.GetComponent<PhysicsRaycaster>() == null)
            mainCamera.gameObject.AddComponent<PhysicsRaycaster>();

        EventSystem eveSys = GameObject.FindObjectOfType(typeof(EventSystem)) as EventSystem;
        if (eveSys == null)
        {
            GameObject tempObj = new GameObject("EventSystem");
            eveSys = tempObj.AddComponent<EventSystem>();
        }

        StandaloneInputModule stdIM = GameObject.FindObjectOfType(typeof(StandaloneInputModule)) as StandaloneInputModule;
        if (stdIM == null)
            stdIM = eveSys.gameObject.AddComponent<StandaloneInputModule>();
    }
}