Jump to content
Unity Insider Forum

Camera Wechsel.


teiger

Recommended Posts

Hi hier möchte ich euch einen Script frei zu Verfügung stellen den ihr beliebig verwenden könnt.

 



//Diesen Script dem Objekt (Auto/Person/etc.)zuweisen.
//Bei der cam die z.B auserhalb bzw in 3rd Person Ansicht geschaltet ist,den SmoothFollow hinzufügen.
//Die Zweite Camera muss im Inspector bei Camera der Haken enfernt werden bzw ausschalten.
//Die FirstPersonCam sollte dem Objekt etc in der Hierachie direkt Hinzugefügt werden das sie innerhalb,
//des Objekts aufgelistet ist. Dies erleichtert die Handhabung und Funktion.
//Man kann eben so aus einem 3rdPersonController einen 3rd&FirstPersonController machen! 
// zumindest habe ich das so ingame gemacht und muss sagen 
//"schaut besser aus wenn man auch wechseln //kann". 


var firstPersonCam : Camera;
var thirdPersonCam : Camera;

var firstCam : boolean; // Ermöglicht die auswahl per Checkbox im Editor der Aktiven Camera beim Start,
var thirdCam : boolean; // es darf aber nur eine Checkbox Aktiv bzw Ausgewählt sein!


// Gibt an welche Camera beim Spielstart An/bzw Aus ist.
function Start () {

firstPersonCam.enabled = firstCam;
thirdPersonCam.enabled = thirdCam;
}


//Eigentlich selbsterklährend, (Taste:1 =  FirstPersonCam, Taste:2 = thirdPersonCam),= true/An
//kann man auch einer anderen Taste Zuweisen,
//z.B nach den Einstellungen der Tastatur zuweisung Anpassen wie z.B jump = Leertaste etc.

function Update () 

{
if(Input.GetKeyDown("1")){
firstPersonCam.enabled = true;
thirdPersonCam.enabled = false;
}
if(Input.GetKeyDown("2")){
firstPersonCam.enabled = false;
thirdPersonCam.enabled = true;
}

}

bearbeitet von teiger
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • Variablen in Unity werden immer klein geschrieben.
  • Wenn du die erste Variable firstPersonCam nennst, kannst du die zweite auch thirdPersonCam nennen.
  • In der vorletzten Anweisung ist noch ein Typo drin.
  • Es wäre noch ganz gut, NullReference-Tests durchzuführen, nicht, dass es am Ende keine aktive Kamera gibt...

Ansonsten kann man das Script so weitergeben. Wenn du das noch korrigierst, kann's in die geprüften Snippets.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

 

für den Anfang ist das Script ganz okay und dem einen oder anderen Einsteiger ins Scripten mit Unity wird es auch sicherlich helfen, doch es ist sehr basic und mir fehlt da eig auch noch etwas.

 

Für mich persönlich muss ein Skript in Unity möglichst wiederverwendbar gestaltet werden und zwar so, dass alle Einstellungen im Editor vorgenommen wurden, ohne auch nur eine Zeile im Code verändern zu müssen.

Gerade bei diesem simplen Skript kann man dies schön umsetzen.

  • Die Keys, die gedrückt werden müssen sind hardgecodet, wieso lässt man sie nicht im Editor setzen (=> public Variable anlegen)?
  • In deinem Skript wird nur zwischen zwei aktiven Objekten gewechselt. Wieso das ganze also nicht so generisch halten, dass man auch beliebige andere Objekte ein bzw. ausschalten kann? Statt Camera könnte man also sogar die Basisklasse Behavior verwenden und aus dem SwitchCamera Skript ein SwitchObject Skript machen (wer weiß, vllt will man mal zwischen irgendwas anderem wechseln?)
  • Der Anfangszustand ist so, dass die First Person Camera aktiviert ist, es wäre schön wenn man im Editor eine Checkbox hat, die stattdessen die Third Person Camera anfangs aktiviert (=> boolean Variable)

Das wären so meine Verbesserungsvorschläge, wobei der zweite Punkt auch vernachlässigt werden kann, da das ja explitzit ein Camera Wechsel Skript ist.

 

Variablen in Unity werden immer klein geschrieben.

Public Variablen schreibt man groß, so ist es zumindest in C# Standard.

Link zu diesem Kommentar
Auf anderen Seiten teilen

So danke für den tipp. Hatte noch ein paar Fehler drin, da ich ihn hier etwas anders interpretiert hatte der Verständlichkeit's halber.

 

Ich habe ihn so wie er unten zu sehen ist getestet und funktioniert sauber also ohne Fehler im Debug usw.

 

//Diesen Script dem Objekt (Auto/Person/etc.)zuweisen.
//Bei der cam die z.B auserhalb bzw in 3rd Person Ansicht geschaltet ist,den SmoothFollow hinzufügen.
//Die Zweite Camera muss im Inspector bei Camera der Haken enfernt werden bzw ausschalten.
//Die FirstPersonCam sollte dem Objekt etc in der Hierachie direkt Hinzugefügt werden das sie innerhalb,
//des Objekts aufgelistet ist. Dies erleichtert die Handhabung und Funktion.
//Man kann eben so aus einem 3rdPersonController einen 3rd&FirstPersonController machen!
// zumindest habe ich das so ingame gemacht und muss sagen
//"schaut besser aus wenn man auch wechseln //kann".

var firstpersoncam : Camera;
var thirdpersoncam : Camera;

// Gibt an welche Camera beim Spielstart An/bzw Aus ist.
function Start () {
 firstpersoncam.enabled = true;
 thirdpersoncam.enabled = false;
}


//Eigentlich selbsterklährend, (Taste:1 =  FirstPersonCam, Taste:2 = thirdPersonCam),= true/An
//kann man auch einer anderen Taste Zuweisen,
//z.B nach den Einstellungen der Tastatur zuweisung Anpassen wie z.B jump = Leertaste etc.
function Update () {
if(Input.GetKeyDown("1")){
 firstpersoncam.enabled = true;
 thirdpersoncam.enabled = false;
}
if(Input.GetKeyDown("2")){
 firstpersoncam.enabled = false;
 thirdpersoncam.enabled = true;
}
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zu den anderen Tipps von euch,ja mann könnte ihn erweitern kein zweifel.

 

Aber ich möchte diesen Script so simpel wie möglich halten um grade Einsteigern bzw Anfängern,

das ganze verständlich zu machen wie es geht.

 

Wenn ich den nun ausbaue also Komplexer mache, wird's fürn Newbie schnell unübersichtlich wenn ihr versteht was ich meine. Ausbaufähig ist er auf jeden Fall.

 

Ideen habe ich auch schon dafür unter anderem wie gesagt Checkbox/Tastenbelegung/other Objects/ etc habe ich mir auch gedacht und werde es auch noch nachholen.

 

Geschrieben ist er in Javascript!! nur mal so nebenher gesagt. Sollte für Anfänger Wichtig sein,ihr wisst es sicherlich ;) .

Link zu diesem Kommentar
Auf anderen Seiten teilen

@Sascha,

 

Ich habe den Ersten Post Erneuert mit den Änderungen.

 

Habe auch gleich noch eine weitere Funktion eingebaut,das man im Editor per Checkbox die Cam auswÄhlen kann die beim Start Aktiv sein soll, dazu gebe ich auch gleich einen Dank an Kevin dessen Idee es war des so zu machen.

 

Wenn jemand nen Tipp hat wie man da noch pro Cam eine Key Zuweisung geben könnte.

 

Habe zwei Variabeln angelegt:

 

(var camfirst : KeyCode

(var camthird : KeyCode

 

Geht soweit auch schon,das ich ich im Editor die Tasten Zuweisen kann.

 

Wie könnte man nundiesen teil ( if(Input.GetKeyDown("1")){ ) so Ändern das er auch die Tasten nutzt.

 

Habe es schon mit camfirst versucht geht net.

Link zu diesem Kommentar
Auf anderen Seiten teilen

camfirst sollte schon gehen...

Input.GetKeyDown(camfirst)

Wenn jemand nen Tipp hat wie man da noch pro Cam eine Key Zuweisung geben könnte.

Ungefähr so:

class CameraActivation
{
 var cam : Camera;
 var key : KeyCode;
}

var cameraActivations : CameraActivation[];

function Start()
{
 for(var i : int = 0; i< cameraActivations.length; ++i)
 {
   cameraActivations[i].camera.enabled = i == 0;
 }
}

function Update()
{
 for(var ca : CameraActivation in cameraActivations)
 {
   if(Input.GetKeyDown(ca.key))
   {
  for(var otherca : CameraActivation in cameraActivations)
  {
    otherca.camera.enabled = otherca == ca;
  }
   }
 }
}

;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Er iteriert ja über das Array um die Taste für das Element/die Camera die zu aktivieren ist zu bekommen. In dem Fall wäre ein Dictionary ganz praktisch, aber die lassen sich so schlecht (gar nicht) in Unity serialisieren.

 

ja aber dafür iteriert er jeden frame über die liste ohne das auch nur eine taste gedrückt wurde.

 

Dann steuer ich mal aufbauend auf eurer Idee den C# Code bei:

 

using System;
using System.Collections.Generic;
using UnityEngine;
[serializable]
public class CamEntities {
   public KeyCode key;
   public Camera cam;
}
public class CameraChanger : MonoBehaviour {
   [serializeField]
   private List<CamEntities> camKeyList = new List<CamEntities>();
   void Start() {
    //Evtl. eine bestimmte Camera aus der camKeyList enabled setzen
   }
   // Update is called once per frame
   void Update() {
    if (!Input.anyKeyDown) return; //Um ständiges Iterieren pro Frame zu verhindern
    foreach (CamEntities entity in camKeyList) {
	    if (!Input.GetKeyDown(entity.key)) {
		    continue;
	    }
	    Camera.main.enabled = false;
	    entity.cam.enabled = true;
    }
   }
}

 

Verbesserungen sind immer willkommen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ob du jetzt continue machst oder den Kamerawechsel in einen if-Rumpf packst, ist völlig Wurst.

Einziger Unterschied ist, dass ich von den Code-Perfektionisten bei uns für deine Variante für Verschleierung des Kontrollflusses ein's auf den Deckel bekäme.

 

Auch anyKeyDown bringt jetzt nicht sooo viel in den meisten Spielen, da man sowieso die meiste Zeit irgendetwas drückt, gerade bei Tastatursteuerung. Ausserdem müsste man das auf Touch erweitern, da das afaik nicht in anyKeyDown abgedeckt wird.

Für den Minimalgewinn ist das aber wirklich Haarspalterei.

 

Was auch nicht so doll ist, ist, dass du immer nor die Main Camera aus schaltest, nicht aber deine Sekundärkameras.

Das gibt beim zweiten Kamerawechsel ein Problem, sofern man nicht immer nur die Main Camera an schaltet (was, glaube ich, irgendwie der Fall sein wird).

 

Was tatsächlich eine Idee wäre, ist das Speichern der gerade aktiven Kamera, um nicht durch das ganze Array abschaltend durchgehen zu müssen.

 

class CameraActivation
{
 var cam : Camera;
 var key : KeyCode;
}

var cameraActivations : CameraActivation[];
private var currentlyActiveCamera : Camera;

function Start()
{
 for(var i : int = 0; i< cameraActivations.length; ++i)
 {
cameraActivations[i].camera.enabled = i == 0;
 }
}

function Update()
{
 for(var ca : CameraActivation in cameraActivations)
 {
if(Input.GetKeyDown(ca.key))
{
  if(currentlyActiveCamera)
    currentlyActiveCamera.enabled = false;

  ca.camera.enabled = true;

  currentlyActiveCamera = ca.camera;

  break;
}
 }
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das continue finde ich ok und wird auch von unseren Code perfektionisten hoch gehalten, der Code wird mMn dadurch nur lesbarer da die zusätzliche Verschachtelung früh wegfällt. Ist aber Ansichtssache. Und da wir schon dabei sind tollen Code zu schreiben, Hohoho! Ich will auch mal!

 

using System.Collections.Generic;
using System.Linq;
using UnityEngine;

[serializable]
public class CameraActivation
{
 public Camera Camera;
 public KeyCode Key;
}

public class CameraActivatorComponent : MonoBehaviour
{
public CameraActivation[] cameraActivations;
private Camera currentlyActiveCamera;

void Start()
{
	currentlyActiveCamera = Camera.main;
	for(var i = 0; i< cameraActivations.Length; ++i)
	{
		if (i == 0)
		{
		    currentlyActiveCamera.enabled = false;

			currentlyActiveCamera = cameraActivations[i].Camera;
			currentlyActiveCamera.enabled = true;
		}
		else
			cameraActivations[i].camera.enabled = false;
	}
}

void Update()
{
	if (!Input.anyKeyDown)
		return;

	var cameraActivation = cameraActivations.FirstOrDefault(c => Input.GetKeyDown(c.Key));
	if (cameraActivation != null)
	{
		currentlyActiveCamera.enabled = false;

		currentlyActiveCamera = cameraActivation.Camera;
		currentlyActiveCamera.enabled = true;
	}
}
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du wieder mit deinen C#-Spezielkonstrukten xD

 

Teste mal currentlyActiveCamera noch auf null. Sicher ist sicher.

 

Sowas ginge auch:

   void Start()
   {
       if(Camera.main != null)
       {
    Camera.main.tag = "Default"; //kann auch anders sein. Weiß grad nicht.
       }
       for(int i = 0; i < cameraActivations.length; ++i)
       {
           cameraActivations[i].camera.enabled = i == 0;
       }
       cameraActivations[0].tag = "Main Camera";
   }

Oho! :P

Link zu diesem Kommentar
Auf anderen Seiten teilen

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...
×
×
  • Neu erstellen...