- Home /
Camera transition : from offset to other offset
Hi,
I have a camera system which allows to change offset from one value to another wether the player is looking towards left or towards right.
I want to make a smooth transition between those two offset values while switching from one side to the other, but I can't manage to make it.
Can anyone look into this code and help me?
using UnityEngine;
using System.Collections;
public class CameraManager : MonoBehaviour
{
private Transform followTarget;
private Vector3 followOffset;
private Vector3 followOffsetLeft;
private Vector3 followOffsetRight;
private Transform lookAtTarget;
private Vector3 lookAtOffset;
private Quaternion faceLeft;
private Quaternion faceRight;
private Transform playerCharacter;
private Transform currentPosition;
private float step;
private float speedTransition;
private Vector3 test;
// Use this for initialization
void Start()
{
followTarget = GameObject.Find("Player Character").GetComponent<Transform>();
lookAtTarget = GameObject.Find("Camera Look At").GetComponent<Transform>();
lookAtOffset = Vector3.zero;
playerCharacter = GameObject.Find("Player Character").GetComponent<Transform>();
faceRight = new Quaternion(0.0f, 1.0f, 0.0f, 0.0f);
faceLeft = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f);
currentPosition = lookAtTarget;
step = 0.0f;
speedTransition = 1.0f;
}
// Update is called once per frame
void Update()
{
step += Time.deltaTime * speedTransition;
followOffsetLeft = new Vector3(-4, 3, -16);
followOffsetRight = new Vector3(4, 3, -16);
if (playerCharacter.transform.rotation == faceLeft)
{
followOffset = Vector3.Lerp(followOffsetRight, followOffsetLeft, step);
}
if (playerCharacter.transform.rotation == faceRight)
{
followOffset = Vector3.Lerp(followOffsetLeft, followOffsetRight, step);
}
transform.position = followTarget.position + followOffset;
transform.LookAt(lookAtTarget.position + lookAtOffset);
}
}
Answer by robertbu · Feb 14, 2014 at 05:31 PM
If you want an eased movement, you can do:
if (playerCharacter.transform.rotation == faceLeft)
{
followOffset = Vector3.Lerp(followOffset, followOffsetLeft, step);
}
if (playerCharacter.transform.rotation == faceRight)
{
followOffset = Vector3.Lerp(followOffset, followOffsetRight, step);
}
Note that 'followOffsetLeft' and 'followOffsetRight' have been changed to just 'followOffset' in the first parameter. In addition to this change you are going to have to initialize 'followOffset' in start to either 'followOffsetLeft' or 'followOffsetRight'.
If you want a non-eased movement:
if (playerCharacter.transform.rotation == faceLeft)
{
followOffset = Vector3.MoveTowards(followOffset, followOffsetLeft, step);
}
if (playerCharacter.transform.rotation == faceRight)
{
followOffset = Vector3.MoveTowards(followOffset, followOffsetRight, step);
}
With the 'MoveTowards' change, you will have to adjust the value of 'speedTransition'.
Hi robertbu,
I managed to make the code work, thanks to you!
But I had a strange behaviour while modifying the code : the camera was shaking when the transition was done, if I kept going in the same direction.
And then... SWOOF The problem disappeared.
So here's my final code. Let me know if something is wrong, even if it's working like a charm.
using UnityEngine;
using System.Collections;
public class $$anonymous$$ainCamera : $$anonymous$$onoBehaviour
{
private Transform followTarget;
private Vector3 followOffset;
private Vector3 followOffsetLeft;
private Vector3 followOffsetRight;
private Quaternion faceLeft;
private Quaternion faceRight;
private Transform playerCharacter;
private Transform currentPosition;
private float step;
private float speedTransition;
private Vector3 test;
void Start()
{
followTarget = GameObject.Find("Player Character").GetComponent<Transform>();
followOffsetLeft = new Vector3(-2, 3, -16);
followOffsetRight = new Vector3(2, 3, -16);
playerCharacter = GameObject.Find("Player Character").GetComponent<Transform>();
faceRight = new Quaternion(0.0f, 1.0f, 0.0f, 0.0f);
faceLeft = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f);
step = 0.0f;
speedTransition = 4f;
}
void Update()
{
step += Time.deltaTime * speedTransition;
if (playerCharacter.transform.rotation == faceLeft)
{
followOffset = Vector3.Lerp(followOffset, followOffsetLeft, step);
}
if (playerCharacter.transform.rotation == faceRight)
{
followOffset = Vector3.Lerp(followOffset, followOffsetRight, step);
}
transform.position = followTarget.position + followOffset;
step = 0;
}
}