0
\$\begingroup\$

I'm using Unity2D.

I have a very basic 2D space with a platform, a ball and 2D physics.

Physics is being applied and ball sits on top of the platform.

However, it will not spin.

Below is the script attached to the ball:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class Circle : MonoBehaviour
{
    private Vector3 screenPoint;
    private Vector3 offset;
    private float speed = 10f;
    public Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical = Input.GetAxis("Vertical");

        Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);

        rb.maxAngularVelocity = 999;
        rb.AddTorque(movement * speed);
    }

    void OnMouseDown()
    {
        offset = gameObject.transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z));
    }

    void OnMouseDrag()
    {
        Vector3 curScreenPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z);
        Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenPoint) + offset;
        transform.position = curPosition;
    }
}

The script is attached to the ball, I know this because I'm able to drag it (see OnMouseDown).

I have also tried with other objects such as a rounded-corner square, but I just can't get any spin or torque to be applied.

Below is a screenshot of the inspector on the element. Circle.cs (the script) is the above pasted script.

enter image description here

Any help appreciated.

\$\endgroup\$
8
  • \$\begingroup\$ You say you're using 2D physics, but it looks like you're using the 3D version of the Rigidbody, instead of Rigidbody2D. Is this deliberate? \$\endgroup\$
    – DMGregory
    Commented Aug 23, 2018 at 12:25
  • \$\begingroup\$ It's not deliberate no, but that explains a lot. I have added Rigidbody2D in Unity UI, but am I referencing a 3D one in the code? I can't see any difference in the docs, but have a feeling I'm looking in the wrong place? \$\endgroup\$
    – mikemike
    Commented Aug 23, 2018 at 16:07
  • \$\begingroup\$ They're two different components, Rigidbody, and Rigidbody2D. They expose similar capabilities, but work through two different physics systems (PhysX & Box2D), so you can't substitute one for the other. Can you show us in the editor view how you've set up your object? \$\endgroup\$
    – DMGregory
    Commented Aug 23, 2018 at 16:13
  • \$\begingroup\$ Sure @DMGregory I have just added it to my question. Looking at docs, although they're different, the class names within C# are the same. Hoping I'm wrong here though, as that would be the likely cause of the issue. I am using Rigidbody2D though \$\endgroup\$
    – mikemike
    Commented Aug 23, 2018 at 16:59
  • \$\begingroup\$ Totally see the issue now. It is a different class name. I need to reference Rigidbody2D in GetComponent. Thanks \$\endgroup\$
    – mikemike
    Commented Aug 23, 2018 at 17:04

1 Answer 1

0
\$\begingroup\$

I need to reference Rigidbody2D instead of Rigidbody.

Code:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class Circle : MonoBehaviour
{
    private Vector3 screenPoint;
    private Vector3 offset;
    private float speed = 10f;
    public Rigidbody2D rb;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    void FixedUpdate()
    {
        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical = Input.GetAxis("Vertical");

        Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);

        rb.AddTorque(speed);
    }

    void OnMouseDown()
    {
        offset = gameObject.transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z));
    }

    void OnMouseDrag()
    {
        Vector3 curScreenPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z);
        Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenPoint) + offset;
        transform.position = curPosition;
    }
}
\$\endgroup\$

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .