Search Unity

  1. Welcome to the Unity Forums! Please take the time to read our Code of Conduct to familiarize yourself with the forum rules and how to post constructively.
  2. Dismiss Notice

Free Flying Camera with Collider (FlyCam Extended)

Discussion in 'Scripting' started by AJ-Design, Nov 7, 2016.

  1. AJ-Design

    AJ-Design

    Joined:
    Nov 1, 2016
    Posts:
    15
    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;
    }
    }
    }
     
  2. Piflik

    Piflik

    Joined:
    Sep 11, 2011
    Posts:
    289
    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.
     
  3. AJ-Design

    AJ-Design

    Joined:
    Nov 1, 2016
    Posts:
    15
    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?