Jump to content
Unity Insider Forum

All Activity

This stream auto-updates     

  1. Past hour
  2. Today
  3. So, ich habe etwas experememtiert: - wenn ich "float plyRotAngelEnd = 179.0f;" eingebe ist das Ergebnis nach der Drehung für "Rotation" X, Y, Z: 1, -180,-1 - wenn ich nur über die X Achse drehe und nicht noch über Z Achse ist das Ergebnis nach der Drehung: -180, 0, 0 - wenn ich die X Achse und die Y Achse drehe ist das Ergebnis nach der Drehung: 0, 0, -180 Es scheint also so, dass Unity versucht die Werte für "Rotation" nach der Drehung zu optimieren - das mache ich mir doch zu Nutze für mein Problem Nummer 2. Dadurch, dass mein Schiff aufgrund des Wert "Rotation" Y = -180 gedreht ist, und die anderen Achsen nun wieder auf "0" stehen, nehme ich die Y Achse mit in meinem Script auf: Ich ergänze public float plyShipMainRotY; und in der Update Function plyShipMainRotY = plyShipMain.eulerAngles.y; und ändere in der FixedUpdate Function plyShipMain.eulerAngles = new Vector3(plyShipMainRotX, plyShipMainRotY, plyShipMainRotZ); Nun sieht die Drehung wie folgt aus - zur Verdeutlichung habe ich die Drehtzeit "plyRotUridiumDuration" etwas erhöht. Im Spiel drehe ich natürlich schneller: RotierenUridium3.mp4 Da ich nun wirklich alle Achse nutze könnte ich eventuell anstatt 3 float Variablen mit einer Vector3 Variable arbeiten. Ich setzte mich aber ersteinmal an meine weiteren Probleme und hoffe, dass nicht in einem Update die Optimierung der Werte für "Rotation" wieder aufgehoben wird.
  4. Sascha

    Objekt mit Resources.Load() laden

    Wenn "cube" ein Ordner ist, kannst du den schlecht laden. Mal davon abgesehen, müssen Ressourcen in einem Ordner namens "Resources" sein. Mit "Objects/cube" lädst du also z.B. das Asset mit dem Pfad "Assets/Resources/Objects/cube.prefab" oder "Assets/Banana/Resources/Objects/cube.prefab". Das ist auch schon so der erste Punkt, an dem die Warnleuchten angehen dürfen - Resources sollte man einfach generell nicht außerhalb von Editorscripts benutzen.
  5. RealNiclas

    Objekt mit Resources.Load() laden

    Guten Morgen, ich versuche nun schon einige Zeit Objekte mittels Resources.Load() zu laden, bis jetzt aber ohne Erfolg. Egal wie ich den Pfad angebe, das Objekt ist am Ende immer NULL. z.B.: GameObject cube = Resources.Load("Objects/cube") as GameObject; Das Objekt liegt in folgendem Ordner: "Assets/Objects/cube" Weiß jemand woran das liegen könnte? Gruß: Niclas
  6. Jo, gerne! Es hat schon ein paar Minuten gedauert, bis ich die Werte heraus gefunden hatte. Aber irgendwie reizen mich solche Dinge enorm. Ich muss dann einfach wissen, wie es funktioniert. Vorallem, wenn ich erkenne, dass da irgendwas getrickst wurde.
  7. Hey malzbie! Echt super, wie du dir Mühe gemacht hast! Vielen Dank Ich hab 4x4 Felder und dafür aber 1.9m Distanz statt 1.4 und FoV 60. Ich werde aber sicher genau die selben Werte und auch Feldgrösser ausprobieren wie du ermittelt hast. Du scheinst es genau getroffen zu haben
  8. Yesterday
  9. Ich konnte es nicht lassen und habe die nötigen Werte ermittelt. Schau hier:
  10. Stimmt schon. Meine Kamera ist recht tief, aber das kann man leicht mit hoheren Wänden ausgleichen. Wie ich oben schon geschrieben habe, sind meine Säulen viel mächtiger als die in Grimrock. Dadurch hatte ich FOV von 60 eingestellt. Wenn die Säulen schmaler sind, kann man ohne weiteres ein FOV von 50 einstellen. Dadurch kommt alles etwas näher ran, auch die Monster, die ein Feld weiter stehen. Es war nur ein Quick and Dirty Test um dir zu zeigen, dass FOV eben nicht hoch ist und somit einen Weitwinkel erzeugt, sondern eher kleiner als normal und somit zoomt. Und damit die Wände passen, ist alles viel enger gebaut, als es wirklich sein würde.
  11. Last week
  12. Vielen Dank, dass du dir die Mühe gemacht hast! Du hast Recht, wenn man die Kamera nach hinten setzt, funktioniert das schon viel besser. Bin mit den Werten FoV, Neigung, Höhe und Position Offset zur Mitte am experimentieren. Habe es aber noch nicht so hinbekommen, wie in Grimrock. Schau mal deine Szene an... Wenn jetzt ein Gegner auf dem gegenüber liegenden Feld steht, ist die Distanz schon absurd gross für ein Kampf und deine Kamera ist auch sehr tief am Boden. In Grimrock wirkt das alles irgendwie ganz anders.
  13. Hi, ich möchte mit folgendem Script mein Schiff wie in beigefügtem Video drehen (was alles nicht klappt, schreibe ich am Ende): public class PlyRotUridium : MonoBehaviour { [SerializeField] GameObject ply; [SerializeField] Transform plyShipMain; [SerializeField] GameObject plyShip; [SerializeField] Transform plyGun; [SerializeField] GameObject background; // [SerializeField] // GameObject backgroundStars; [SerializeField] float plyRotUridiumDuration = 1.0f; public float plyShipMainRotX; public float plyShipMainRotZ; public float plyShipRotZ; float plyShipRotZSpeed; float plyRotAngelEnd = 180.0f; float plyRotRealAngelEnd; float backgroundMoveSpeed; float backgroundStop = 0.0f; [SerializeField] float backgroundEndSpeed = -0.06f; bool rotUridiumYes = false; void Update() { if (Input.GetKeyDown("u") && !rotUridiumYes) { rotUridiumYes = true; var gunYes = ply.GetComponent<PlyGunMain>(); gunYes.enabled = !gunYes.enabled; // Kanonen ausstellen, damigt beim Drehen nicht sonstwohin geschossen wird. var plyRotScript = plyShip.GetComponent<PlyShipRot>(); plyShipRotZ = plyShip.GetComponent<PlyShipRot>().plyRotZ; plyShipRotZSpeed = plyShip.GetComponent<PlyShipRot>().plyRotSpeed; plyRotScript.enabled = !plyRotScript.enabled; // leichtes Drehen um Z Achse ausschalten, damit das Script mit diesem nicht zusammenkommt. Vector3 gunRot = plyGun.eulerAngles; gunRot.y += 180.0f; // Kanonen um 180 Grad drehen, damit später die Schußrichtung stimmt. plyGun.eulerAngles = gunRot; plyShipMainRotX = plyShipMain.eulerAngles.x; plyShipMainRotZ = plyShipMain.eulerAngles.z; // var rotx = plyRotX; // plyRotRealAngelEnd = (rotx += plyRotAngelEnd); // eigentlich möchte ich hier zum vorhandenen Winkel zusätzlich 180° hinzurechnen. backgroundMoveSpeed = background.GetComponent<TransformForward>().moveSpeed; // StartRot(); StartCoroutine(PlyRotXZUridium(backgroundStop, backgroundEndSpeed, plyRotAngelEnd, plyRotUridiumDuration)); } } /* void StartRot() { while (plyShipRotZ == 0) { if (plyShipRotZ < 0) { plyShipRotZ += 1 * plyShipRotZSpeed; } if (plyShipRotZ > 0) { plyShipRotZ -= 1 * plyShipRotZSpeed; } } if (plyShipRotZ == 0) { StartCoroutine(PlyRotXZUridium(backgroundStop, backgroundEndSpeed, plyRotAngelEnd, plyRotUridiumDuration)); } } */ private void FixedUpdate() { if (rotUridiumYes) { // plyShip.transform.eulerAngles = new Vector3(0, 0, -plyShipRotZ); plyShipMain.eulerAngles = new Vector3(plyShipMainRotX, 0, plyShipMainRotZ); background.GetComponent<TransformForward>().moveSpeed = backgroundMoveSpeed; } } private IEnumerator PlyRotXZUridium(float targetBackStop, float targetBackStart, float targetRot, float duration) { var startBack = backgroundMoveSpeed; var startRotX = plyShipMainRotX; var startRotZ = plyShipMainRotZ; for (var time = 0.0f; time < duration; time += Time.deltaTime) { var progress = time / duration; backgroundMoveSpeed = Mathf.Lerp(startBack, targetBackStop, progress); plyShipMainRotX = Mathf.Lerp(startRotX, targetRot, progress); yield return null; } plyShipMainRotX = targetRot; for (var time = 0.0f; time < duration; time += Time.deltaTime) { var progress = time / duration; backgroundMoveSpeed = Mathf.Lerp(startBack, targetBackStart, progress); plyShipMainRotZ = Mathf.Lerp(startRotZ, targetRot, progress); yield return null; } backgroundMoveSpeed = targetBackStart; plyShipMainRotZ = targetRot; var gunYes = ply.GetComponent<PlyGunMain>(); gunYes.enabled = !gunYes.enabled; var plyRotScript = plyShip.GetComponent<PlyShipRot>(); plyRotScript.enabled = !plyRotScript.enabled; yield return new WaitForSeconds(0.2f); rotUridiumYes = false; } } Hier die Drehung: RotierenUridium.mp4 Erläuterung: wie im Video zu erkennen ist, hat mein Player verschiedene Child Objekte: - PlyShip (welches im Script eine Variable ist): dieses nutze ich, um ein kleines Kippen (Drehung um die Z-Achse) zu erzeugen, wenn man sich seitlich bewegt. Diese Drehung schalte ich im Script aus. - Child zu PlyShip: PlyMain (auch eine Variable im Script): hier sind alle sichtbaren Komponenten des Schiff enthalten - PlyGun (eine weitere Variable im Script): Die Spawn Punkte der verschiedenen Waffen Folgende Probleme habe ich: 1: ich drehe das GameObject "PlyMain" nur um die X und Z Achse. Wie im Video zu erkennen ist, stehen diese nach der Drehung wieder auf "0" und die Y Achse auf "-180", obwohl ich diese gar nicht ändere. Das ist warscheinlich mein Ursprungsproblem für den folgenden Punkt. 2: ich schaffe es nicht, die Drehung zu wiederholen, sprich mich zurück zu drehen. Eigendlich dachte ich, dass ich mit den Zeilen "var rotx = plyRotX;" und "plyRotRealAngelEnd = (rotx += plyRotAngelEnd);" iin der Update Funktion mir den aktuellen Wert der Achsen hole und dann 180° hinzurechne - klappt aber nicht. 3: wie geschrieben, hat mein GameObjekt "PlyShip" ein eigenes Script zu leichten Kippen des Schiff. Wenn mein "PlyShip" noch etwas gekippt ist, hat das natürlich optisch Auswirkungen auf das Child "PlyMain". Was mich wundert: es werden aber auch von "PlyMain" die Werte der Z Achse geändert (siehe Video am Ende). 4: um das zu umgehen habe ich die Funktion "StartRot" (im Script aktuell inaktiv geschaltet) eingebaut, um vor der eigendlichen Drehung das Kippen von "PlyShip" wieder auf "0" zu setzten. Das klappte aber auch nicht. 5: ich kann derzeit keine While Schleife ausführen. Unity stürzt mit dabei immer komplett ab. Ich muss es mit den Taskmanager beenden. Hier noch die Drehung, wenn das Schiff etwas gekippt ist: RotierenUridium2.mp4
  14. Dami1302

    Hilfe beim Steuerelement "Slider"

    Hallo, ich habe ein Problem bei einem Slider also einem Schieberegler. Ich habe ein Mini Game wo ich Munition benötige. Über den Schieberegler möchte ich die Anzahl der Munition bestimmen. Leider weiß ich nicht wie ich den Wert des Schiebereglers benutzen kann um ihn in einen anderen Skript als Munition einsetzen zu können. Ich hoffe jemand kann mir helfen.
  15. Ich hatte gerade etwas Zeit, bevor der Osterbesuch kommt, und habe so mal schnell eine Szene gebaut. Ziel war es einfach einen ähnlichen Bildausschnitt wie bei Grimrock zu zeigen. Daten zur Szene: FOV ist ungefähr 60. Die Kamera ist ungefähr 70cm hinter dem Drehpunkt, welcher genau in der Mitte eines Dungeonfeldes liegt. Die Gänge sind rund 2,5 Meter breit und 2 Meter hoch. Die Kamera ist etwa in der Mitte also bei 90cm. Du siehst also, dass FOV ganz normal ist, aber eben die Gänge viel zu eng sind um ne vierer Party da unter zu bringen. Aber so wird eben beschissen. Hier das Bild dazu Edit: Da meine Säulen viel mächtiger sind, als die Vorsprünge bei Grimrock, gehe ich davon aus, dass Grimrock eher einen FOV von 50 oder so hat.
  16. Schau mal wie das bei mir aussieht bei 110. Alles ist total verzerrt. Der Pfosten scheint Rechteckig und alles sieht unangenehm aus, auch die Steuerung. Das mit der Kamera leicht nach hinten zu setzen habe ich schon probiert. Dann sieht man zwar mehr Wand, aber die Rotation ist dann merkwürdig. In Legend of Grimrock sieht die Rotation nicht so aus, als wäre die Kamera nicht in der Mitte des Feldes...
  17. Bitte was? Das Spiel hat ein FoV von irgendwas um 110, 120. Dinge, die zwei Felder weit weg sind sind nur noch halb so groß wie Dinge, die ein Feld weg sind. Also einfach hoch den Slider. Zusätzlich dazu scheint die Kamera nicht auf der Rotationsachse des Spielers zu sitzen, sondern leicht dahinter.
  18. Hi Ich frage mich schon die ganze Zeit, wie in LoG die Kameraeinstellung so funktioniert: Man sieht viel auf einmal (Boden und beide Seiten der Wand). Das Feld ist recht klein und die Kamera recht nah an der Wand. Man sieht fast keine Perspektivische Verzerrung. In Unity bekomme ich so eine Kamera einfach nicht hin, ausser ich mache das Feld absurd gross, oder ändere die Perspektive bis zur völligen Verzerrung. Wie könnte das gemacht sein? Hier ein Video:
  19. Genau das. Deine IDE und der Compiler können schon vor Programmstart schauen, ob das, was dein Code machen will, überhaupt möglich ist. Ein String ist immer korrekt, bis du ihn in einem bestimmten Kontext benutzen willst, also fäält frühestens in dem Moment ein Fehler auf.
  20. Danke, ich habe es nun auf ply = GameObject.Find("Player"); eingekürzt. Die Transform Komponente hole ich mir nun an einer anderen Stelle des Script. Mal schauen, ob nun irgendwann die Fehlermeldung doch noch kommt - was ja nicht passieren sollte. @Sascha, einige Fragen noch zu deinem Blog auf http://blog.13pixels.de/2019/why-strings-are-not-your-friend/ : Ich verstehe zwar, wieso man keine Strings nutzen soll, aber kann man sich bei der Angabe einer Komponente in einem Script nicht auch vertippen? Oder kann es beim Umbenennen der "Zielkomponente" (was man eigendlich nicht machen sollte) nicht auch dazu kommen, dass ein Script diese nicht mehr findet? Wo ist da der Unterschied zur Eingabe eines Namen, wie ich es mit .Find("Player") gerade mache? Liegt der Unterschied darin, dass beim Eintippen des Script mir hier schon der Fehler angezeigt wird, während ein falscher Name erst beim Testen des Spiel als Fehler erscheint?
  21. @Sascha Du hast ja vollkommen Recht. Find ist nicht gut und mit Strings zu arbeiten schon gar nicht. Und meistens kann man das Umgehen. Aaaber: Hast du denn auch schon eine andere Lösung für Objekte, die nicht von Beginn an in der Szenen sind, aber unbedingt mit anderen Objekten, die schon vorher da waren, interagieren wollen?
  22. FindObjectsOfType ist auch doof, aber mit einer anderen Begründung - diese ist leider etwas komplexer als die Begründung gegen Strings. Für Anfänger (und wohl auch eine Weile für Fortgeschrittene) ist das ne heftige Nummer. Ich arbeite seit über zehn Jahren mit Unity und habe erst letztes Jahr wieder ein richtig dickes "Klick" gehabt, was dieses Thema angeht. Ich versuche aber mal, das zu erklären. Unity ist ein dickes, fettes "Dependency Injection"-Framework. Stelle dir vor, du hättest den Unity-Editor nicht. Dann müsste deine Player-Kamera mit sowas wie GameObject.Find den Player finden, um ihm zu folgen. Stattdessen kannst du ein serialisiertes Feld in dein Kamera-Script packen, dem Script beibringen dem Ding zu folgen, das von der Variable referenziert wird, und den Player reinziehen. Das bedeutet, dass Unity irgendwie für dich dafür sorgt, dass das richtige Ding referenziert wird, ohne dass du dafür selber Code schreiben musst. Unity "injiziert" hier das Objekt, von dem das Verhalten der Kamera abhängt ("Dependency"), denn die Kamera fliegt anders, je nachdem, wem sie folgt. Darum "Dependency Injection". Ich merk grad schon, da sollte ich auch mal einen Artikel drüber schreiben Jedenfalls bewirkt Unity als Dependency Injection-Maschine zwei Dinge: Du kannst als Designer arbeiten, ohne zu coden. Gute Scripts lagern Abhängigkeiten, die als Teil des Gamedesign-Prozesses festgelegt werden, aus dem Code aus, sodass man keinen Code mehr braucht, um das Spiel letztenenedes zu verkabeln. Das macht Designarbeit angenehmer, weil richtig gute Scripts und Editor-Tools komplettes WYSIWYG machen, aner es erlaubt es auch, Teammitglieder zu haben, die nicht coden können und trotzdem Gamedesign machen. Es nimmt die Verantwortung aus den Scripts. Das Kamera-Script hat keine Verantwortung mehr, sich mit dem Aufbau der Szene zu beschäftigen. Gibt es ein Player-Objekt? Gibt es mehrere? Was passiert, wenn es mehrere gibt? Folge ich dann dem erstbesten? Statt das Kamera-Script sich über so etwas Sorgen machen zu lassen, sagst du ihm: "Das wird dir dann schon gesagt, wem du folgen musst". Das sorgt für schlanke Scripts, die einfach nur das machen, was sie machen, und nicht noch Ahnung von lauter anderen Teilen des Projekts haben müssen. Teil 2 ist hier das Wichtige. Wann immer dein Script nach etwas sucht, bedeutet das, dass es ein Mindestmaß an Ahnung haben muss, wie dein Projekt augebaut ist. Dazu gehört zum Beispiel ein bisschen Code, der definiert, was passiert, wenn es mehrere Player gibt, sofern du nicht irgendwie anderweitig sicherstellen kannst, dass es immer nur einen gibt... oder du lässt Unity pseudo-zufällig einen auswählen. Daher ist es immer schlecht, wenn dein Script etwas sucht, sei es nun mit Strings oder anderweitig. Was meiner Meinung nach einen richtigen Unity-Coding-Pro ausmacht ist die Fähigkeit, für jede Situation eine elegante Art zu finden, wie Objekte sich "kennenlernen", ohne dabei Scripts zu erstellen, die mehr von der Welt wissen als das, was sie notwendig für ihre eigene Aufgabe benötigen. Wenn es z.B. darum geht, mit dem Player zu arbeiten, dann gibt es da direkt mehrere Möglichkeiten, die ohne das eigenständige Finden des Player-Objekts auskommen. Die erste Verbesserung wäre ein Pseudo-Singleton, über das ich auch schon einen Artikel habe: http://blog.13pixels.de/2019/unity-and-the-mysterious-singleton/ Wenn man nach Singletons sucht, findet man hin und wieder die Info, dass man die Finger davon lassen sollte. Letztenendes sind die auch nicht das Gelbe vom Ei, aber sie sind schonmal ein Stück besser als das Suchen von Objekten in der Szene. Mein Artikel hat als Konklusion auch, dass man die Dinger ruhig benutzen kann. Es wird etwas heftig, etwas besseres zum Laufen zu kriegen (das was mein "Klick"-Moment letztes Jahr), und bis man soweit ist, kann man ruhig Pseudo-Singletons benutzen.
  23. Die NullReferenceException tritt immer dann auf, wenn eine Variable den Wert null hat (oder ein Ausdruck zu null evaluiert), du aber etwas von dem referenzierten Objekt willst, das es ja nicht gibt. "Etwas vom referenzierten Objekt wollen" bedeutet syntaktisch, dass du den Variablennamen bzw. den Ausdruck hast, gefolgt von einem Punkt. myCar.Drive(); // Hier könne myCar null sein GetCar().Drive(); // Hier könnte GetCar() null zurückgegeben haben GetCar().motor.Start(); // Hier könnte GetCar() null zurückgeben oder motor null sein (In Unity gibt's noch die "MissingReferenceException", die quasi dasselbe ist, und zudem die Eigenschaft von UnityEngine.Objects, wie null behandelt zu werden, obwohl sie existieren.) Wir haben also deine Fehlerzeile: ply = GameObject.Find("Player").GetComponent<Transform>(); Wenn "ply" null wäre, würde hier kein Fehler passieren. null ist ein gültiger Wert und kein Fehler, denn damit beschreibst du den Zustand, dass ein bestimmtes Ding nicht da ist - wenn jemand kein Auto besitzt, keinen Vater hat, oder das Auto keinen Motor. Sind ja alles Sachen, die passieren können, und die werden dann mit null dargestellt. Was aber eben nicht geht, ist dass du den Motor eines Autos anlässt, wenn das Auto gar keinen Motor hat. Deshalb wird bei "irgendwas.blub" die Exception ausgelöst, wenn irgendwas null ist. Bei deiner Zeile hast du folgende Sachen mit Punkt dahinter: GameObject Find("Player") Da GameObject eine Klasse ist und damit kein Ausdruck, der null sein könnte, bleibt nur "Find("Player")". Es wird ganz einfach kein GameObject mit dem Namen "Player" gefunden, und wenn du dann versuchst, von dem nicht gefundenen Objekt eine Komponente zu besorgen, knallt's. Dass das so schwer zu sehen war, ist einer der Gründe, warum ich dringend Empfehle, GameObject.Find oder auch Tags niemals zu benutzen. Macht Fehler einfach immer schwer zu sehen.
  24. Hi, folgendes Script liegt auf den Objekten, welche nach dem Zerstören eines Feindes erstellt werden (also Münzen zum aufsammeln). Ziel des Script ist es, dass diese Münzen sich zum Player bewegen, wenn er eine bestimmte Entfernung zu den Münzen unterschritten hat. Nun kann es natürlich sein, dass in dem Moment, wo diese Münzen per "instantiate" erstellt werden mein Player zerstört wird. Somit habe ich in der Start Function folgendes eingebaut: ply = GameObject.Find("Player").GetComponent <Transform>(); if (ply == null) { Destroy (gameObject); } Trotzdem wird mir manchmal eine Fehlermeldung angezeigt, das eine Referenz (die genaue Meldung liegt mir gerade nicht vor) nicht gefunden wird, und es wird auf die erste Codezeile verwiesen. Liegt das daran, dass ich hier direkt auf die Transform Komponente zugreife (welche ich später für die Bewegung zum Player benötige) und nicht auf das GameObject als solches?.
  25. Hallo ich habe ein Problem bei meinem 3D-Spiel und hoffe, dass mir jemand helfen kann. ->Mein Player fährt über ein Feld und kann durch gameObjekte (3D Texte) gelenkt werden. ->mein Script: Sobald der Player ein Gameobject durchfährt, wird es zerstört und der Name (des 3 D Textes) wird in der Console (Debug. Log.) angezeigt: Wenn collision mit "Player" -> Destroy gameobject Debug. Log (Name. Gameobject) Meine Frage : Ich möchte, dass die Namen der gameObjects nach der Zerstörung auf einer Leinwand im Spiel (canvas- panel -text) angezeigt werden. Vom Prinzip soll der Text der im Moment noch in der Console erscheint, während ich spiele auf einer Leinwand erscheinen. Dabei soll eine Liste der zerstörten Namen entstehen. (Sie sollen sich also nicht ablösen oder einzeln angezeigt werden). Ich hoffe mir kann jemand helfen. Ich komm alleine nicht drauf wie das funktionieren soll Julia
  26. Danke für den Artikel, Sascha. Das ist schon sehr interessant und hilfreich, was da so drin steht. In irgendein Forum Eintrag hattest du ja mal erwähnt, dass es nicht gut ist, mit Tags zu arbeiten, jetzt habe ich verstanden, warum. Wenn ich aber mit FindObjectOfType<> arbeite, dann habe ich auch das Problem, dass er sich irgendein beliebiges heraussucht, wenn mehr als 1. vorhanden ist. Allerdings sucht er sich dann sowohl im Build als auch im Editor das selbe heraus, während das beim FindGameObjectWithTag im Build sich ein anderes heraussucht, als beim Editor. Das habe ich gerade getestet. @malzbie: Was ich meinte: Wenn man mit sowas wie FindGameObjectWithTag oder FindObjectOfType<> arbeitet, dann macht man das ja eig. deswegen, weil man davon ausgeht, dass nur eins davon in der Scene ist. Deswegen wäre es meiner Meinung gut, wenn Unity in den Fall untersucht, ob mehr als eins davon vorhanden ist und wenn das der Fall ist, dann eine Warnung ausgibt. Das macht er ja auch z.B. dann, wenn man mehr als 1. AudioListener in der Scene hat. Man könnte das ja so verhindern, dass sowas passiert. if (GameObject.FindGameObjectsWithTag("Player").Length == 1) player = GameObject.FindGameObjectWithTag("Player"); else Debug.LogWarning("Entweder existiert kein GameObject mit diesen Tag in der Scene, oder es ist mehr als 1. vorhanden"); // Will ich beides nicht, erst recht nicht den 2.Fall
  27. Hi, vielleicht bekomme ich hier ja Hilfe im englischen Forum antwortet leider keiner. Ich habe vor ca einer Woche begonnen ein bisschen C# zu lernen und mache gerade ein Spectrogram mit Hilfe von Youtube was auch alles funktioniert, nur verändere ich mit dem Script auch die Emission Color, die ich auch mit aufnehmen möchte. Wenn ich aber so: "m_Recorder.BindComponent<MeshRenderer>(_gameObjectParent, true);" den ganzen MeshRenderer aufnehme, laggt einfach alles ^^. Ich habe 8 Cubes die sich in der höhe und der Emission Color verändern. Ich habe gefühlt das ganze Internet abgesucht aber kaum was gefunden, und wenn dann gab es keine wirklichen Infos wie man es richtig benutzt. Ich habe dann "EditorCurveBinding" gefunden und das probiert: "EditorCurveBinding binding = EditorCurveBinding.PPtrCurve(_objName, typeof(MeshRenderer), "m_material._EmissionColor");" Es wird jetzt richtig in der Animation angezeigt, aber es wird nicht erkannt, und aufgenommen dementsprechend auch nicht. Ich hoffe irgendjemand kann mir dabei helfen ^^ Hier der "wichtige" Code: public GameObject _gameObjectParent; public AnimationClip Animclip; public bool Record = false; GameObjectRecorder m_Recorder; string _objName; private ParamCube _paramCube; void Start() { _paramCube = GameObject.Find("parametric-cube").GetComponent<ParamCube>(); m_Recorder = new GameObjectRecorder(); _objName = _paramCube._name; EditorCurveBinding binding = EditorCurveBinding.PPtrCurve(_objName, typeof(MeshRenderer), "m_material._EmissionColor"); m_Recorder.root = this._gameObjectParent; m_Recorder.BindComponent<Transform>(_gameObjectParent, true); //m_Recorder.BindComponent<MeshRenderer>(_gameObjectParent, true); m_Recorder.Bind(binding); } void LateUpdate() { if (Animclip == null) return; if (Record) { m_Recorder.TakeSnapshot(Time.deltaTime); } else if (m_Recorder.isRecording) { m_Recorder.SaveToClip(Animclip); m_Recorder.ResetRecording(); } }
  28. Auf lange Sicht ist auch klar die Empfehlung, diese String-Funktionen (GameObject.Find, GameObject.FindGameObjectWithTag, Resources.Load usw) komplett liegen zu lassen. Genau solche Fehler passieren nur bei diesen Funktionen, für die es auch Alternativen gibt. Kleiner Artikel dazu: http://blog.13pixels.de/2019/why-strings-are-not-your-friend/
  1. Load more activity

Announcements

Hy, wir programmieren für dich Apps(Android & iOS):

Weiterleitung zum Entwickler "daubit"



×