3rd Person camera collision

I am attempting to make a 3rd person camera that orbits around the player. The camera rotation works, but it is also supposed to move closer to the player on when it collides with something which is not working. I tried using both a raycast and a collider. It does not work. Here is the raycast code.

var target : Transform;
var distance : float = 10.0;

var xSpeed = 250.0;
var ySpeed = 120.0;

var yMinLimit = -20;
var yMaxLimit = 80;

private var x = 0.0;
private var y = 0.0;

@script AddComponentMenu("Camera-Control/Mouse Orbit")

function Start () {
    var angles = transform.eulerAngles;
    x = angles.y;
    y = angles.x;

	// Make the rigid body not change rotation
   	if (rigidbody)
		rigidbody.freezeRotation = true;
}

function LateUpdate () {
    if (target) {
        x += Input.GetAxis("Mouse X") * xSpeed * 0.02;
        y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02;
 		
 		y = ClampAngle(y, yMinLimit, yMaxLimit);
 		       
        var rotation = Quaternion.Euler(y, x, 0);
        var position = rotation * Vector3(0.0, 0.0, -distance) + target.position;
        
        transform.rotation = rotation;
        transform.position = position;
    }
}

public var lineOfSightMask : LayerMask;

    
function AdjustLineOfSight (v3NewPosition : Vector3, v3Target : Vector3): Vector3
{
    var hit : RaycastHit;
    if (Physics.Linecast (v3Target, v3NewPosition, hit, lineOfSightMask.value))
        return hit.point;
    return v3NewPosition;
}

static function ClampAngle (angle : float, min : float, max : float) {
	if (angle < -360)
		angle += 360;
	if (angle > 360)
		angle -= 360;
	return Mathf.Clamp (angle, min, max);
}

and here is the collision code.

var target : Transform;
var distance : float = 10.0;

var xSpeed = 250.0;
var ySpeed = 120.0;

var yMinLimit = -20;
var yMaxLimit = 80;

private var x = 0.0;
private var y = 0.0;

@script AddComponentMenu("Camera-Control/Mouse Orbit")

function Start () {
    var angles = transform.eulerAngles;
    x = angles.y;
    y = angles.x;

	// Make the rigid body not change rotation
   	if (rigidbody)
		rigidbody.freezeRotation = true;
}

function LateUpdate () {
    if (target) {
        x += Input.GetAxis("Mouse X") * xSpeed * 0.02;
        y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02;
 		
 		y = ClampAngle(y, yMinLimit, yMaxLimit);
 		       
        var rotation = Quaternion.Euler(y, x, 0);
        var position = rotation * Vector3(0.0, 0.0, -distance) + target.position;
        
        transform.rotation = rotation;
        transform.position = position;
    }
}

public var lineOfSightMask : LayerMask;
var camcollider : SphereCollider;

function AdjustLineOfSight (){
	while (camcollider.collision) {
		distance--;
	}
}


static function ClampAngle (angle : float, min : float, max : float) {
	if (angle < -360)
		angle += 360;
	if (angle > 360)
		angle -= 360;
	return Mathf.Clamp (angle, min, max);
}

Pay attention to the AdjustLineOfSight functions where it is supposed to move closer to the player. There are no errors, it just does not work. Can anyone tell me what is wrong? You can show me your code. You can fix mine. I just need help.

Well you aren’t allowing the code that uses distance to run while that loop is happening - you would need the code that happens in late update to happen to change the collision based on your modifications to distance.

The normal way to do this is to cast a ray from your camera at the thing the camera needs to look at - if it intersects something then you need to move the camera, you update the position of the camera (in your case moving it relative to distance) and then cast the ray again - all in the same loop.

There’s some code on my blog here that does work on a follow camera with collision detection, but it might not be what you are after.

Have you looked into Master Camera on the Asset Store?
http://thoughtvandal.com/MasterCamera/MasterCameraPreview.html

Might be worth the time you would save.