Bobbing with fly cam?
Hello all! I'm trying to recreate a swimming camera motion and I'm doing it by combining a bobbing script with a fly cam script, but I'm not entirely sure how to do it. I need my camera to bob when the camera moves in the X axis only and for it to bob (to hover) when the camera doesn't move (X and Y axis). I have two separate scripts for fly cam and bobbing (I used Head Bobbing) and both of them works separately but when I turn both of them on at the same time, the fly cam stops moving in the Y axis (control Q/E doesn't work) and the camera has a weird jitter. I understand that the cause is probably because there is a segment of the scripts regarding the Y axis that clashes with each other and thus resulting in the malfunction of the Y axis movement. So now, I'm trying to incorporate my bobbing script into my fly cam script. But I do not have any background in scripting, I search up tutorials and try to make sense the most out of it but it is a little difficult as I lack the fundamentals in scripting. If anyone can kindly help me in this, it would be much appreciated!
This is the Fly cam script I got from the internet:
/*
EXTENDED FLYCAM
Desi Quintans (CowfaceGames.com), 17 August 2012.
Based on FlyThrough.js by Slin (http://wiki.unity3d.com/index.php/FlyThrough), 17 May 2011.
LICENSE
Free as in speech, and free as in beer.
FEATURES
WASD/Arrows: Movement
Q: Climb
E: Drop
Shift: Move faster
Control: Move slower
End: Toggle cursor locking to screen (you can also press Ctrl+P to toggle play mode on and off).
*/
public float cameraSensitivity = 90;
public float climbSpeed = 4;
public float normalMoveSpeed = 10;
public float slowMoveFactor = 0.25f;
public float fastMoveFactor = 3;
private float rotationX = 0.0f;
private float rotationY = 0.0f;
void Start()
{
Screen.lockCursor = true;
}
void Update()
{
rotationX += Input.GetAxis("Mouse X") * cameraSensitivity * Time.deltaTime;
rotationY += Input.GetAxis("Mouse Y") * cameraSensitivity * Time.deltaTime;
rotationY = Mathf.Clamp(rotationY, -90, 90);
transform.localRotation = Quaternion.AngleAxis(rotationX, Vector3.up);
transform.localRotation *= Quaternion.AngleAxis(rotationY, Vector3.left);
if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift))
{
transform.position += transform.forward * (normalMoveSpeed * fastMoveFactor) * Input.GetAxis("Vertical") * Time.deltaTime;
transform.position += transform.right * (normalMoveSpeed * fastMoveFactor) * Input.GetAxis("Horizontal") * Time.deltaTime;
}
else if (Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl))
{
transform.position += transform.forward * (normalMoveSpeed * slowMoveFactor) * Input.GetAxis("Vertical") * Time.deltaTime;
transform.position += transform.right * (normalMoveSpeed * slowMoveFactor) * Input.GetAxis("Horizontal") * Time.deltaTime;
}
else
{
transform.position += transform.forward * normalMoveSpeed * Input.GetAxis("Vertical") * Time.deltaTime;
transform.position += transform.right * normalMoveSpeed * Input.GetAxis("Horizontal") * Time.deltaTime;
}
if (Input.GetKey(KeyCode.Q)) { transform.position += transform.up * climbSpeed * Time.deltaTime; }
if (Input.GetKey(KeyCode.E)) { transform.position -= transform.up * climbSpeed * Time.deltaTime; }
if (Input.GetKeyDown(KeyCode.End))
{
Screen.lockCursor = (Screen.lockCursor == false) ? true : false;
}
}
}
This is the Head bobbing script I got from the internet:
private float timer = 0.0f;
public float bobbingSpeed = 0.18f;
public float bobbingAmount = 0.2f;
public float midpoint = 2.0f;
private float speedMultiplier;
void Start()
{
// Angryboy: Removed key-press requirement, now perma-locked to the Y plane
Vector3 newPosition = transform.position;//If player wants to move on X and Z axis only
newPosition.x = transform.position.x;
newPosition.z = transform.position.z;
// Angryboy: Manipulate Y plane by using Q/E keys
if (Input.GetKey(KeyCode.Q))
{
newPosition.y += -speedMultiplier;
}
if (Input.GetKey(KeyCode.E))
{
newPosition.y += speedMultiplier;
}
transform.position = newPosition;
}
void Update()
{
float waveslice = 0.0f;
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
if (Mathf.Abs(horizontal) == 0 && Mathf.Abs(vertical) == 0)
{
timer = 0.0f;
}
else
{
waveslice = Mathf.Sin(timer);
timer = timer + bobbingSpeed;
if (timer > Mathf.PI * 2)
{
timer = timer - (Mathf.PI * 2);
}
}
Vector3 v3T = transform.localPosition;
if (waveslice != 0)
{
float translateChange = waveslice * bobbingAmount;
float totalAxes = Mathf.Abs(horizontal) + Mathf.Abs(vertical);
totalAxes = Mathf.Clamp(totalAxes, 0.0f, 1.0f);
translateChange = totalAxes * translateChange;
v3T.y = midpoint + translateChange;
}
else
{
v3T.y = midpoint;
}
transform.localPosition = v3T;
}
P.S: I tried using camera shake scripts instead but it still didn't work out the way I want it to.
Your answer
Follow this Question
Related Questions
Making camera follow and rotate player 0 Answers
My Camera will not move with script. 0 Answers
Trying to turn the Tank Game Camera script into perspective projection. 1 Answer
Camera Lock on GUI 0 Answers