Is there a RotateAround functionality for Rigidbody 2D's?

Hello,


I’ve been trying to make a top-down 2d game which involves the weapon swinging around the player based on the momentum of the mouse x input, I was previously transforming the weapon to pivot around the player based on the RotateAround function but it wasn’t reacting to incoming projectile physics. I have since switched transforming to rigidbody.MoveRotation() but I cannot work out how to rotate around a specific pivot when using this form of rotation.


Here is the code in question, currently it does not rotate around the player but does rotate in place with mouse x input:

using UnityEngine;
using System.Collections;
 
public class OrbitPlayer : MonoBehaviour {
 
    public Transform target;
    private Rigidbody2D myRigidbody;
    public float orbitDistance = 10.0f;
    private Vector3 relativeDistance = Vector3.zero;
    private float mouseXspeed;
    private Vector3 targetPosition;

    // Use this for initialization
    void Start () {
        if(target != null) 
        {
            relativeDistance = (transform.position - target.position).normalized * orbitDistance;
        }
        myRigidbody = GetComponent<Rigidbody2D>();
    }

    void Orbit(float mouseXspeed, Vector3 targetPosition)
    {
        if(target != null)
        {
            Debug.Log(targetPosition);
            // Moves with the target
            myRigidbody.MovePosition(targetPosition);
            // Rotates based on Mouse X input
            myRigidbody.MoveRotation(mouseXspeed);
        }
    }
    
    void Update () {
        
        targetPosition = target.position + relativeDistance;

        // Gets the movement of the mouse in the x axis
        float mouseXaxis = Input.GetAxis("Mouse X");
        // Keeps knowledge of the axis and adds accordingly to movement
        mouseXspeed += mouseXaxis;
    
    }
    
    void FixedUpdate() {
        Orbit(mouseXspeed, targetPosition);
    }
}

Is there a way to use RotateAround for a rigidbody or is there an equivalent?

I’ve instead managed to use the parametric equation to work out x and y coordinates to make the weapon move to specific points in a circle around the player with the radius of 1.


using UnityEngine;
using System.Collections;
 
public class OrbitPlayer : MonoBehaviour {
 
    public Transform target;
    private Rigidbody2D myRigidbody;
    private Vector3 relativeDistance = Vector3.zero;
    private float mouseXspeed;
    private float mouseXaxis;
    private Vector3 targetPosition;
    private Vector3 weaponPos;

    // Use this for initialization
    void Start () {
        myRigidbody = GetComponent<Rigidbody2D>();
        mouseXspeed = 0;
    }
 
    void Orbit(float mouseXspeed, Vector3 weaponPos)
    {
        if(target != null)
        {
            targetPosition = target.position;
            // Moves with the target
            myRigidbody.MovePosition(targetPosition + weaponPos);
            // Rotates based on Mouse X input
            myRigidbody.MoveRotation(mouseXspeed);
            
        }
    }

    void Update () {
        
        // Gets the movement of the mouse in the x axis
        mouseXaxis = Input.GetAxis("Mouse X");
        // Keeps knowledge of the axis and adds accordingly to movement
        
        mouseXspeed += mouseXaxis;

        weaponPos.x = Mathf.Cos(mouseXspeed);
        weaponPos.y = Mathf.Sin(mouseXspeed);
        weaponPos.z = 0;

        Debug.Log("mouse X Speed: " + mouseXspeed);

        print("mouseXspeed: "+ mouseXspeed+ " weaponPos: " + weaponPos);
    
    }
     
    void FixedUpdate() {
        Orbit(mouseXspeed*(180/Mathf.PI), weaponPos);
    }
}

This does initialize the weapon position to be at rotation 0 with the coordinates directly 1 unit right of the target (player) as cos(0)=1