- Home /
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.
sorry about the problems with the script. Both scripts end at static function ClampAngle (angle : float, $$anonymous$$ : float, max : float) { if (angle < -360) angle += 360; if (angle > 360) angle -= 360; return $$anonymous$$athf.Clamp (angle, $$anonymous$$, max); }.
I'm a bit confused about the rigidbody - you've added one to the camera because the camera itself is supposed to move due to physics? That would be unusual. As soon as you have a rigidbody it's going to do lots of strange things.
By the way - 4 spaces at the start of each line will format your text as code :)
FTFY: http://pastebin.com/30gYusx3
You can also select the text you want to format as code and either press Ctrl+$$anonymous$$
or the code button (the one with binary on it)
@asafsitner - that'll save my fingers ;)
@arctic_waffle - in your code you are doing a while(Collision) in AdjustLineOfSight - but you aren't doing anything at that point to actually recalculate the position from the location from what we can see from the code you've supplied. I'd have thought that would just endlessly loop. Unless I'm missing something?
Answer by whydoidoit · May 21, 2012 at 08:19 PM
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.
Answer by shadowriffe · May 22, 2012 at 01:10 AM
Have you looked into Master Camera on the Asset Store? http://thoughtvandal.com/MasterCamera/MasterCameraPreview.html
Might be worth the time you would save.
Your answer
Follow this Question
Related Questions
Multiple Cars not working 1 Answer
RAYCAST KNOWLEDGE HELP!!! 1 Answer
3rd Person Camera collision is jerky when zooming out 1 Answer
Camera collision detection. 0 Answers