- Home /
Keep Player + Party and/or Targeted Enemies in Camera Focus
I was planning on making a multiplayer game that local multiplayer, but decided that I would have the game on one computer.
My camera currently allows 4 four players to be on a screen at once. The game I intend on creating will allow up 2-4 for players and I'm thinking that want to limit the distance they can move based on a zoom out limit variable or make them teleport behind the 1st player if they get to far from group.
The problem is I can't figure out how to zoom in and out when the players get for or closer. I also want it to become a little bit "top-down" as the players get farther away from each other and more third person when the get closer.
This might help you get the idea (even though the game is 2D) I want the camera to zoom in-out based on the player's distance from each other. I would also like it not to just be limited to 4 players, but for 2-3 players also.
Here is the camera script I have so far.
//======================================== //Currently, there are for slots to put players in for camera focus var lookAtTarget1 : Transform; var lookAtTarget2 : Transform; var lookAtTarget3 : Transform; var lookAtTarget4 : Transform;
//Place the camera under this in the inspector var theCamera : Transform;
//How high the camera is currently (should be replaced later for zom variables) var height : float = 10.0;
//How close the camera is to the average spot that it is focused at. var distance = 12.0;
//Temp Zoom Variable var zoom = 10.0;
//This checks the average location of the players in coordinates. var avgDistance; //========================================
function LateUpdate ()
{
//If the first target doesn't exist, exit this statement if (!lookAtTarget1) return;
//Check for the average distance between the four players.
avgDistance = ((lookAtTarget1.position+lookAtTarget2.position+lookAtTarget3.position+lookAtTarget4.position)/4);
Debug.Log(avgDistance);
theCamera.transform.position.x = avgDistance.x ;
theCamera.transform.position.z = avgDistance.z - distance;
theCamera.transform.position.y = avgDistance.y + height;
//Set height and distance variable to zoom variable
height = zoom;
distance = zoom;
}
Answer by reissgrant · Jan 31, 2011 at 04:28 AM
This script takes the largest difference between all object positions and lerps the camera with that value. The larger the difference between objects, the greater the camera distance.
To test, assign 4 cubes to the script, and move them in the editor after hitting play. The camera will move according to the greatest overall distance.
*EDIT this script will search for any gameobjects with the tag "Player" and assign those to the targets array. This happens every update so if a target dies, it is removed from the target array immediately. Also, it is not limited to 4, you can use as many targets as you like, however only targets with the "Player" tag will be included.
*EDIT 2 upated to fix a small bug. 12:26
*EDIT 3 updated to fix player being clipped. 11:21 -- 1/31
*EDIT 4 updated to allow Orthographic Cameras (it will auto detect Orthographic camera) 10:28 -- 2/26/12
////////////////////////////////////////////////////////////////////
//IMPORTANT! Tag ALL players with "Player" so they are recognized.//
////////////////////////////////////////////////////////////////////
private var isOrthographic : boolean; var targets : GameObject[]; var currentDistance : float; var largestDistance : float; var theCamera : Camera; var height : float = 5.0; var avgDistance; var distance = 0.0; // Default Distance var speed = 1; var offset : float;
//========================================
function Start(){
targets = GameObject.FindGameObjectsWithTag("Player");
if(theCamera) isOrthographic = theCamera.orthographic;
}
function OnGUI(){
GUILayout.Label("largest distance is = " + largestDistance.ToString());
GUILayout.Label("height = " + height.ToString());
GUILayout.Label("number of players = " + targets.length.ToString());
}
function LateUpdate ()
{
targets = GameObject.FindGameObjectsWithTag("Player");
if (!GameObject.FindWithTag("Player"))
return;
var sum = Vector3(0,0,0);
for (var n = 0; n < targets.length ; n++){
sum += targets[n].transform.position;
}
var avgDistance = sum / targets.length;
// Debug.Log(avgDistance);
var largestDifference = returnLargestDifference();
height = Mathf.Lerp(height,largestDifference,Time.deltaTime * speed);
if(isOrthographic){
theCamera.transform.position.x = avgDistance.x ;
theCamera.orthographicSize = largestDifference;
theCamera.transform.position.y = height;
theCamera.transform.LookAt(avgDistance);
} else {
theCamera.transform.position.x = avgDistance.x ;
theCamera.transform.position.z = avgDistance.z - distance + largestDifference;
theCamera.transform.position.y = height;
theCamera.transform.LookAt(avgDistance);
}
}
function returnLargestDifference(){
currentDistance = 0.0;
largestDistance = 0.0;
for(var i = 0; i < targets.length; i++){
for(var j = 0; j < targets.length; j++){
currentDistance = Vector3.Distance(targets[i].transform.position,targets[j].transform.position);
if(currentDistance > largestDistance){
largestDistance = currentDistance;
}
}
}
return largestDistance;
}
Nice, if you could help me with the zoom, I could declare this answered!
Ok check this new code I just posted, and I'll add the player number.
I see what you mean, changing speed doesn't seem to help much. I have to sleep now, but will have time to look at it tomorrow morning. I'll post back a fix then. ;)
O$$anonymous$$, sorry for the delay, it is fixed now. The largest difference is added to the distance now so the player will not be clipped. Let me know how it works for you.
Your answer
Follow this Question
Related Questions
Framing an Object, Bounds & Encapsulating 0 Answers
Losing Focus When Zooming In And Out 1 Answer
Lining up Fov's 0 Answers
Any ideas for doing a digital camera zoom? 1 Answer
Change UI scale in relation to 3D camera 0 Answers