Free Flying Camera with Collider (FlyCam Extended)

I need help with this script I got from: http://wiki.unity3d.com/index.php/FlyCam_Extended

The script is perfect for what I need, but the only problem is that it goes through meshes that have colliders on them. Can any of you guys figure out a way for it to stop moving when hitting an object with colliders on it?

I tried the following methods, and neither of them stopped the camera:

  1. I put the script on a capsule with a collider and then put an object follow script on the camera. It went through objects.

  2. I put a collider on the camera itself… it still went through objects with colliders.

Any suggestions?

Also, the camera is facing away when I start the scene. Any way to keep the camera facing the direction I have it set wit this script?

Here is the FlyCam Extended C# script:

using UnityEngine;
using System.Collections;

public class ExtendedFlycam : MonoBehaviour
{

/*
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;
}
}
}

First of all, please format your code.

transform.Translate() or directly modifying transform.position ignores the physics engine. If you want collisions, you could, for example, use a RigidBody to move the camera.

Thank you for your answer Piflik. Your solution worked… to an extent. I applied the Rigidbody component to the camera and now I don’t go past the floor plane. But when I bump into any object with colliders on it I bonce off of them and keep gliding the opposite direction, without a way to stop it. Is there any way to stop this behavior?