- Home /
How to make Camera position Independent of its Rotation?
Hello, in this game, the camera is attached to the player as its child, the camera angle is fixed, even when the player rotates, but the camera position keeps changing every time the player rotates, as you can see below, the camera angle is fixed to one single direction, but when ever parent changes its rotation, it affects the child position, i dont want want my parents, rotation to affect my child Camera's position..
//Camera Rotation Script
void Awake () {
//pos = transform.localPosition;
rotation = transform.rotation;
}
void LateUpdate () {
transform.rotation = rotation;
//transform.localPosition = pos;
}
//Camera Position Script
void Update () {
if(this.transform.rotation.y == 0f)
this.transform.localPosition = new Vector3(0f,13f,-4.5f);
else if(this.transform.rotation.y == 180f)
this.transform.localPosition = new Vector3(0f,13f,4.5f);
else if(this.transform.rotation.y == 90f)
this.transform.localPosition = new Vector3(-4.5f,13f,0f);
else if(this.transform.rotation.y == 270f)
this.transform.localPosition = new Vector3(4.5f,13f,0f);
}
Answer by troien · Nov 08, 2014 at 08:41 AM
My solution would be to just don't mak the camera a child in the first place, since you only want it to follow the position, you could do that by adding a script like this to your camera:
using UnityEngine;
using System.Collections;
public class RotatingExample1 : MonoBehaviour
{
public Transform targetToFollow;
public Vector3 targetOffset;
private void LateUpdate()
{
transform.position = targetToFollow.position + targetOffset;
}
}
If you still insist on keeping it a child however, then this code should help
using UnityEngine;
using System.Collections;
public class RotatingExample2 : MonoBehaviour
{
public Vector3 offsetWorldPosition;
private Quaternion fixedRotation;
private void Awake()
{
fixedRotation = transform.rotation;
//offsetWorldPosition = transform.localPosition; // Add this if you don't want to set the value in the inspector
}
private void LateUpdate()
{
transform.rotation = fixedRotation;
transform.localPosition = transform.parent.worldToLocalMatrix.MultiplyVector(offsetWorldPosition);
}
}
second one doesnt work..position is still kind of screwed up, through help of a redditor, and ur first script, i kind a made, this script. i forgot to mention before, this is a multiplayer game.
void Awake()
{
target = transform.parent;
}
void Start(){
transform.parent = null;
}
private void LateUpdate()
{
transform.position = target.position+offset ;
}
but, i get a problem.. Player 1 spawns, his camera is now no more a child and goes to hierarchy.(player 1 still uses his camera) Player 2 joins, and even he unchilds his camera . player 1 starts using player 2's camera. player 2 starts using player 1's camera.
In what way does the second script not work? Because when I use this in my own test scene, I get exactly the same result as when I use the first script.
(this is my setup in the hierarchy, using cubes ins$$anonymous$$d of camera's since I'm only altering the transform which is the same on every gameobject regardless of components attatched)
Cube1 (This is the Cube we want to follow)
Cube2 (This cube is a child of Cube1 and has the RotatingExample2 component attatched, offset set to [0,2,-2]
Cube3 (This cube is not a child of anything and has the RotatingExample1 script attatched to it, offset set to [0,2,2] and target set to Cube1)
With that setup Whenever I move Cube1, the other Cubes follow, but don't rotate and when I rotate Cube1 the other cubes stay (Which is what I believe the thing you try to achieve). Do you have any other scripts that is moving/rotating the same gameobject?