- Home /
More Effective Camera Switching
For a Video Game Design class project, I have been working on a simple solar system. It has all of the planets rotating around the the sun, etc. I wanted to create a GUI element where you could click on a button with the name of the planet (ex: button says "Earth"), and the camera would switch to follow that planet's orbit. I read up on the scripting reference, and I came up with something that worked after much forum browsing/trial and error (I am pretty new to scripting). I was wondering if someone could show me a more efficient way to do this. First, I'll show the way I came up with.
BasicalIy, my method was to make a camera for each planet, and attach this script to each:
 #pragma strict
 var target : Transform;
 
 
 function Update () {
     transform.LookAt(target);
 
 }
That one makes the camera look at its designated planet. The other script was for the GUI:
 #pragma strict
 
 var mainview : Camera;
 var marsview : Camera;
 var earthview : Camera;
 var mercuryview : Camera;
 var jupiterview : Camera;
 var plutoview : Camera;
 //states variables of the cameras
 
 function Start () {
     //deactivates all cameras but the main camera
     mainview.camera.active = true;
     marsview.camera.active = false;
     earthview.camera.active = false;
     mercuryview.camera.active = false;
     jupiterview.camera.active = false;
     
 }
 
 
 function OnGUI () {
     //creates GUI
     GUI.Box (Rect (0, 10, 200, 90), "Camera View Switch");
     if (GUI.Button (Rect (20, 40, 80, 20), "Earth")) { //first button
         mainview.camera.active = false;
         marsview.camera.active = false;
         mercuryview.camera.active = false;
         jupiterview.camera.active = false;
         earthview.camera.active = true;
         //activates earthview camera, deactivates all others
     }    
     if (GUI.Button (Rect (20, 70, 80, 20), "Mars")) {
            mainview.camera.active = false;
         earthview.camera.active = false;
         mercuryview.camera.active = false;
         jupiterview.camera.active = false;
         marsview.camera.active = true;
     }
     if (GUI.Button (Rect (20, 100, 80, 20), "Sun")) {
         earthview.camera.active = false;
         marsview.camera.active = false;
         mercuryview.camera.active = false;
         jupiterview.camera.active = false;
         mainview.camera.active = true;
     }
     if (GUI.Button (Rect (20, 130, 80, 20), "Mercury")) {
         earthview.camera.active = false;
         marsview.camera.active = false;
         mainview.camera.active = false;
         jupiterview.camera.active = false;
         mercuryview.camera.active = true;
     }
     if (GUI.Button (Rect (20, 160, 80, 20), "Jupiter")) {
         earthview.camera.active = false;
         marsview.camera.active = false;
         mainview.camera.active = false;
         mercuryview.camera.active = false;
         jupiterview.camera.active = true;
     }
     if (GUI.Button (Rect (20, 190, 80, 20), "Pluto")) {
         earthview.camera.active = false;
         marsview.camera.active = false;
         mainview.camera.active = false;
         mercuryview.camera.active = false;
         jupiterview.camera.active = false;
         plutoview.camera.active = true;
     }
 
 }
 
 function Update () {
 
 }
I didn't include all of the planets for the sake of example, but you get the idea. Being pretty new to this, I was glad I could find a solution that worked. Now I am looking for community input. If it isn't too much trouble, could someone show me a better, more efficient/effective way to accomplish this?
Answer by AlucardJay · Dec 06, 2012 at 03:00 AM
You could just use an array for your cameras, and then loop through the array, given an index activate that camera, and disable all others in a loop :
 #pragma strict
 
 // Drop cameras in Inspector **IN ORDER**
 // eg Main; Sun; Mercury; Venus; Earth; etc etc
 
 var cameraView : Camera[];
 
 
 function OnGUI() 
 {
     if (GUI.Button (Rect (20, 40, 80, 20), "Earth"))
     {
         SetCamera( 4 ); // 5th item in list, 4th counting from zero
     }
     if (GUI.Button (Rect (20, 70, 80, 20), "Mars"))
     {
         SetCamera( 5 ); // 6th item in list, 5th counting from zero
     }
     if (GUI.Button (Rect (20, 100, 80, 20), "Sun"))
     {
         SetCamera( 1 ); // 2nd item in list, 1st counting from zero
     }
 }
 
 
 function SetCamera( index : int ) 
 {
     for ( var i : int = 0; i < cameraView.Length; i ++ )
     {
         cameraView[i].enabled = false;
     }
     
     cameraView[index].enabled = true;
 }
 
 
 // this could also be written like : 
 /*
 function SetCamera( index : int ) 
 {
     for ( var i : int = 0; i < cameraView.Length; i ++ )
     {
         if ( i == index )
         {
             cameraView[i].enabled = true;
         }
         else
         {
             cameraView[i].enabled = false;
         }
     }
 }
 */
Your answer
 
 
             Follow this Question
Related Questions
The name 'Joystick' does not denote a valid type ('not found') 2 Answers
Rotating an object to face the camera regardless of the cameras position. 3 Answers
Smooth camera follow return 1 Answer
Unassigned Reference Exception 4 Answers
How to render severals cameras at differents Frame Rate ? 2 Answers
 koobas.hobune.stream
koobas.hobune.stream 
                       
                
                       
			     
			 
                