Jump to content
Unity Insider Forum
  • Announcements

    • Lars

      Allgemeine Forenregeln   03/13/2017

      Forenregeln Nimm dir bitte einen Moment um die nachfolgenden Regeln durchzulesen. Wenn du diese Regeln akzeptierst und die Registration fortsetzen willst, klick einfach auf den "Mit der Registrierung fortfahren"-Button. Um diese Registration abzubrechen, klick bitte einfach auf den "Zurück" Button deines Browsers. Wir garantieren nicht für die Richtigkeit, Vollständigkeit und Brauchbarkeit der Nachrichten und sind auch nicht dafür verantwortlich. Die Beiträge drücken die Meinung des Autors des Beitrags aus, nicht zwangsläufig das, wofür die Forensoftware steht. Jeder Nutzer, der denkt, dass ein veröffentlichter Beitrag unzulässig bzw. störend ist, ist aufgefordert uns unverzüglich per E-Mail zu kontaktieren. Wir haben das Recht störende Beiträge zu löschen und bemühen uns, das in einem realistischem Zeitraum zu erledigen (sofern wir beschlossen haben, dass die Löschung notwendig ist). Du akzeptierst, durchgehend während der Nutzung dieses Services, dass du dieses Forum nicht dazu missbrauchen wirst, Inhalte zu veröffentlichen, welche bewusst falsch und/oder verleumderisch, ungenau, beleidigend, vulgär, hasserfüllt, belästigend, obszön, sexuell belästigend, bedrohlich, die Privatsphäre einer Person verletzend oder in irgend einer Art und Weise das Gesetz verletzen. Des Weiteren akzeptierst du, dass du keine urheberrechtlich geschützte Inhalte ohne Erlaubnis des Besitzers in diesem Forum veröffentlichst. Mit dem Klick auf den "Mit der Registrierung fortfahren"-Button, akzeptierst du zudem unsere Datenschutzerklärung und stimmst der Speicherung deiner IP-Adresse und personenbezogenen Daten zu, die dafür benötigt werden, um dich im Falle einer rechtswidrigen Tat zurückverfolgen zu können bzw. permanent oder temporär aus dem Forum ausschließen zu können. Es besteht keine Pflicht zur Abgabe der Einwilligung, dies erfolgt alles auf freiwilliger Basis.   Zusatzinformationen Der Forenbetreiber hat das Recht, Nutzer ohne Angabe von Gründen permanent aus dem Forum auszuschließen. Des Weiteren hat er das Recht, Beiträge, Dateianhänge, Umfrage, Blogeinträge, Galleriebilder oder Signaturen ohne Angabe von Gründen zu entfernen. Mit der Registrierung verzichtest du auf alle Rechte an den von dir erstellten Inhalten, bzw. treten diese an das Unity-Insider.de und Unity-Community.de ab. Dies bedeutet im Klartext, dass das Unity-Insider.de und Unity-Community.de frei über deine Texte verfügen kann, sofern diese nicht wiederum die Rechte anderer verletzen. Es besteht weiterhin kein Anspruch von registrierten Nutzern bzw. ehemaligen registrierten Nutzern darauf, dass erstellte Inhalte und/oder die Mitgliedschaft (User) wieder gelöscht werden (Erhaltung der Konsistenz dieses Forums).   Einwilligungserklärung Wenn du mit der Speicherung deiner personenbezogenen Daten sowie den vorstehenden Regeln und Bestimmungen einverstanden bist, kannst du mit einem Klick auf den Mit der Registrierung fortfahren-Button unten fortfahren. Ansonsten drücke bitte Zurück. Stand: 07.03.2011

Sascha

Administrators
  • Content count

    10,178
  • Joined

  • Last visited

  • Days Won

    424

Sascha last won the day on January 17

Sascha had the most liked content!

Community Reputation

2,019 Excellent

1 Follower

About Sascha

  • Rank
    Community Manager
  • Birthday 08/13/1990

Contact Methods

  • Website URL
    http://www.indiepowered.net

Profile Information

  • Gender
    Male
  • Location
    Hamburg
  • Interests
    Programmierung

Recent Profile Visitors

27,065 profile views
  1. Gängige Unity3D Designpatterns (z.B. MVC)

    Das Unity System ist quasi "Entity-Component-System", wobei Unity-Komponenten Komponenten und Systeme in einem sind und nicht klar getrennt wird. Wobei irgendwann 2018 ja "richtiges" ECS kommt. Was Unity macht, was aber kaum jemand merkt, ist Dependency Injection. Der Unity-Editor mit deiner Serialization Engine ist eigentlich eine riesige DI-Maschine. Wenn man das Konzept nicht nur duldet, sondern aktiv nutzt, kommt ziemlich gut lose gekoppelter und modularer Code dabei raus. Um dann noch die berühmt-berüchtigten Unity-Singletons und andere Problemchen zu umgehen, schlage ich vor, einen Blick auf diesen Talk zu werfen.
  2. Per Variabel eine Gameobjekt Variabel ansprechen

    Ja, da bist du schon viel zu weit auf dem Holzweg. Du musst echt ein paar Schritte zurückgehen. Grundsätzlich gilt: Wenn du mehr als zwei Variablen hast, die gleich heißen bis auf eine andere Zahl im Namen, dann hast du schon etwas falsch gemacht. Wenn du Objekte über einen Index finden willst, dann baust du ein Array statt mehrerer Variablen. Falsch: public GameObject object1; public GameObject object2; public GameObject object3; public GameObject object4; Richtig: public GameObject[] objects; Die eckigen Klammern Zeigen an, dass du hier keine Variable definierst, die sich ein GameObject merken kann, sondern eine, die sich ein Array von GameObjects merken kann. Ein Array ist eine Art Liste von gleichartigen Werten. Beim Zählen startet man bei 0. Das erste Element des Arrays ist also nicht das mit der Nummer 1, sondern das mit der Nummer 0. Entsprechend hat das letzte Element bei 4 Elementen nicht die Nummer 4, sondern die Nummer 3 (0, 1, 2 und 3 = vier Elemente). Zugreifen kannst du folgendermaßen: private void Start() { var firstObject = objects[0]; Debug.Log("The first object is " + firstObject.name); } Einfach eine Zahl in die eckigen Klammern hinter dem Variablennamen der Array-Variable packen, schon hast du den Wert des X-ten Elements im Array. Schreiben geht genauso: objects[0] = someGameObject; Du kannst mit "length" abfragen, wie viele Elemente ein Array hat: var count = objects.length; Debug.Log("objects has " + count + " elements"); Wenn du dein Array serialisierst (also z.B. public machst), dann zeigt dir Unity im Inspektor auch ein Array an. das sieht dann so aus: Wie du siehst, kannst du bei "Size" angeben, wieviele Elemente das Array haben soll, und dann stehen darunter entsprechend viele Elemente. Da du jetzt aber zwei Indizes hast statt einem, brauchst du ein mehrdimensionales Array. Da gibt's zwei leicht unterschiedliche Varianten von, die beide erst einmal nicht im Inspektor angezeigt werden können. Aber dafür gibt es Lösungen. Ersteinmal - So definiert man ein multidimensionales Array: public GameObject[,] objects; Mit dem Komma zeigst du an, dass du zwei Indizes statt einem haben willst. Der Zugriff sieht dann so aus: private void Start() { var object00 = objects[0, 0]; var object10 = objects[1, 0]; var object01 = objects[0, 1]; } Statt der Zahlenwerte kannst du (auch bei einem eindimensionalen Array wie oben) jederzeit einfach auch Variablennamen nehmen. Also: public int x; public int y; private void Start() { var theObject = objects[x, y]; Debug.Log("The Name is " + theObject.name); } Und damit haben wir das, was du haben willst - nur eben ohne zusammengesetzte Strings, die einen Variablennamen ergeben sollen. Die Zahlen steckst du stattdessen direkt in die eckigen Klammern und kriegst direkt eine Referenz auf das gewänschte Objekt zurück. Probier das alles erstmal aus. Wenn du dann weitere Fragen hast, stell sie gerne
  3. Per Variabel eine Gameobjekt Variabel ansprechen

    Ich weiß nicht genau, was du da vor hast, aber es sieht GANZ falsch aus. Du willst auf keinen Fall einen String bauen und dann eine Variable finden, die so heißt wie es in dem String steht. Daher die Bitte: Geh mal ein paar Schritte zurück und erzähl mal, was du wirklich vorhast. Was sind das für GameObject-Referenzen und wofür willst du sie benutzen?
  4. Prefrab per Script zu parent oder child machen

    Ah, dein Fehler kommt daher, dass du das Prefab zu ändern versuchst. Also - dein Code versucht das. Im Instantiate-Kontext gibt es halt das Prefab. Das ist ein GameObject, das in den Assets liegt statt in der Szene. Man hat entsprechend all die Eigenschaften und Methoden von GameObjects zur Verfügung. Dann gibt es das, worauf Instantiate eine Referenz zurückgibt - das ist eine Kopie dieses GameObjects, das in der Szene existiert. Das ist das Objekt, das du verändern willst. Mit eventueller Korruption meint Unity hier, dass du versuchst, das Prefab zu ändern. Dieses existiert in den Assets und eine Änderung wäre entsprechend ein Eingriff in die Assets, der mit hoher Sicherheit nicht gewollt ist.
  5. Prefrab per Script zu parent oder child machen

    Das klingt nicht richtig. Dateien werden so oder so nicht beschädigt. Grundsätzlich ist die Antwort immer "ja". Aber du musst aufpassen, nicht in ein XY-Problem zu laufen. Dein Problem ist nicht, dass OnTriggerEnter nicht zu funktionieren scheint - sondern dass OnTrigger Enter einfach nicht das ist, was du benutzen solltest, um dein zugrundeliegendes Problem zu lösen: Dass du Prefabs instanziieren willst und die Instanzen aneinander packen willst. Erst einmal hat Instantiate einen Rückgabewert - die Referenz auf das neu gespawnte Objekt. Statt Instantiate(myPrefab); schreibst du also var myInstance = Instantiate(myPrefab); und kannst mit myInstance machen, was du willst. Der Typ von myInstance entspricht dabei dem von myPrefab. Ist myPrefab eine Variable vom Typ GameObject, dann ist myInstance auch eine. Parenting geht zwar auch direkt über Parameter der Instantiate-Funktion, aber wenn man es ausschreibt, ist es vielleicht leichter ersichtlich, was passiert: var myTorso = Instantiate(torsoPrefab); var myLegs = Instantiate(legPrefab); myLegs.transform.parent = myTorso.transform; // Beine dem Torso unterordnen Jetzt würde ich den Torso-Prefab einfach so bauen, dass dessen Nullpunkt da liegt, wo auch der Nullpunkt der Beine liegen soll. Dann musst du nur noch die Beine zum Torso verschieben, sodass die Nullpunkte aufeinander liegen. Da myLegs schon myTorso untergeordnet sind, musst du dafür nur die lokale Position (also die relativ zum Parent, dem Torso) auf 0, 0, 0 setzen: myLegs.transform.localPosition = Vector3.zero; Um jetzt den Kopf am Torso anzubringen, wäre eventuell ein Kind-Objekt beim Torso sinnvoll. Dieses macht nichts besonderes außer da zu sein, wo der Kopf hin soll. Du packst dann in jedes Torso-Prefab so ein Objekt rein und holst es dir nach dem instanziieren: var neckPosition = myTorso.transform.Find("Neck Object"); Ich würde generell von Transform.Find eher abraten, aber aktuell ist es schön einfach damit, das ganze erstmal zum Laufen zu kriegen. "Neck Object" (ohne Anführungszeichen) ist dabei der Name des Kind-Objekts des Torsos. Jetzt noch den Kopf spawnen und es dem Hals unterordnen: var myHead = Instantiate(headPrefab); myHead.transform.parent = neckPosition; myHead.transform.localPosition = Vector3.zero; Fertig! Da gibt's noch ein paar Sachen, die man auf lange Sicht verbessern könnte, aber jetzt funktioniert das schon einmal ganz ohne Collider.
  6. Unity 2017

    Genau das, was man erwartet: Kein Compiler mehr dafür. Der Support wird komplett eingestellt. https://blogs.unity3d.com/2017/08/11/unityscripts-long-ride-off-into-the-sunset/
  7. Unity 2017

    Au weia, wo hast'n die uralten Infos her? Die Engine ist in vollem Umfang in allen Versionen vorhanden, und der Editor hat nur wenige Einschränkungen. Pro hat den dunklen Skin und dass du das "Made with Unity" am Anfang wegnehmen kannst. Ansonsten hat Pro noch Meta-Features wie Premium Support und eben dass du die Pro kaufen musst wenn du soundsoviel Geld gemacht hast im letzten Jahr. Ansonsten ist Unity seit v2017 halt vom System mit den Aufsteigenden Nummern weg. Unity 2017 ist halt irgendwo über Unity 5, aber da hört's auch schon auf vergleichbar zu sein. Der Grund für die Umstellung ist das Bezahlsystem. Bis inkl. Unity 5 hast du halt eine Pro-Lizenz für die aktuelle Version (also 5) kaufen können, jetzt gibt's eben nur noch "Unity Pro" (ohne Nummer) so lange wie du es bezahlst. Die Versionen sagen jetzt nur noch aus, wann sie rausgekommen sind, nicht zu welchem Zyklus sie gehören. Was die Kompatibilität von Assets angeht... da hab ich das Gefühl, dass die Asset Store-Leute das nicht gründlich gemacht haben. Der Wechsel von Unity 3 auf 4, oder 4 auf 5 war jedes Mal damit verbunden, dass sich einiges für Entwickler geändert hat. Assets mussten beim Update angepasst werden und so. Bei 5 zu 2017 war das nicht so. Und 2017 zu 2018 wird auch nicht unbedingt so sein. Diese großen Änderungen passieren jetzt gefühlt nicht mehr mit der großen Nummer, sondern so beiläufig. Beim Asset Store kam das aber nicht so richtig an, sodass das immer so problematisch aussieht wenn etwas für Unity 5 gemacht wurde. Demnächst wird ja UnityScript komplett abgeschafft. Da werden einige Assets kaputt gehen. Aber bis dahin wird wohl alles was mit Unity 5 läuft auch in der aktuellen Version laufen. Im Zweifelsfall lad's dir halt runter und probier's aus.
  8. axis x y z movement stoppen

    Du könntest direkt die Rigidbody.velocity ändern.
  9. Rakete abfeuern

    Kann es sein, dass dein Objekt sehr schnell ist? Schnelle Dinge sollte man nicht unbedingt mit Rigidbodys machen. Die können nämlich erst einmal nicht ihren Weg checken, sondern teleportieren sich in festen Zeitschritten immer ein Stück weiter. Der Zeitschritt ist die FixedUpdate-Zeit, also standardmäßig 0.02 Sekunden. Wenn dein Objekt jetzt sehr schnell ist, sagen wir... 50m/s (180km/h), dann bewegt es sich dafür alle 0.02 Sekunden genau einen Meter weit. 50 Mal pro Sekunde je einen Meter = 50m/s. Wenn dein Objekt jetzt noch dazu im Vergleich nicht besonders groß ist - sagen wir 20cm lang, dann teleportiert sich dein 20cm-Objekt pro FixedUpdate einen Meter weiter und "überspringt" dabei 80cm. wenn innerhalb dieser 80cm ein Hindernis liegt, dann findet keine Kollision statt. Wenn etwas so schnell ist, sollte man einfach pberlegen, stattdessen das Projektil mit einem Raycast zu abstrahieren.
  10. Wenn das Gameplay deterministisch simuliert werden soll, immer FixedUpdate dafür nehmen. Aber ja, für Input braucht man Update, deshalb muss man die Input-Daten in Update sammeln und in FixedUpdate auslesen.
  11. WebClient() und 404 Fehler

    Liegt offenbar auf jeden Fall an deinem Server, nicht an deinem Aufruf aus Unity. Und dazu kann man jetzt schwer was sagen.
  12. Das Jahr ist fast rum...

    Schön gesagt, ihr beiden. Guten Rutsch euch allen und auf ein angenehmes Jahr 2018!
  13. Raycast geht durch Wände

    Alles, was du jetzt geändert hast ist, dass dein Raycast horizontal ist. Sicher, dass es das ist, was du willst? Jedenfalls... Nicht mehr hieße, du führst es aus, wenn der Raycast den Spieler eben noch getroffen hat und jetzt eben... nicht mehr. Das heißt, dass du dir bis zum nächsten Raycast merken musst, ob du eben gerade getroffen hast: private bool lastRaycastDidHit; private void Update() { if(Raycast( ... )) { if(!lastRaycastDidHit) { // gerade fRisch getroffen, verfolgung aufnehmen! } lastRaycastDidHit = true; } else // wenn nicht getroffen { if(lastRaycastDidHit) { // eben hab ich ihn noch gesehen... } lastRaycastDidHit = false; } }
  14. Rotieren mit Grade.

    Öh... geht auch einfacher. if(Input.GetKeyDown(KeyCode.D)) { transform.rotation = Quaternion.Euler(0, 0, 90); } Da kann man dann auch localRotation nutzen, wenn man das will.
  15. Raycast geht durch Wände

    Kannst dir ja mal ausgeben lassen, was er immer stattdessen trifft.
×