OnMouseDown not triggering

OnMouseDown() isn’t working for me.
Here’s some info related to things I’ve read could cause this problem.

  • I have two cameras (one renders to a
    target texture, the other acts as the
    main camera)
  • Both are orthographic.
  • Their clipping planes are not negative
  • Their z is -100
  • I have things I’m trying to click
  • They have BoxCollider2Ds.
  • They are the only things with
    colliders, so there should be
    shouldn’t be any colliders between
    them and the camera.
  • Their z is 30

Ok, are those objects with coliders children of someone? I had problems once with coliders of children of a parent with collider

Turns out my problem was because of some things I did when following Pushy Pixel’s Pixel Perfect tutorial that basically resulted in camera/screen things being slightly wonky – and by extension, the mouse. My solution was to create a custom mouse object, and then using its location henceforth. I also had to use a Box Collider instead of a Box Collider 2D.

Attach this to your mouse object. CharController is just the object I wanted to click on, and MouseEnter, MouseDrag, etc, are custom functions within that object


CharController lastChar;
CharController currentChar;
Vector3 lastPosition;  // Where the mouse position was last
const int z = 0;

void Start()
    Cursor.visible = false; // hide OS cursor
    lastPosition = Input.mousePosition;

void Update()
    Vector3 mousePos = Input.mousePosition;
    // If the mouse has moved since the last update
    if (mousePos != lastPosition)
        lastPosition = mousePos;

void MoveMouse()
    Vector3 tempPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    tempPos.z = z; // preserve z
    transform.position = tempPos;

public void CheckMouse()
    Ray ray = new Ray (transform.position, new Vector3(0, 0, GlobConsts.maxDepth)); // ray from mouse directly downwards
    RaycastHit hit;
    if (Physics.Raycast(ray, out hit))
        currentChar = hit.collider.GetComponent<CharController>();
        if (currentChar != lastChar)
        if (Input.GetMouseButton(0))
        if (Input.GetMouseButtonDown(0))
        if (Input.GetMouseButtonUp(0))

        lastChar = currentChar;

    else if(lastChar != null)
        lastChar = null;