0

Created new script

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

Then in another script in the Start function i'm creating 4 cubes and add the mouseDrag to each cube. But when running and clicking and dragging nothing happen. I'm not getting any errors or exceptions.

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;
        }
    }
}
Sharon Giselle
  • 121
  • 2
  • 14
  • What is your camera mode? Perspective or Orthographic ? – Programmer Apr 01 '17 at 22:23
  • @Programmer 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. Maybe the problem is that it's attaching the script to the parentObject "CubeHolder" and not to the created cubes ? When i'm running the game i see under each of the 4 "CubeHolder" a chile cube but the script is attached to the "CubeHolder" and not to the child cube in each of the 4 "CubeHolder". – Sharon Giselle Apr 01 '17 at 22:34

1 Answers1

1

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.

In this case, the mouseDrag script should be attached to the child cube(not the CubeHolder object).After that, you should be moving the parent of the cube which is "CubeHolder".

If you ever move the child cube, you will break the pivot point.

Simply change

transform.position = objPosition;

to

transform.parent.position = objPosition;

then attach the mouseDrag script to the child cube not the "CubeHolder".

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

Yes. OnMouseDrag will only be called if attached to an Object with a Collider and the child cube is the only object with the Collider. The parent object is only there to be used as a pivot point feature.

NOTE:

You should not use OnMouseDrag for this. You should be dragging the cube/Object with the new UI event. There are many of the callback functions listed in this answer.

The script below is something you should be using. Attach the CubeDrag sctipt to the child cube then change everything that says transform.position to 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>();
    }
}
Programmer
  • 121,791
  • 22
  • 236
  • 328