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

时间:2017-04-01 21:25:29

标签: c# unity3d unity5

创建新脚本

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;
        }
    }

然后在Start函数的另一个脚本中创建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;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

  

我刚刚尝试使用单个立方体游戏对象添加进行测试   它工作正常。但是当我使用CUBE使用立方体时   班助手它没有工作。

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

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

只需更改

transform.position = objPosition;

transform.parent.position = objPosition;

然后将mouseDrag脚本附加到子多维数据集而不是&#34; CubeHolder&#34;

  

也许问题在于它将脚本附加到了   parentObject&#34; CubeHolder&#34;而不是创建的立方体?

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

注意

您不应该使用OnMouseDrag。您应该使用新的UI事件拖动cube / Object。 this答案中列出了许多回调函数。

以下脚本是您应该使用的。将CubeDrag sctipt附加到子多维数据集,然后将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>();
    }
}