M
M
Michaellux2019-11-20 08:13:07
Mouse
Michaellux, 2019-11-20 08:13:07

Why doesn't the OnMouseDown() event on the Rigidbody collider fire?

There is a dynamic Rigidbody that can be launched with the mouse. At some point, the Rigidbody stops responding to the mouse for some unknown reason. The speed of the Rigidbody is 0.
Two Spring joints are attached to the Rigidbody.
5dd4ca0bade86525012590.png
5dd4ca3c9f7c8570255954.png
5dd4ca49701af260494117.png
The only way to wake up the body is to disable and re-enable Spring Joints when debugging.

public class Ball : MonoBehaviour
{

private Rigidbody2D rigidbodyBall;
public SpringJoint2D[] springJoints;

private GameObject speed;

public static Ball instance = null;

#region Life Cycle

void Awake()
{
    speed = GameObject.Find("Velocity");
    springJoints = GetComponents<SpringJoint2D>();
    rigidbodyBall = GetComponent<Rigidbody2D>();
    gameManager = GameObject.Find("GameManager").GetComponent<GameManager>();
}

private bool clickedOn = false;
void Update()
{
    if (clickedOn)
    {
        Dragging();
        UIManager.instance.pauseButton.SetActive(false);
        UIManager.instance.totalScoreUI.gameObject.SetActive(false);
    }
    else
    {
        UIManager.instance.pauseButton.SetActive(true);
        UIManager.instance.totalScoreUI.gameObject.SetActive(true);
    }
}

#endregion

#region Launcher

#region Mouse

void OnMouseDown()
{
   SpringJointDeactivate();
   clickedOn = true;
}

void OnMouseUp()
{
    SpringJointActivate();
    clickedOn = false;
    SetKinematicState(false);
    Invoke("SpringJointDeactivate", 0.1f);
}

void Dragging()
{
    Vector3 mouseWorldPointStart = transform.position;
    Vector3 mouseWorldPoint = Camera.main.ScreenToWorldPoint(Input.mousePosition);

    mouseWorldPoint.z = 0f;

    if (Boundary.ballInBoundary)
    {
        transform.position = mouseWorldPoint;

        float diffX = mouseWorldPoint.x - mouseWorldPointStart.x;
        //TODO
        for (int i = 0; i < springJoints.Length; i++)
        {
            springJoints[i].connectedAnchor = new Vector2(springJoints[i].connectedAnchor.x + diffX, springJoints[i].connectedAnchor.y);
        }
    }
    else
    {
      Debug.Log("Another situation!");
      Debug.Log(Boundary.ballInBoundary);
    }

}


#endregion

public void SpringJointActivate()
{
    foreach (SpringJoint2D joint in springJoints)
    {
        joint.enabled = true;
    }
}
public void SpringJointDeactivate()
{
    foreach (SpringJoint2D joint in springJoints)
    {
        joint.enabled = false;
    }
}
public Vector3[] GetSpringJointsConnectedAnchorCoord()
{
    Vector3[] springJointsCoord = new[] { Vector3.zero, Vector3.zero };

    for (int i = 0; i < springJoints.Length; i++)
    {
        springJointsCoord[i] = springJoints[i].connectedAnchor;
    }

    return springJointsCoord;
}

#endregion

public void SetKinematicState(bool kinematicState)
{
    rigidbodyBall.isKinematic = kinematicState;
}

What is the reason for this behaviour? Is there any way to fix this situation?

Answer the question

In order to leave comments, you need to log in

1 answer(s)
M
Michaellux, 2019-11-20
@Michaellux

Replaced OnMouseDown() with Input.GetMouseButtonDown(0) and it worked.

void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        SpringJointDeactivate();
        clickedOn = true;
    }

    if (Input.GetMouseButtonUp(0))
    {
        SpringJointActivate();
        clickedOn = false;
        SetKinematicState(false);
        Invoke("SpringJointDeactivate", 0.1f);
    }
 }

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question