- Home /
Question by
Ochreous · Oct 31, 2014 at 06:31 AM ·
c#rigidbodyrotatearound
C# RotateAround for 2DRigidBodies
I have a script that makes gameobjects move towards and rotate around another scripted gameobject. I would like to be able to use the gameobject's 2Drigidbody for rotating. Is there a RotateAround function for 2DRigidbodies? I was also noticing that while using RotateAround the gameobjects wouldn't move towards the scripted gameobject. How do I get the gameobjects to rotate around and move towards the scripted gameobject?
using UnityEngine;
using System.Collections;
public class MoveTowardsAndRotate: MonoBehaviour {
public float fDistance = 1;
public float fSpeed = 2;
public float sensitivity = 3F;
public GameObject gameObjectToMove;
public Collider2D[] cols;
void LateUpdate () {
cols = Physics2D.OverlapCircleAll(transform.position, 5f);
for(int i = 0; i < cols.Length; i++){
cols[i].gameObject.rigidbody2D.MovePosition(Vector3.Lerp(cols[i].gameObject.transform.position, transform.position, Time.smoothDeltaTime/sensitivity));
cols[i].transform.RotateAround(transform.position, Vector3.forward, - fSpeed / fDistance);
}
}
}
Comment
Answer by robertbu · Nov 01, 2014 at 03:56 AM
A RotateAround() will cause a change in position as well as a change in direction. So here is a literal translation of what you are asking for (untested):
for(int i = 0; i < cols.Length; i++){
Vector3 pos = Vector3.Lerp(cols[i].gameObject.transform.position, transform.position, Time.smoothDeltaTime/sensitivity);
Vector3 v = pos - transform.position;
float angle = -fSpeed / fDistance;
v = Quaternion.AngleAxis (angle, Vector3.forward) * v;
pos = transform.position + v;
Rigidbody2D r = cols[i].gameObject.rigidbody2D;
r.MovePosition(pos);
r.MoveRotation(r.rotation + angle);
}
It can be written in a more compact (and less readable) form, but I left all the steps in.