- Home /
rotation and gravity control
i am using a rigidbody FPS controller. i have a script that changes gravity direction, however it affects all rigidbodys! i only want it to affect the controller. I have code that is ment to rotate the controller once the gravity is changed but it dosent rotate it:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Gravity : MonoBehaviour {
public float GravityDirection = 1;
// Gravity direction 1 is the normal dirrection of gravity
void Start () {
}
void FixedUpdate ()
{
#region Find if keys down
if (Input.GetKeyDown(KeyCode.Alpha1) && GravityDirection != 1)
{
GravityDirection = 1;
}
if (Input.GetKeyDown(KeyCode.Alpha2) && GravityDirection != 2)
{
GravityDirection = 2;
}
if (Input.GetKeyDown(KeyCode.Alpha3) && GravityDirection != 3)
{
GravityDirection = 3;
}
if (Input.GetKeyDown(KeyCode.Alpha4) && GravityDirection != 4)
{
GravityDirection = 4;
}
if (Input.GetKeyDown(KeyCode.Q) && GravityDirection != 5)
{
GravityDirection = 5;
}
if (Input.GetKeyDown(KeyCode.E) && GravityDirection != 6)
{
GravityDirection = 6;
}
#endregion
#region Change gravity
if (GravityDirection == 1)
{
Physics.gravity = new Vector3(0, -9.81f, 0);
if (GravityDirection == 2)
{
transform.Rotate(180, 0, 0);
}
if (GravityDirection == 3)
{
transform.Rotate(0, 0, 0);
}
if (GravityDirection == 4)
{
transform.Rotate(0, 0, 0);
}
if (GravityDirection == 5)
{
transform.Rotate(0, 0, 0);
}
if (GravityDirection == 6)
{
transform.Rotate(0, 0, 0);
}
}
if (GravityDirection == 2)
{
Physics.gravity = new Vector3(0, 9.81f, 0);
if (GravityDirection == 1)
{
transform.Rotate(180, 0, 0);
}
if (GravityDirection == 3)
{
transform.Rotate(0, 0, 0);
}
if (GravityDirection == 4)
{
transform.Rotate(0, 0, 0);
}
if (GravityDirection == 5)
{
transform.Rotate(0, 0, 0);
}
if (GravityDirection == 6)
{
transform.Rotate(0, 0, 0);
}
}
if (GravityDirection == 3)
{
Physics.gravity = new Vector3(0, 0, -9.81f);
if (GravityDirection == 2)
{
transform.Rotate(-90, 0, 0);
}
if (GravityDirection == 1)
{
transform.Rotate(90, 0, 0);
}
if (GravityDirection == 4)
{
transform.Rotate(0, 0, 0);
}
if (GravityDirection == 5)
{
transform.Rotate(0, 0, 0);
}
if (GravityDirection == 6)
{
transform.Rotate(0, 0, 0);
}
}
if (GravityDirection == 4)
{
Physics.gravity = new Vector3(0, 0, 9.81f);
if (GravityDirection == 2)
{
transform.Rotate(90, 0, 0);
}
if (GravityDirection == 3)
{
transform.Rotate(0, 0, 0);
}
if (GravityDirection == 1)
{
transform.Rotate(-90, 0, 0);
}
if (GravityDirection == 5)
{
transform.Rotate(0, 0, 0);
}
if (GravityDirection == 6)
{
transform.Rotate(0, 0, 0);
}
}
if (GravityDirection == 5)
{
Physics.gravity = new Vector3(-9.81f, 0, 0);
if (GravityDirection == 2)
{
transform.Rotate(0, 0, 90);
}
if (GravityDirection == 3)
{
transform.Rotate(0, 0, 0);
}
if (GravityDirection == 4)
{
transform.Rotate(0, 0, 0);
}
if (GravityDirection == 1)
{
transform.Rotate(0, 0, -90);
}
if (GravityDirection == 6)
{
transform.Rotate(0, 0, 0);
}
}
if (GravityDirection == 6)
{
Physics.gravity = new Vector3(9.81f, 0, 0);
if (GravityDirection == 2)
{
transform.Rotate(0, 0, -90);
}
if (GravityDirection == 3)
{
transform.Rotate(0, 0, 0);
}
if (GravityDirection == 4)
{
transform.Rotate(0, 0, 0);
}
if (GravityDirection == 5)
{
transform.Rotate(0, 0, 0);
}
if (GravityDirection == 1)
{
transform.Rotate(0, 0, 90);
}
}
#endregion
}
}
Comment
Answer by FM-Productions · May 05, 2017 at 01:24 PM
Hi,
Setting Physics.gravity is always applied to all RigidBodies in the scene! You could, however, disable "useGravity" on your specific Rigidbody and handle the gravity function yourself, maybe by applying a constant acceleration force to your rigidbody:
Example, in the Start function get your rigidbody, store it as local class variable:
rigidbody = GetComponent<Rigidbody>();
rigidbody.useGravity = false;
In the FixedUpdate() function, apply your custom gravity:
Vector3 gravity = customGravity * customGravityVector3;
rigidbody.AddForce(gravity, ForceMode.Acceleration);