How can I add a lock on function so that if I press "1" within 15 yards of the enemy the camera will continue to follow the main character, but will focus on the enemy like in most 3rd Person Action games?
Here's the camera script:
var target : Transform;
var targetHeight = 2.0;
var distance = 2.8;
var maxDistance = 28;
var minDistance = 28;
var xSpeed = 250.0;
var ySpeed = 120.0;
var yMinLimit = -40;
var yMaxLimit = 80;
var zoomRate = 20;
var rotationDampening = 3.0;
private var x = 0.0;
private var y = 0.0;
@script AddComponentMenu("Camera-Control/WoW Camera")
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)
return;
// If either mouse buttons are down, let them govern camera position
if (Input.GetMouseButton(0) || (Input.GetMouseButton(1))){
x += Input.GetAxis("Mouse X") * xSpeed * 0.02;
y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02;
// otherwise, ease behind the target if any of the directional keys are pressed
} else if(Input.GetAxis("Vertical") || Input.GetAxis("Horizontal")) {
var targetRotationAngle = target.eulerAngles.y;
var currentRotationAngle = transform.eulerAngles.y;
x = Mathf.LerpAngle(currentRotationAngle, targetRotationAngle, rotationDampening * Time.deltaTime);
}
distance -= (Input.GetAxis("Mouse ScrollWheel") * Time.deltaTime) * zoomRate * Mathf.Abs(distance);
distance = Mathf.Clamp(distance, minDistance, maxDistance);
y = ClampAngle(y, yMinLimit, yMaxLimit);
// ROTATE CAMERA:
var rotation:Quaternion = Quaternion.Euler(y, x, 0);
transform.rotation = rotation;
// POSITION CAMERA:
var position = target.position - (rotation * Vector3.forward * distance + Vector3(0,-targetHeight,0));
transform.position = position;
// IS VIEW BLOCKED?
var hit : RaycastHit;
var trueTargetPosition : Vector3 = target.transform.position - Vector3(0,-targetHeight,0);
// Cast the line to check:
if (Physics.Linecast (trueTargetPosition, transform.position, hit)) {
// If so, shorten distance so camera is in front of object:
var tempDistance = Vector3.Distance (trueTargetPosition, hit.point) - 0.28;
// Finally, rePOSITION the CAMERA:
position = target.position - (rotation * Vector3.forward * tempDistance + Vector3(0,-targetHeight,0));
transform.position = position;
}
}
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);
}
asked
Feb 19 '11 at 08:55 PM
Xatoku
152
●
73
●
81
●
88