Jump to content
Unity Insider Forum

Komponenten kopieren inkl Werte


stevensen

Recommended Posts

Hallo,

ich habe schon gesucht aber vielleicht nach dem falschen.

Also ich möchte gerne während der Laufzeit eine Kopie meiner Main-Kamera machen inkl aller Komponenten oder wenigstens aller Imageeffekte wie Bloom etc. Und die werte vom Original sollten auch übernommen werden.
Könnt ihr mir stichworte geben nachdem ich suchen kann. 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für die Antwort.
Es hat sich rausgestellt, das ich von was Falschem ausgegangen bin. Es gibt schon eine oder mehrere Kameras neben der Main-Kamera und die brauchen wenigsten die Imageeffeke.
Ich habe eine script gefunden was alle Components kopiert, wenn ich das Quell- und Ziel-Gameobject public mache und dann im Inspector eintrage. Wenn ich aber nur die Methode so benutzen will kommt der Fehler Unity.camera kann nicht zum Gameobejct konvertiert werden. Wieso geht es wenn ich es über den instpector mache?

private void CopySpecialComponents(GameObject _sourceGO, GameObject _targetGO)
	{
		foreach (var component in _sourceGO.GetComponents<Component>())
		{
			var componentType = component.GetType();
			if (componentType != typeof(Transform) &&
				componentType != typeof(MeshFilter) &&
				componentType != typeof(MeshRenderer)
				)
			{
				Debug.Log("Found a component of type " + component.GetType());
				UnityEditorInternal.ComponentUtility.CopyComponent(component);
				UnityEditorInternal.ComponentUtility.PasteComponentAsNew(_targetGO);
				Debug.Log("Copied " + component.GetType() + " from " + _sourceGO.name + " to " + _targetGO.name);
			}
		}
	}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 46 Minuten schrieb stevensen:

Danke für die Antwort.
Es hat sich rausgestellt, das ich von was Falschem ausgegangen bin. Es gibt schon eine oder mehrere Kameras neben der Main-Kamera und die brauchen wenigsten die Imageeffeke.
Ich habe eine script gefunden was alle Components kopiert, wenn ich das Quell- und Ziel-Gameobject public mache und dann im Inspector eintrage. Wenn ich aber nur die Methode so benutzen will kommt der Fehler Unity.camera kann nicht zum Gameobejct konvertiert werden. Wieso geht es wenn ich es über den instpector mache?


private void CopySpecialComponents(GameObject _sourceGO, GameObject _targetGO)
	{
		foreach (var component in _sourceGO.GetComponents<Component>())
		{
			var componentType = component.GetType();
			if (componentType != typeof(Transform) &&
				componentType != typeof(MeshFilter) &&
				componentType != typeof(MeshRenderer)
				)
			{
				Debug.Log("Found a component of type " + component.GetType());
				UnityEditorInternal.ComponentUtility.CopyComponent(component);
				UnityEditorInternal.ComponentUtility.PasteComponentAsNew(_targetGO);
				Debug.Log("Copied " + component.GetType() + " from " + _sourceGO.name + " to " + _targetGO.name);
			}
		}
	}

 

Weil Unity das GameObject in das Property packt bzw. Du und Unity dann automatisch die Camera component als eigentlichen Property Wert übergibt. Du musst also einfach deineCamera.gameObject übergeben statt direkt die Camera component.

Link zu diesem Kommentar
Auf anderen Seiten teilen

@stevensen Der Weg bringt dir nichts. Wenn du UnityEditor oder UnityEditorInternal benutzt, kann dein Script nicht in den Build exportiert werden. ComponentUtility ist also tabu, falls das kein Editor-Only-Script werden soll.

Ich muss aber auch sagen, dass ich bei dieser Aussage ein bisschen schmunzeln musste:

vor 52 Minuten schrieb stevensen:

Es hat sich rausgestellt, das ich von was Falschem ausgegangen bin.

Das Kopieren einer Komponente samt Werten schreit nämlich förmlich nach XY-Problem. Daher die übliche Frage: Was willst du damit eigentlich damit wirklich erreichen? Also... Was für ein Verhalten möchtest du implementiert haben, dass du dafür eine Komponente kopieren willst?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Sascha,

es geht um eine Stereoskopische Kamera mit 2 oder 4 Kameras. Beim Starten gibt es die Main-Kamera (linke Ansicht) und während der Laufzeit wird z.B. eine 2. erstellt (rechte Ansicht) und deren x-pos Offset wird per Script gesteuert. Dann besteht das Bild aus 2 Kameraviews. Jetzt wäre es natürlich schön wenn auf der 2. Kamera die selben Effekte (Blooming etc) wären.
Eine Instanstierung der Maincam habe ich probiert aber weil das Steuerungscript mit instantiert wird klappt das nicht(bzw ich weiß nicht wie).
Für mich wäre es am einfachsten erstmal nur die Effekt-Componenten auf anderen Kameras zu kopieren( während der Laufzeit).

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ein Ansatz: Mache doch aus der Kamera ein Prefab ohne Steuerungsskript. Dann baust Du einen CameraManager, diesem gibst Du das Prefab über den Inspector und dann instanziert dieser beim Start die erste Kamera und fügt der Kamera das Steuerskript zu. Jede weitere Kamera erzeugst Du auch aus dem Prefab und schon haben diese alle die gleichen Eigenschaften bis auf dein Steuerskript.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 34 Minuten schrieb stevensen:

Angenommen ich muss die Kameras so nehmen wie sie sind, gibt es überhaupt einen Weg die Komponenten zu kopieren? 

@Tarantel
Das wäre super, aber mir würde es reichen wenn ich auf der Maincamera alles anfangs einmal einstelle, und dann alle anderen Kameras diesen Stand hätten.

Wenn du ein Objekt kopierst übernimmt er automatisch alle Komponenten und deren Werte.

Das funktioniert auch runtime.

Das was ich gestern meinte dafür musst du dir nur ein neues Controller Script erstellen. 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 31 Minuten schrieb stevensen:

Angenommen die Kameras bestehen schon und ich kann keine Instanz machen, könnte ich dennoch mit einem eigenen Script, welches ich auf die Main-Kamera tue, die Effekt-Komponenten auf die anderen Kameras kopieren??

Ich befürchte, dass Du dafür dann ein eigenes Skript schreiben musst, welches die Parameter übergeben bekommt bzw. die Originalkomponente und diese Parameter dann manuell in die neue Komponente schreiben.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 36 Minuten schrieb stevensen:

Angenommen die Kameras bestehen schon und ich kann keine Instanz machen, könnte ich dennoch mit einem eigenen Script, welches ich auf die Main-Kamera tue, die Effekt-Komponenten auf die anderen Kameras kopieren??

Das geht.
Ich kann hier nur nicht soviel dazu sagen da ich dies nie selber genutzt hab aber hier wäre eine variante.

 

//Das sind die Publics womit du die Komponenten kopieren kannst.
//Das hier ist nur zur Vorschau
[WrapperlessIcall]
     public static bool CopyComponent(Component component);
     [WrapperlessIcall]
     public static bool MoveComponentDown(Component component);
     [WrapperlessIcall]
     public static bool MoveComponentUp(Component component);
     [WrapperlessIcall]
     public static bool PasteComponentAsNew(GameObject go);
     [WrapperlessIcall]
     public static bool PasteComponentValues(Component component);
//Das Eigentliche Script was diese Methoden nutzt.
using UnityEngine;
 using System.Collections.Generic;
 public class TestMB : MonoBehaviour
 {
     public GameObject go1;
     public GameObject go2;
   //Die void musst du noch austauschen ^^
     void OnGUI()
     {
       //nicht über das alte GUI wundern ^^ das ist nur eine einfache if die du selber bestimmen kannst ^^
         if (GUI.Button(new Rect(Screen.width / 2, 100, 200, 100), "Swap transforms")) {
             var t1 = go1.GetComponent<Transform>();
             var t2 = go2.GetComponent<Transform>();
             var temp = new GameObject("_TEMP").GetComponent<Transform>();
             // temp = t1;
             // t1 = t2;
             // t2 = temp;
             if (UnityEditorInternal.ComponentUtility.CopyComponent(t1)) {
                 if (UnityEditorInternal.ComponentUtility.PasteComponentValues(temp)) {
                     if (UnityEditorInternal.ComponentUtility.CopyComponent(t2)) {
                         if (UnityEditorInternal.ComponentUtility.PasteComponentValues(t1)) {
                             if (UnityEditorInternal.ComponentUtility.CopyComponent(temp)) {
                                 if (UnityEditorInternal.ComponentUtility.PasteComponentValues(t2)) {
                                     print("DONE");
                                 }
                             }
                         }
                     }
                 }
             }
             
             Destroy(temp.gameObject);
         }
     }
 

Musst es natürlich noch anpassen damit es mehrere Cams gleichzeitig anpeilt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Stunde schrieb Tarantel:

Das geht.
Ich kann hier nur nicht soviel dazu sagen da ich dies nie selber genutzt hab aber hier wäre eine variante.

 


//Das sind die Publics womit du die Komponenten kopieren kannst.
//Das hier ist nur zur Vorschau
[WrapperlessIcall]
     public static bool CopyComponent(Component component);
     [WrapperlessIcall]
     public static bool MoveComponentDown(Component component);
     [WrapperlessIcall]
     public static bool MoveComponentUp(Component component);
     [WrapperlessIcall]
     public static bool PasteComponentAsNew(GameObject go);
     [WrapperlessIcall]
     public static bool PasteComponentValues(Component component);

//Das Eigentliche Script was diese Methoden nutzt.
using UnityEngine;
 using System.Collections.Generic;
 public class TestMB : MonoBehaviour
 {
     public GameObject go1;
     public GameObject go2;
   //Die void musst du noch austauschen ^^
     void OnGUI()
     {
       //nicht über das alte GUI wundern ^^ das ist nur eine einfache if die du selber bestimmen kannst ^^
         if (GUI.Button(new Rect(Screen.width / 2, 100, 200, 100), "Swap transforms")) {
             var t1 = go1.GetComponent<Transform>();
             var t2 = go2.GetComponent<Transform>();
             var temp = new GameObject("_TEMP").GetComponent<Transform>();
             // temp = t1;
             // t1 = t2;
             // t2 = temp;
             if (UnityEditorInternal.ComponentUtility.CopyComponent(t1)) {
                 if (UnityEditorInternal.ComponentUtility.PasteComponentValues(temp)) {
                     if (UnityEditorInternal.ComponentUtility.CopyComponent(t2)) {
                         if (UnityEditorInternal.ComponentUtility.PasteComponentValues(t1)) {
                             if (UnityEditorInternal.ComponentUtility.CopyComponent(temp)) {
                                 if (UnityEditorInternal.ComponentUtility.PasteComponentValues(t2)) {
                                     print("DONE");
                                 }
                             }
                         }
                     }
                 }
             }
             
             Destroy(temp.gameObject);
         }
     }
 

Musst es natürlich noch anpassen damit es mehrere Cams gleichzeitig anpeilt.

Das dürfte eben nicht gehen, weil das ein Unity Editor Tool ist, was nur im Editor funktioniert, weil es den UnityEditorInternal namespace nutzt.

Das hat @Sascha weiter oben schon beschrieben. :) 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok dann würde ich sagen das du einfach die Maincam als träger nimmst und immer wenn du eine weitere cam brauchst oder etwas an der MainCam änderst werden alle anderen neu instantiiert ^^
Musst halt bissl rumbasteln oder ich schau ob ich dir nen script dafür mache die tage weil hab momentan kaum zeit ^^

Weil ist jetzt die frage was resourcen sparender ist ^^
Jede einzelne Value immer neusetzen oder einfach das ganze Gameobject neuzuspawnen ^^

Link zu diesem Kommentar
Auf anderen Seiten teilen

Vielen Dank für die  vielen Beiträge!

Ich benutzte dieses Stereoscopicscript nur, es ist nicht von mir. Ein paar Sachen konnte ich mit meinem Script von Außen steuern. 
Ich werde denjenigen fragen ob er die Kameras mit copy  Instantiate erzeugen kann.

Und seh dann mal weiter, und melde mich wieder.

Also Danke erstmal

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn alle Cams die gleichen Einstellungen haben sollen , dann kannst du auch einfach ein Scriptableobject nutzen was die werte Temporär speichert ^^

Ist mir grad wieder eingefallen ^^

Aso das Script was du nutzt, um die werte der cams zubearbeiten.

Haste das gekauft?  Falls nicht dann schick es mir mal privat und ich schau mal was man da machen kann. 

 

PS: ja Sascha ich mag Scriptableobjects ^^

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...