Jump to content
Unity Insider Forum
stevensen

Komponenten kopieren inkl Werte

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. 

Share this post


Link to post
Share on other sites

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);
			}
		}
	}

 

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites

@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?

Share this post


Link to post
Share on other sites

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).

 

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

Moinsen

Kann es sein das du die ImageEffects live beim Runtime ändern willst und bei allen die gleichen Einstellungen behalten willst ?
 

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites
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. 

Share this post


Link to post
Share on other sites

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??

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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. :) 

Share this post


Link to post
Share on other sites

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 ^^

Share this post


Link to post
Share on other sites

Ist ja leider etwas untergegangen, darum frage ich nochmal:

vor 22 Stunden schrieb Sascha:

Warum kannst du dann nicht die gesamte Kamera mit Instantiate kopieren? 

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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 ^^

Share this post


Link to post
Share on other sites

ScriptableObjects sind ja auch super, aber ich wär lieber vorsichtig, die Situation nicht zu verkomplizieren - erstmal um's Problem kümmern, dann schauen, ob das auch hübscher geht ;)

Share this post


Link to post
Share on other sites

Join the conversation

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

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

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

Loading...

×
×
  • Create New...