@Michaellux

Почему событие OnMouseDown() на коллайдере Rigidbody не срабатывает?

Есть dynamic Rigidbody, которое может быть запущено с помощью мыши. В какой-то момент Rigidbody по неизвестной причине перестаёт реагировать на мышь. Скорость Rigidbody при этом равна 0.

К Rigidbody прикреплены два Spring joints.

5dd4ca0bade86525012590.png
5dd4ca3c9f7c8570255954.png
5dd4ca49701af260494117.png

Единственный способ как можно пробудить тело это при отладке по-очереди отключить и снова включить Spring Jointы.

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


В чём причина такого поведения? Можно ли как-нибудь исправить эту ситуацию?
  • Вопрос задан
  • 403 просмотра
Пригласить эксперта
Ответы на вопрос 1
@Michaellux Автор вопроса
Заменил OnMouseDown() на Input.GetMouseButtonDown(0) и всё заработало.

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

    if (Input.GetMouseButtonUp(0))
    {
        SpringJointActivate();
        clickedOn = false;
        SetKinematicState(false);
        Invoke("SpringJointDeactivate", 0.1f);
    }
 }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы