Sicherheitsinformationsportal. Wir schreiben Arkanoid auf Unity

Antipyretika für Kinder werden von einem Kinderarzt verschrieben. Aber es gibt Notfallsituationen für Fieber, wenn das Kind sofort Medikamente erhalten muss. Dann übernehmen die Eltern die Verantwortung und nehmen fiebersenkende Medikamente. Was darf Säuglingen gegeben werden? Wie kann man bei älteren Kindern die Temperatur senken? Welche Medikamente sind am sichersten?

Einheit- sehr starker, progressiver Motor mit großem Potenzial. Es hat viele bereits eingebaute Funktionen (einschließlich einer Physik-Engine Nvidia PhysX), die wir als Nutzer nicht manuell registrieren müssen. :)
In diesem kurzen Artikel möchte ich auf die physikalischen Fähigkeiten des Motors eingehen. Fangen wir also an:

Starrer Körper

Was ist das?

Hinter der Funktion Starrer Körper Absolut starren Körper verstecken ( ATT). Wenn Sie es grob und deutlich erklären, dann ATT in Physik und Mechanik ist es ein idealer starrer Körper, der unter dem Einfluss einer Kraft seine Eigenschaften nicht ändern kann, sich aber (unter ihrem Einfluss) in 3 Dimensionen (nach unten, oben, vorne usw.) bewegen kann, dh in unseren X-Y-Z-Achsen ) sowie in 3 Dimensionen drehen (wiederum entlang der X-Y-Z-Achsen).

BEI Einheit, wie in anderen Spiel-Engines (wieder nenne ich sie grob "Spiel"-Engines), Starrer Körper Wird für verschiedene Objekte verwendet, mit denen wir durch Drücken, Treten usw. interagieren können. Solche Objekte unter unserem Einfluss werden weiterhin rollen, sich bewegen und mit anderen Objekten unter dem Einfluss der Schwerkraft kollidieren.

Welche Anwendung können wir für diese Funktion finden?

Zum Beispiel, um zusätzlich ein Auto zu erstellen Starrer Körper wir brauchen 4-Rad-Collider"und und der Code (Skript) , die je nach gedrückter Taste Kraft auf die Räder ausübt.

Konfigurierbare Funktionen

  • Masse- Masse unseres Objekts in Kilogramm. Es wird empfohlen, Massenwerte nicht 100-mal größer oder kleiner als die Massen anderer einzustellen ATT.
  • Ziehen- Wie viel Luftwiderstand einem Körper ausgesetzt ist, wenn er sich unter dem Einfluss von Kräften bewegt. Mit Wert 0 es gibt keinen Widerstand und ein unendlicher Wert wird unser Objekt sofort stoppen.
  • Winkelwiderstand- Wie stark der Körper einem Luftwiderstand ausgesetzt ist, wenn er sich unter dem Einfluss von Kräften dreht. Mit Wert 0 Es gibt keinen Widerstand und ein unendlicher Wert stoppt sofort die Drehung unseres Objekts.
  • Schwere- Wenn eingeschaltet, wird das Objekt von der Schwerkraft beeinflusst.
  • ist kinematisch- Wenn aktiviert, wird das Objekt von der Physik-Engine nicht beeinflusst und kann nur durch seine Funktion modifiziert werden Verwandeln. Dies kann beispielsweise beim Erstellen von beweglichen Plattformen nützlich sein.
  • Interpolieren- Gilt nur, wenn Ihnen die Bewegungen Ihres ATT seltsam oder ungeschickt vorkommen etc.:
    1. Keiner: Interpolation nicht angewendet
    2. interpolieren: Im Vergleich zur Transformation des vorherigen Frames ( rahmen) , der nächste wird geglättet.
    3. extrapolieren: Die Transformation des aktuellen Rahmens wird im Vergleich zur geschätzten (ungefähren) Transformation des nächsten geglättet.
  • Rotation einfrieren- Deaktiviert jede Rotation, sowohl geskriptet als auch Kollision. Die Drehung kann jedoch durch die Funktion durchgeführt werden transform.Rotate()
  • Kollisionserkennung- Wird verwendet, um zu verhindern, dass sich schnell bewegende Objekte andere Objekte passieren, ohne sie zu finden Kollision"ov" (ein spezielles "Gitter" auf Objekten, die sie miteinander und mit dem Spieler kollidieren).
    1. diskret: Der Standardwert für unser Objekt, um alle anderen Objekte zu "bemerken", mit denen es möglicherweise kollidiert.
    2. Kontinuierlich: Verwenden Diskrete Kollision mit dynamischen Kollisionsobjekten (die ATT), a Kontinuierliche Kollision für statisch MeshCollider"ov (ohne ATT). Modus Kontinuierliche Dynamik Verwendet Kontinuierliche Kollision für eine bestimmte ATT. Sich ausruhen ATT wird den Modus verwenden Diskret. (Dies wirkt sich stark auf die Belastung der Physik-Engine aus, lassen Sie es einfach Diskret, wenn es keine Probleme mit der Kollision schneller Objekte gibt)
    3. Kontinuierliche Dynamik: Wird für Objekte im Modus verwendet kontinuierlich oder Kontinuierliche dynamische Kollision. Kontinuierliche Kollision wird auch für Statik verwendet MeshCollider"ov (ohne ATT). Für alle anderen wird der Modus verwendet Diskret. Wird für sich schnell bewegende Objekte verwendet.

Wie können wir diese Funktion nutzen?

Grundwissen.

Benutzen ATT, benötigen wir ein bereits erstelltes Spielobjekt ( GameObject), indem wir darauf klicken, gehen wir über den folgenden Pfad zum Menü: Komponenten - Physik - Starrer Körper . Alle, ATT hinzugefügt! :)
Jetzt unterliegt das Objekt der Schwerkraft, Sie können mithilfe von Skripten Kräfte darauf anwenden, aber damit sich das Objekt genau so verhält, wie Sie es benötigen, sollten Sie hinzufügen Collider oder gemeinsam.

Code regiert die Welt.

Im Skript werden wir nun unser Objekt mithilfe von Funktionen manipulieren AddForce() und AddTorque() .
Seit ich dabei bin Einheit anwenden JavaScript, meine Beispiele werden dabei sein, Links zu anderen Scripting-Beispielen (at C# oder Buh) finden Sie weiter unten im Absatz Weitere Informationen zu ATT.

» Rigidbody.AddForce

// Rigidbody.AddForce verwendet 2 Arten von Formeln, wie viele andere Funktionen, die sich auf Bewegungen im Raum beziehen. // 1 type: function AddForce (force: Vector3, mode: ForceMode = ForceMode.Force) : void // Die Kraft, die das Objekt relativ zum globalen Koordinatensystem nach oben drückt. function FixedUpdate () ( rigidbody.AddForce (Vector3.up * 10); ) // Verwenden von Vector3, einer integrierten Unity-Funktion, die im Grunde mit dem Standardkoordinatensystem identisch ist. // 2. Typ: function AddForce (x: float, y: float, z: float, mode: ForceMode = ForceMode.Force) : void // Gleich, aber hier verwendet X-Y-Z-System Koordinaten. Funktion FixedUpdate() ( rigidbody.AddForce(0, 10, 0); )

» Rigidbody.AddTorque

// Die Funktion dreht das Objekt um die angegebene Achse. // 1 type: function AddTorque (torque: Vector3, mode: ForceMode = ForceMode.Force) : void // Dreht den ATT um die globale Y-Achse function FixedUpdate () ( rigidbody.AddTorque (Vector3.up * 10); ) // Typ 2: Funktion AddTorque (x: Float, y: Float, z: Float, Modus: ForceMode = ForceMode.Force) : void // Macht dasselbe, aber wieder in einem anderen Messsystem. Funktion FixedUpdate() ( rigidbody.AddTorque(0, 10, 0); )

ATT interagiert mit Objekten.

Für den korrekten Betrieb unserer ATT sie müssen versorgt werden Collider"Ami (bzw Kollision"ami, wie du willst ^.^).
Lesen Sie weiter unten mehr über Collider.

Die Größe ist wichtig!

Beachten Sie die Abmessungen Ihres Objekts, denn sie sind viel wichtiger als die Masse ATT. Wenn sich Ihr Objekt falsch bewegt, in der Luft schwebt oder nicht kollidiert, versuchen Sie, seine Größe anzupassen (nicht ATT, sondern das Objekt selbst). Beim Importieren eines Modells aus dem 3D-Editor bleiben seine Abmessungen erhalten, seien Sie also während der Modellierungsphase vorsichtig und respektieren Sie die Abmessungen aller Modelle.

Weitere Informationen zu ATT

Beschreiben Sie dazu ATT oder Starrer Körper Ich werde wahrscheinlich fertig. Es gibt jedoch ein paar Tipps, besonders für diejenigen, die bis hierher gelesen haben :)

  1. Standard-Würfelgröße Einheit gleich 1 Meter, daher ist es sehr praktisch, die Größe Ihrer Modelle damit zu überprüfen. Um einen Würfel zu erstellen, wählen Sie aus dem Menü aus GameObject - Andere erstellen - Würfel
  2. Relativer Indikator Masse definiert, wie zwei Objekte miteinander interagieren.
  3. Masse hat keinen Einfluss auf die Fallgeschwindigkeit aus großer Höhe, für diese Zwecke verwenden Ziehen.
  4. Je höher die Werte Ziehen je mehr das Objekt wiegt. Standardwerte variieren ab 0,001(massives Stück Metall) bis 10(Feder).
  5. Wenn Sie ein Objekt sowohl mit Skripten als auch mit Physik ändern müssen, fügen Sie es hinzu ATT mit Parameter Kinematisch.

Collider

Was ist das?

Im vorherigen Abschnitt haben wir besprochen, wie Starrer Körper und erwähnte die sog Collider. Collider für uns - ein Hilfsobjekt in Form eines Gitters eines einfachen Primitivs oder umgekehrt einer komplexen Form, das sich um unser Modell oder einen Teil des Modells herum befindet und mit anderen Objekten interagiert, wenn sie ebenfalls von Collidern umgeben sind.
Um es den Experten des *Warcraft 3*-Welteditors klar zu erklären, stellen Sie sich das Modell vor, das wir importiert haben, dem wir im Dudad-Editor keine Pfadtexturen zugewiesen haben - das wird unser Objekt sein; und die Rolle von Collidern wird hier von Blockern des Weges um das Modell herum gespielt. Das ist natürlich ein ziemlich grober Vergleich, denn in Einheit sie sind viel funktionaler. Nun, lass uns einen genaueren Blick darauf werfen.

Arten von Collidern.

Collider werden über das Menü hinzugefügt Komponente - Physik . Es gibt mehrere Arten:

  • Box-Collider- in Form eines Würfels.
  • Sphäre Collider- in Form einer Kugel.
  • Kapsel Collider- in Form einer Kapsel.
  • Mesh-Collider- Erstellt automatisch einen Collider entsprechend der Form des Objektgitters, kann nicht mit anderen Collidern des gleichen Typs kollidieren. Wird hauptsächlich für statische Objekte verwendet, z. B. die Umgebung einer Rennstrecke.
  • Rad-Collider- verwendet für Räder, eine sehr nützliche Sache.
  • Zusammengesetzter Collider- Kombinationen von Primitiven, die zusammen als Einheit agieren. Um einen solch komplexen Collider zu erstellen, müssen Sie unserem Basis-Collider untergeordnete Objekte hinzufügen und bereits per Primitiv an sie binden. So lassen sich beispielsweise einfache Collider für Autos sehr bequem herstellen.

Konfigurierbare Funktionen

Im Prinzip sind alle Collider einander ähnlich, sie werden nur für Objekte unterschiedlicher Form verwendet, haben jedoch mehrere unterschiedliche Parameter.

  • Würfel
    • Material- Zeigt, wie der Collider mit anderen Objekten interagiert, während ein physisches Material wie Metall, Eis usw. zugewiesen wird.
    • Trigger ist- Wenn der Parameter aktiviert ist, wird das Objekt vom Skript beeinflusst, nicht die Physik.
    • Größe- Die Größe des Colliders entlang der X-Y-Z-Achse.
    • Center- Die Position des Colliders, relativ zu den lokalen Koordinaten des Objekts.
  • Kugel
    • Radius- Der Radius der Kugel ersetzt den Parameter Größe.
    • Die restlichen Parameter bleiben unverändert.
  • Kapsel(Parameter ersetzen Größe)
    • Radius- Die Dicke der Kapsel.
    • Höhe- Die Höhe des zylindrischen Teils des Colliders (ohne abgerundete Basen).
    • Richtung- Die Richtung des Colliders, relativ zu den lokalen Koordinaten des Objekts.
  • Mesh-Collider(Parameter ersetzen Größe)
    • Gittergewebe- Auswählen des gewünschten Netzes zum Erstellen eines Colliders.
    • Reibungslose Sphärenkollisionen - Die Aktivierung dieser Funktion glättet die Oberfläche des Colliders. Es sollte auf glatten Oberflächen verwendet werden, zum Beispiel abschüssigem Gelände ohne zu viel Winkligkeit, auf dem die Kugeln rollen sollen.
    • Konvex- Wenn aktiviert, kann unser Collider mit anderen Collidern kollidieren. Konvexer Mesh-Collider„beschränkt auf 255 Dreiecke.
  • Rad-Collider(Parameter ersetzen Größe)
  • Radius- Radradius.
  • Aufhängungsabstand- Maximaler Abstand zur Erhöhung der Radaufhängung. Die Federung nimmt immer entlang der lokalen Achse zu Y.
  • Aufhängungsfeder- Die Aufhängung versucht mit unterschiedlichen Kräften den vorgegebenen Punkt zu erreichen.
  1. Spring:// Versucht den angegebenen Punkt (Position) zu erreichen. Je höher die Einstellung, desto schneller wird sie erreicht.
  2. Damper:// Weicht ab, verlangsamt die Geschwindigkeit der Federung. Je höher der Wert, desto langsamer bewegt sich der Dämpfer.
  3. Target Position:// Der vollständige "Weg", den die Aufhängung "fahren" kann. 0 bedeutet einen vollständig ausgefahrenen Stoßdämpfer, und 1 - vollständig komprimiert. Der Standardwert ist 0, was einer normalen Autofederung entspricht.
  • Masse- Masse des Rades.
  • Vorwärts-/Seitwärtsreibung - Reibungsparameter für einfaches Rollen des Rads und für seitliches Rollen (dies passiert beim Schleudern oder Driften).


Gefällt mir +15 - 0

*Unity* ist eine sehr leistungsstarke, progressive Engine mit viel Potenzial. Es hat viele eingebaute Funktionen (einschließlich der *NvidiaPhysX*-Physik-Engine), die wir, die Benutzer, nicht manuell vorschreiben müssen. :)
In diesem kurzen Artikel möchte ich auf die physikalischen Fähigkeiten des Motors eingehen. Fangen wir also an:

Starrer Körper
=
= Was ist das? =
Hinter der Funktion *Rigidbody* verbirgt sich ein absolut starrer Körper (*ATT*). Grob und anschaulich erklärt ist *ATT* in Physik und Mechanik ein idealer starrer Körper, der unter dem Einfluss einer Kraft seine Eigenschaften nicht ändern kann, sich aber (unter ihrem Einfluss) in 3 Dimensionen (abwärts, aufwärts, vorwärts, usw.) usw., d.h. in unseren X-Y-Z-Achsen), sowie in 3 Dimensionen drehen (wiederum entlang der X-Y-Z-Achsen).

In *Unity* sowie in anderen Spiel-Engines (wieder nenne ich sie ungefähr "Spiel"-Engines) wird *Rigidbody* für verschiedene Objekte verwendet, mit denen wir durch Drücken, Treten usw. interagieren können. Solche Objekte unter unserem Einfluss werden weiterhin rollen, sich bewegen und mit anderen Objekten unter dem Einfluss der Schwerkraft kollidieren.

Welche Anwendung können wir für diese Funktion finden? =
Um beispielsweise ein Auto zu erstellen, benötigen wir zusätzlich zu *Rigidbody* 4-Rad-Collider"a und *code* (*script*), der Kraft auf die Räder ausübt, abhängig von den gedrückten Tasten.

  • *Masse* - Die Masse unseres Objekts in Kilogramm. Es wird empfohlen, Massenwerte nicht 100-mal größer oder kleiner als die Massen anderer *ATT* einzustellen.
  • *Widerstand* - Wie stark der Körper dem Luftwiderstand ausgesetzt ist, wenn er sich unter dem Einfluss von Kräften bewegt. Bei einem Wert von *0* gibt es keinen Widerstand, und ein unendlicher Wert stoppt unser Objekt sofort.
  • Winkelwiderstand- Wie stark der Körper einem Luftwiderstand ausgesetzt ist, wenn er sich unter dem Einfluss von Kräften dreht. Bei einem Wert von *0* gibt es keinen Widerstand, und ein unendlicher Wert stoppt sofort die Drehung unseres Objekts.
  • Schwere- Wenn eingeschaltet, wird das Objekt von der Schwerkraft beeinflusst.
  • ist kinematisch- Wenn aktiviert, wird das Objekt von der Physik-Engine nicht beeinflusst und kann nur durch seine *Transform*-Funktion modifiziert werden. Dies kann beispielsweise beim Erstellen von beweglichen Plattformen nützlich sein.
  • *Interpolieren* - Gilt nur, wenn Ihnen Ihre ATT-Bewegungen seltsam oder ungeschickt vorkommen usw.:
  1. Keiner: Interpolation nicht angewendet
  2. interpolieren: Im Vergleich zur Transformation des vorherigen Frames (*Frame*) wird der nächste geglättet.
  3. extrapolieren: Die Transformation des aktuellen Rahmens wird im Vergleich zur geschätzten (ungefähren) Transformation des nächsten geglättet.
  • Rotation einfrieren- Deaktiviert jede Rotation, sowohl geskriptet als auch Kollision. Die Rotation kann jedoch durch die Funktion // ausgeführt werden transform.Rotate()
  • Kollisionserkennung- Wird verwendet, um zu verhindern, dass sich schnell bewegende Objekte andere Objekte passieren, ohne sie zu finden Kollision"ov" (ein spezielles "Gitter" auf Objekten, die sie miteinander und mit dem Spieler kollidieren).
  1. diskret: Der Standardwert für unser Objekt, um alle anderen Objekte zu "bemerken", mit denen es möglicherweise kollidiert.
  2. Kontinuierlich: Verwenden Diskrete Kollision mit dynamischen Kollisionsobjekten (die *ATT* haben) und Kontinuierliche Kollision für statisch MeshCollider"s (ohne *ATT*). Modus Kontinuierliche Dynamik Verwendet Kontinuierliche Kollision für ein bestimmtes *ATT*. Der Rest *ATT* verwendet den _Discrete_-Modus. (Dies wirkt sich stark auf die Belastung der Physik-Engine aus, lassen Sie einfach _Discrete_, wenn es keine Probleme mit der Kollision schneller Objekte gibt.)
  3. Kontinuierliche Dynamik: Wird für Objekte im _Continuous_-Modus oder verwendet Kontinuierliche dynamische Kollision. Kontinuierliche Kollision wird auch für Statik verwendet MeshCollider"s (ohne * ATT *). Für alle anderen wird der Modus _Discrete_ verwendet. Wird für sich schnell bewegende Objekte verwendet.

Wie können wir diese Funktion nutzen? =
= Grundkenntnisse.
Um *ATT* zu verwenden, benötigen wir ein bereits erstelltes Spielobjekt (*GameObject*), indem wir darauf klicken, gehen wir über den folgenden Pfad zum Menü: Komponenten - Physik - Starrer Körper . Das war's, *ATT* hinzugefügt! :)
Jetzt unterliegt das Objekt der Schwerkraft, Sie können mithilfe von Skripten Kräfte darauf anwenden, aber damit sich das Objekt genau so verhält, wie Sie es benötigen, sollten Sie *Collider* oder *Joint* hinzufügen.

Code regiert die Welt.
Im Skript werden wir nun unser Objekt mithilfe von Funktionen manipulieren AddForce() und AddTorque() .
Da ich *JavaScript* in *Unity* verwende, werden meine Beispiele dabei sein, Links zu anderen Scripting-Beispielen (auf C# oder *Boo*) finden Sie weiter unten im Absatz Weitere Informationen zu ATT.

Rigidbody.AddForce

// Rigidbody.AddForce verwendet 2 Arten von Formeln, wie viele andere Funktionen, die sich auf Bewegungen im Raum beziehen. // 1 type: function AddForce (force: Vector3, mode: ForceMode = ForceMode.Force) : void // Die Kraft, die das Objekt relativ zum globalen Koordinatensystem nach oben drückt. function FixedUpdate () ( rigidbody.AddForce (Vector3.up * 10); ) // Verwenden von Vector3, einer integrierten Unity-Funktion, die im Grunde mit dem Standardkoordinatensystem identisch ist. // 2. Typ: function AddForce (x: float, y: float, z: float, mode: ForceMode = ForceMode.Force) : void // Das Gleiche, aber hier wird das X-Y-Z-Koordinatensystem verwendet. Funktion FixedUpdate() ( rigidbody.AddForce(0, 10, 0); )

Rigidbody.AddTorque

// Die Funktion dreht das Objekt um die angegebene Achse. // 1 type: function AddTorque (torque: Vector3, mode: ForceMode = ForceMode.Force) : void // Dreht den ATT um die globale Y-Achse function FixedUpdate () ( rigidbody.AddTorque (Vector3.up * 10); ) // Typ 2: Funktion AddTorque (x: Float, y: Float, z: Float, Modus: ForceMode = ForceMode.Force) : void // Macht dasselbe, aber wieder in einem anderen Messsystem. Funktion FixedUpdate() ( rigidbody.AddTorque(0, 10, 0); )

ATT interagiert mit Objekten.
Für den korrekten Betrieb unseres *ATT* müssen diese mit versorgt werden Collider"Ami (bzw Kollision"ami, wie du willst ^.^).
Lesen Sie weiter unten mehr über Collider.


Die Größe ist wichtig!
Beachten Sie die Abmessungen Ihres Objekts, denn sie sind viel bedeutender als sogar *ATT*-Massen. Wenn sich Ihr Objekt falsch bewegt, in der Luft schwebt oder nicht kollidiert, versuchen Sie, seine Größe anzupassen (nicht *ATT*, sondern das Objekt selbst). Beim Importieren eines Modells aus dem 3D-Editor bleiben seine Abmessungen erhalten, seien Sie also während der Modellierungsphase vorsichtig und respektieren Sie die Abmessungen aller Modelle.

Weitere Informationen zu ATT =
Mit der Beschreibung von *ATT* oder *Rigidbody* werde ich vielleicht abschließen. Es gibt jedoch ein paar Tipps, besonders für diejenigen, die bis hierher gelesen haben :)

  1. Die Standardwürfelgröße in *Unity* ist 1 Meter, daher ist es sehr praktisch, die Größe Ihrer Modelle damit zu überprüfen. Um einen Würfel zu erstellen, wählen Sie aus dem Menü aus GameObject - Andere erstellen - Würfel
  2. Der relative Exponent *Masse* bestimmt, wie zwei Objekte miteinander interagieren.
  3. *Masse* wirkt sich nicht auf die Fallgeschwindigkeit aus großer Höhe aus, verwenden Sie zu diesem Zweck *Drag*.
  4. Je höher die *Drag*-Werte, desto mehr wiegt der Artikel. Standardwerte variieren ab 0,001(massives Stück Metall) bis 10(Feder).
  5. Wenn Sie ein Objekt sowohl mithilfe von Skripten als auch mithilfe von Physik ändern müssen, fügen Sie *ATT* mit dem Parameter *Kinematic* hinzu.

Unter den folgenden Links können Sie geskriptete Beispiele für die Auswirkungen externer Kräfte auf ein Objekt mit der *ATT*-Funktion anzeigen:
*Kraft hinzufügen*
*Drehmoment hinzufügen*

Um das Skriptbeispiel zu ändern, klicken Sie auf den Text mit dem Namen der Programmiersprache!

Collider
=
= Was ist das? =
Im vorherigen Abschnitt haben wir uns die Funktionsweise von *Rigidbody* angesehen und die sogenannten *Collider* erwähnt. * Collider * ist für uns ein Hilfsobjekt in Form eines Gitters aus einem einfachen Primitiv oder umgekehrt einer komplexen Form, das sich um unser Modell oder einen Teil des Modells herum befindet und mit anderen Objekten interagiert, wenn sie ebenfalls von Collidern umgeben sind .
Um es den Experten des *Warcraft 3*-Welteditors klar zu erklären, stellen Sie sich das Modell vor, das wir importiert haben, dem wir im Dudad-Editor keine Pfadtexturen zugewiesen haben - das wird unser Objekt sein; und die Rolle von Collidern wird hier von Blockern des Weges um das Modell herum gespielt. Dies ist natürlich ein ziemlich grober Vergleich, da sie in *Unity* viel funktionaler sind. Nun, lass uns einen genaueren Blick darauf werfen.

Arten von Collidern. =
Collider werden über das Menü hinzugefügt Komponente - Physik . Es gibt mehrere Arten:

  • Box-Collider- in Form eines Würfels.
  • Sphäre Collider- in Form einer Kugel.
  • Kapsel Collider- in Form einer Kapsel.
  • Mesh-Collider- Erstellt automatisch einen Collider entsprechend der Form des Objektgitters, kann nicht mit anderen Collidern des gleichen Typs kollidieren. Wird hauptsächlich für statische Objekte verwendet, z. B. die Umgebung einer Rennstrecke.
  • Rad-Collider- verwendet für Räder, eine sehr nützliche Sache.
  • Zusammengesetzter Collider- Kombinationen von Primitiven, die zusammen als Einheit agieren. Um einen solch komplexen Collider zu erstellen, müssen Sie unserem Basis-Collider untergeordnete Objekte hinzufügen und bereits per Primitiv an sie binden. So lassen sich beispielsweise einfache Collider für Autos sehr bequem herstellen.


Benutzerdefinierte Spezifikationen =
Im Prinzip sind alle Collider einander ähnlich, sie werden nur für Objekte unterschiedlicher Form verwendet, haben jedoch mehrere unterschiedliche Parameter.

  • *Würfel*

* *Material* - Zeigt, wie der Collider mit anderen Objekten interagiert, während ein physisches Material wie Metall, Eis usw. zugewiesen wird.
* Trigger ist- Wenn der Parameter aktiviert ist, wird das Objekt vom Skript beeinflusst, nicht die Physik.
* *Größe* - Die Größe des Colliders entlang der X-Y-Z-Achse.
* *Center* - Die Position des Colliders, relativ zu den lokalen Koordinaten des Objekts.

  • *Kugel*

* *Radius* - Der Radius der Kugel ersetzt den Parameter *Größe*.
* Andere Parameter unverändert.

  • *Kapsel* (Parameter ersetzen Größe)

* *Radius* - Kapseldicke.
* *Höhe* - Die Höhe des zylindrischen Teils des Colliders (ohne abgerundete Basen).
* *Richtung* - Die Richtung des Colliders, relativ zu den lokalen Koordinaten des Objekts.


  • Mesh-Collider(Parameter ersetzen Größe)

* *Mesh* - Wählen Sie das gewünschte Mesh aus, um den Collider zu erstellen.
* Reibungslose Sphärenkollisionen - Die Aktivierung dieser Funktion glättet die Oberfläche des Colliders. Es sollte auf glatten Oberflächen verwendet werden, zum Beispiel abschüssigem Gelände ohne zu viel Winkligkeit, auf dem die Kugeln rollen sollen.
* *Konvex* - Wenn aktiviert, kann unser Collider mit anderen Collidern kollidieren. Konvexer Mesh-Collider„beschränkt auf 255 Dreiecke.

  • Rad-Collider(Parameter ersetzen Größe)

* *Radius* - Radradius.
* Aufhängungsabstand- Maximaler Abstand zur Erhöhung der Radaufhängung. Die Aufhängung nimmt immer entlang der lokalen *Y*-Achse zu.
* Aufhängungsfeder- Die Aufhängung versucht mit unterschiedlichen Kräften den vorgegebenen Punkt zu erreichen.

  1. Feder: Versucht den angegebenen Punkt (Position) zu erreichen. Je höher die Einstellung, desto schneller wird sie erreicht.
  2. Dämpfer: Erweicht, verlangsamt die Geschwindigkeit der Federung. Je höher der Wert, desto langsamer bewegt sich der Dämpfer.
  3. Zielposition: Der gesamte "Weg", den die Aufhängung "fahren" kann. *0* bedeutet vollständig ausgedehnt und *1* vollständig komprimiert. Der Standardwert ist 0, was einer normalen Autofederung entspricht.

* *Masse* - Masse des Rades.
* Vorwärts-/Seitwärtsreibung - Reibungsparameter für einfaches Rollen des Rads und für seitliches Rollen (dies passiert beim Schleudern oder Driften).

Gesehen: 734


Mein seltsamer kreativer Weg führte mich in die Spieleentwicklung. Dank eines hervorragenden Studentenprogramms eines IT-Unternehmens, dessen Name aus einem kleinen griechischen Buchstaben besteht, und der Zusammenarbeit mit unserer Universität, gelang es uns, ein Team zusammenzustellen, eine Dokumentation ins Leben zu rufen und die Entwicklung agiler Spiele unter der Aufsicht eines hochkarätigen Teams einzurichten QA-Ingenieur (Hallo Anna!)

Ohne lange nachzudenken wurde Unity als Engine gewählt. Das ist ein wunderbarer Motor, an dem man wirklich schnell und einfach sehr viel machen kann schlechtes Spiel die, bei klarem Verstand, niemand jemals spielen wird. Erschaffen gute Partie, müssen Sie noch die Dokumentation schaufeln, sich in einige Features vertiefen und Entwicklungserfahrung sammeln.

Unser Spiel verwendete die Physik-Engine auf eine unerwartete Weise, was viele Leistungsprobleme auf mobilen Plattformen verursachte. Dieser Artikel beschreibt am Beispiel unseres Spiels meine Auseinandersetzung mit der Physik-Engine und all die Features ihrer Arbeit, die mir auf dem Weg zu einer brauchbaren Beta-Version aufgefallen sind.

Das Spiel

Ein paar Worte zur Herstellung.
Erstellt mit Blender und ein paar Python-Skripten. Zum Zeitpunkt der Aufnahme befanden sich in der Ecke des Bildschirms 16 Quadrate, deren Farbe 32 Bit einer Gleitkommazahl codierte - die Drehung des Telefons zu einem bestimmten Zeitpunkt. R, G - Daten, B - Parität. 0 - 0, 255 - 1. Das auf dem Computer aufgenommene Video wurde mit ffmpeg in Frames aufgeteilt, jedem Renderframe wurde ein decodierter Winkel zugewiesen. Dieses Format ermöglichte es, jede Komprimierung während des Drehvorgangs zu überstehen und überwand die Tatsache, dass alle Programme leicht unterschiedliche Vorstellungen vom Lauf der Zeit haben. In Wirklichkeit spielt sich das Spiel genauso ab wie auf dem Render.


Das Flugzeug fliegt durch eine endlose und unberechenbare Höhle, in der es Boni, allerlei Münzen und Feinde gibt, die Sie mit Zielsuchraketen abschießen können. Gegen die Wand gekracht - sofort verloren.
Eine Besonderheit des Spiels ist, dass das Level an den Horizont genagelt ist und die Kontrolle darin gyroskopisch ist, außerdem absolut. Neigen Sie das Telefon um 45 Grad - das Flugzeug flog in einem Winkel von 45 Grad. Sie müssen eine tote Schleife machen – Sie müssen das Tablet drehen. Es gibt keine Sensibilität, nur Hardcore.
Lassen Sie uns zwei Haupt- und offensichtliche Probleme für den Entwickler herausgreifen:
Problem 1: Unendlichkeit
Unity speichert und verarbeitet Objektkoordinaten als normale 32-Bit-Gleitkommazahlen mit einer Genauigkeit von bis zu 6 Dezimalstellen. Das Problem ist, dass wir ein endloses Spiel haben und wenn wir lange genug fliegen, werden alle möglichen wahnsinnigen Bugs beginnen, bis hin zur Teleportation durch Wände. Zur Lösung dieses Problems gibt es mehrere Ansätze:
  • Ignorieren. Bei Minecraft zum Beispiel machten Rundungsfehler das Spiel erst durch das Spawnen interessanter.

  • Teleportation nach (0;0;0), wenn das Flugzeug zu weit vom Ursprung entfernt ist.

  • Bezugspunkt ändern. Nicht die Ebene bewegt sich, sondern die Ebene um sie herum.
  • In unserem Fall ist die einzige akzeptable Option die dritte, die implementiert wurde. Über die Umsetzung - etwas später.
    Das erste – Ignorieren – ist absolut inakzeptabel. Einen Roboter zu bauen, der unser Spiel für immer spielen kann, ist eine interessante (und ziemlich einfache) Aufgabe, die jemand lösen wird. Und normale koreanische Spieler sollten nicht unterschätzt werden - das Flugzeug ist schnell, das Level wird unvorhersehbar generiert. Und wenn Sie fliegen und fliegen, bevor Sie die Wände durchqueren, wird das viel genauere Schießen nach 5 Flugminuten offensichtlich mit Störungen beginnen.
    Die zweite – Teleportation des Spielers und der ganzen Welt – zwingt mobile Geräte in einigen Fällen für etwa eine halbe Sekunde in die Knie. Dies ist sehr auffällig und daher - inakzeptabel. Dies ist jedoch eine durchaus akzeptable Option für einfache endlose PC-Spiele.

    Problem 2: Ebenengenerierung

    Es gibt mehrere grundlegende Ansätze zum Bau von Endlosläufern:
  • Verwendung von vorgefertigten Levelsegmenten, die zufällig passen. Dies geschieht beispielsweise in Subway Surfers. Es ist einfach zu implementieren, aber der Spieler gewöhnt sich schnell daran und weiß, worauf er sich vorbereiten muss, was langweilig ist.

  • Das Level ist nur eine gerade Linie, auf der zufällig Hindernisse platziert werden. So wird es in Joypack Joyride und Temple Run gemacht. In unserem Fall würde dies die Anzahl der Manöver stark einschränken.

  • Alles wird zufällig generiert. Die schwierigste, unberechenbarste und interessanteste Option für den Spieler.
  • Natürlich haben wir uns für die schwierigste Variante entschieden. Das Herzstück ist eine sehr komplexe Zustandsmaschine, die zufällige Übergänge an ihnen ausführt. Aber im Rahmen dieses Artikels ist nicht der Mechanismus interessant, sondern der Prozess der Erzeugung der Ebene und ihrer Organisation unter Berücksichtigung des gewählten Ausgangspunkts.

    Ebenenstruktur

    Wir fliegen in einer Höhle, sie hat einen Boden und eine Decke – ein paar Blöcke, elementare Baueinheiten. Blöcke werden zu Segmenten zusammengefasst, die nahtlos aneinander anschließen. Die Segmente drehen sich als Ganzes um das Flugzeug und bewegen sich entlang seines Geschwindigkeitsvektors, wodurch die Illusion des Fliegens entsteht. Verlässt ein Segment das Sichtfeld der Kamera, wird es gemäß den Anweisungen des Generators von Blöcken befreit, an das letzte Segment des Levels angedockt und mit neuen Blöcken gefüllt. Die Gesamtheit solcher Segmente ist die Ebene.
    Erfahrene Unity-Entwickler könnten zu Recht zusammenzucken, nachdem sie den Arbeitsaufwand und alle möglichen Fallstricke abgeschätzt haben. Aber in Worten, alles ist einfach, aber ich hatte keine Entwicklungserfahrung ...

    Grundgesetze der Physik in Einheit

    In einem Monat des Entwickelns, Experimentierens und Lesens der Dokumentation habe ich drei grundlegende Gesetze der Physik in Unity identifiziert. Sie können verletzt werden, aber der Preis für die Verletzung ist die Produktivität. Die Engine warnt Sie in keiner Weise vor dem Fehler, und ohne einen Profiler werden Sie möglicherweise nie davon erfahren. Die Nichteinhaltung dieser Gesetze kann Ihr Spiel verlangsamen zu zehnt einmal. So wie ich es verstehe, führt ein Verstoß gegen ein Gesetz dazu, dass die Physik-Engine den störenden Collider als falsch markiert und auf dem Objekt neu erstellt, gefolgt von einer Neuberechnung der Physik:
    1. Collider sollten sich nicht bewegen, drehen, ein-/ausschalten und ihre Größe ändern.
    Sobald Sie einem Objekt einen Collider hinzugefügt haben, vergessen Sie alle Auswirkungen auf das Objekt oder die darin enthaltenen Objekte. Ein gewöhnlicher Collider ist ein ausschließlich statisches Objekt. Ein Baum kann zum Beispiel mit einem Collider sein. Wenn der Baum auf den Spieler fallen kann, fällt der Baum zusammen mit der Leistung. Wenn dieser Baum aus einer magischen Nährstoffwolke wächst, die keinen Collider hat, sich aber bewegen kann, geht dies mit einem Leistungsabfall einher.
    2. Wenn sich das Objekt bewegt oder dreht, muss es ein fester Körper sein, d.h. eine Rigidbody-Komponente haben.
    Darüber steht es in der Dokumentation geschrieben, ja. Was nicht notwendig ist, um nachdenklich zu lesen, um mit der Entwicklung eines Spiels zu beginnen, da Unity sehr einfach und intuitiv ist.
    Rigidbody ändert die Beziehung der Physik-Engine zum Objekt. Äußere Kräfte beginnen auf ihn einzuwirken, er kann Linear- und Winkelgeschwindigkeiten haben, und vor allem kann sich ein starrer Körper mittels einer Physik-Engine bewegen und drehen, ohne eine vollständige Neuberechnung der Physik zu verursachen.
    Es gibt zwei Arten von Festkörpern – konventionell und kinematisch. Gewöhnliche Körper interagieren miteinander und mit gewöhnlichen Beschleunigern - ein Körper kann nicht durch einen anderen hindurchgehen. Kinematische Körper folgen vereinfachten Simulationsregeln – sie werden nicht von äußeren Kräften, einschließlich der Schwerkraft, beeinflusst. Sie sind frei, alles durchzumachen.
    Wenn es nicht schade ist, Objekte unter die Kontrolle des physischen Motors zu geben, verwenden Sie gewöhnliche starre Körper. Zum Beispiel, wenn Sie Steine ​​schön von einer Klippe rollen müssen. Wenn Ihre Skripte oder Animatoren das Objekt direkt steuern, verwenden Sie kinematische Körper, damit Sie sich nicht ständig mit der Engine und zufälligen Objektkollisionen auseinandersetzen müssen. Zum Beispiel, wenn Sie eine animierte Figur oder eine Lenkwaffe haben, die bei Kontakt mit etwas explodiert.
    3. Wenn das Objekt ein starrer Körper ist, muss es sich durch die Methoden für starre Körper bewegen und drehen.
    Vergessen Sie den direkten Aufruf von Transform" für ein Objekt, unmittelbar nachdem Sie ihm einen Collider hinzugefügt haben. Von nun an und für immer ist Transform Ihr Feind und Leistungskiller. Bevor Sie transform.position = ... oder transform.eulerAngles = ... schreiben, Sagen Sie den Satz "Ich verstehe jetzt ganz genau, was ich tue, ich bin zufrieden mit den Bremsen, die diese Linie verursachen wird." Vergessen Sie hierarchische Beziehungen nicht: Wenn Sie plötzlich ein Objekt bewegen, das starre Körper enthält, die Physik wird neu berechnet.
    Es gibt drei Ebenen der Starrkörperkontrolle:
    - Die höchste und damit natürliche Ebene ist durch Kräfte. Dies sind die Methoden AddForce und AddTorque. Die Physik-Engine berücksichtigt die Masse des Körpers und berechnet die resultierende Geschwindigkeit korrekt. Alle Interaktionen von Körpern finden auf dieser Ebene statt.
    - Durchschnittliches Niveau - Änderung der Geschwindigkeiten. Dies sind die Eigenschaften "velocity" und "angleVelocity". Aus ihnen werden die Kräfte berechnet, die während ihrer Interaktion auf die Körper wirken, und natürlich auch ihre Position im nächsten Moment. Hat ein starrer Körper eine sehr geringe Geschwindigkeit, „schläft“ er ein, um Ressourcen zu sparen.
    - Die unterste Ebene - direkt die Koordinaten des Objekts und seine Orientierung im Raum. Dies sind die Methoden MovePosition und MoveRotation. Bei der nächsten Iteration der Physikberechnung (dies ist wichtig, da jeder nachfolgende Methodenaufruf innerhalb eines Frames den Aufruf des vorherigen ersetzt) ​​teleportieren sie das Objekt an eine neue Position, wonach es wie zuvor lebt. In unserem Spiel wird diese Ebene verwendet, und nur sie, weil sie die volle Kontrolle über das Objekt bietet.

    Was bleibt zurück? Objekt ein-/ausschalten und zoomen. Ich weiß nicht, ob es eine Möglichkeit gibt, die Größe eines Objekts zu ändern, ohne die Engine zu verwirren. Es ist durchaus möglich, nicht. Das Ausschalten des Objekts ist schmerzlos, und das Einschalten ... ja, bewirkt eine Neuberechnung der Physik in der Nähe des eingeschalteten Objekts. Versuchen Sie daher, nicht zu viele Objekte gleichzeitig aufzunehmen, strecken Sie diesen Vorgang zeitlich, damit der Benutzer es nicht bemerkt.

    Es gibt ein Gesetz, das die Leistung nicht beeinflusst, aber die Leistung beeinflusst: Ein starrer Körper kann nicht Teil eines starren Körpers sein. Das übergeordnete Objekt wird dominieren, sodass das untergeordnete Objekt entweder relativ zum übergeordneten Objekt stillsteht oder sich unvorhersehbar und falsch verhält.

    Es gibt noch ein weiteres nicht-physikalisches Feature von Unity, das erwähnenswert ist: Das dynamische Erstellen und Löschen von Objekten über Instantiate/Destroy-Methoden ist VERRÜCKT langsam. Ich habe Angst, mir auch nur vorzustellen, was während der Erstellung des Objekts unter der Haube vor sich geht. Wenn Sie etwas dynamisch erstellen und löschen müssen, verwenden Sie Fabriken und füllen Sie sie während des Ladens des Spiels mit den erforderlichen Objekten. Instanziieren sollte als letzter Ausweg aufgerufen werden - wenn der Fabrik plötzlich die freien Objekte ausgehen und Destroy für immer vergessen - sollte alles, was erstellt wurde, wiederverwendet werden.

    Anwendung von Gesetzen in der Praxis

    (dieser Abschnitt enthält den Ablauf der Argumentation bei der Erstellung des Spiels und seiner Funktionen)

    Das Level muss sich offensichtlich drehen und bewegen.
    Machen wir uns das Leben für immer leichter, indem wir die Rotationsachse der Ebene - des Flugzeugs - am Koordinatenursprung platzieren. Jetzt können wir die Entfernung von einem Punkt zu ihm berechnen, indem wir die Länge des Koordinatenvektors des Punktes berechnen. Eine Kleinigkeit, aber nett.
    Die kooperative Bewegung von Objekten lässt sich leicht durch die Objekthierarchie in Unity implementieren, da die untergeordneten Elemente Teil des übergeordneten Elements sind. Beispielsweise wird die beschriebene Ebenenstruktur wie folgt logisch umgesetzt:
    - Drehachse
    - - Eben
    - - - Abschnitt 1
    - - - - Block 1 (Collider)
    - - - - ...
    - - - - Block N
    - - - Abschnitt 2 ...
    - - - Abschnitt 3 ...
    - - - Abschnitt 4 ...
    (Sie können sogar auf das Ebenenobjekt verzichten)

    Das Skript auf der Achse empfängt Daten vom Gyroskop und stellt den entsprechenden Winkel dafür ein ... Und es verstößt sofort gegen viele Regeln, da die Drehung durch die Hierarchie auf die Collider übertragen wird, was die Physik-Engine verrückt macht. Sie müssen die Achse zu einem starren Körper machen und ihn durch die entsprechende Methode drehen. Aber was ist mit Levelbewegungen? Offensichtlich bewegen sich die Rotationsachse und das Ebenenobjekt nicht, jedes Segment muss einzeln bewegt werden, sonst stehen wir vor dem Problem der Unendlichkeit. Das bedeutet, dass Segmente starre Körper sein müssen. Aber wir haben bereits einen starren Körper, der höher in der Hierarchie steht, und ein starrer Körper kann nicht Teil eines starren Körpers sein. Eine logische und elegante Hierarchie passt nicht, alles muss von Hand gemacht werden - sowohl Rotation als auch Translation, ohne ein Objekt für die Rotationsachse zu verwenden. Seien Sie darauf vorbereitet, wenn Sie über einzigartige Spielfunktionen verfügen.

    Wenn Sie die Segmente sowieso direkt verschieben müssten, müssen Sie sie drehen. Die Hauptschwierigkeit besteht darin, dass es in der Unity-Physik-Engine keine Methode zum „Drehen eines Objekts um einen beliebigen Punkt“ gibt (Transform hat sie, aber lassen Sie sich nicht verführen). Es gibt nur "um seinen Mittelpunkt drehen". Das ist logisch, denn die Drehung um eine beliebige Achse ist gleichzeitig Drehung und Bewegung, und das sind zwei verschiedene Operationen. Aber man kann es nachahmen. Zuerst drehen wir das Segment um seine eigene Achse, dann drehen wir die Koordinaten der „eigenen Achse“ um das Flugzeug. Aufgrund der Tatsache, dass wir das Flugzeug am Ursprung haben, müssen Sie sich nicht einmal an die Schulgeometrie erinnern und zu Wikipedia gehen, Unity hat bereits alles. Es genügt, den Drehwinkel in eine Quaternion umzuwandeln und mit den Koordinaten des Punktes zu multiplizieren. Davon habe ich übrigens gleich beim Schreiben des Artikels erfahren, bevor eine Rotationsmatrix verwendet wurde.

    Wir haben Feinde, die das Flugzeug gegen die Wand stoßen, in der Hoffnung, es zu töten. Es gibt einen Schild, der das Flugzeug von den Wänden abstößt und beim Überleben hilft. Dies ist trivial implementiert – es gibt einen Offset-Vektor, der in jedem Frame zu den Koordinaten jedes Segments addiert und danach zurückgesetzt wird. Jeder, der das Flugzeug treten möchte, kann durch eine spezielle Methode den Vektor seines Tritts hinterlassen, der zu diesem Verschiebungsvektor addiert wird.

    Letztendlich werden die realen Koordinaten des Segments, jedes Frames, vom Motion Control Center des Levels in etwa so berechnet:
    Vector3 position = segment.CachedRigidbody.position; Vector3 deltaPos = Time.deltaTime * Vector3.left * settings.Speed; segment.truePosition = Quaternion.Euler(0, 0, deltaAngle) * (position + deltaPos + movementOffset);
    Nach all den Berechnungen und Krücken, die erforderlich sind, um mit dem exakten Andocken der Segmente während der Regeneration zu arbeiten, wird segment.truePosition an die Methode MovePosition des starren Körpers des Segments gesendet.

    Schlussfolgerungen

    Wie schnell funktioniert das alles? Auf den alten Flaggschiffen – Nexus 5 und LG G2 – fliegt das Spiel mit 60 FPS, mit einem kaum merklichen Drawdown, wenn neue Collider während der Segmentgenerierung eingeschaltet werden (dies ist unvermeidlich und kann in keiner Weise vermieden werden) und Würmer aus dem Grund (Sie können eine Art Hölle aufhäufen, um es zu umgehen, aber jetzt gibt es eine absichtliche Verletzung des dritten Hauptsatzes). 40 stabile FPS geben jedes Gerät mit einem Gyroskop aus, auf das wir gestoßen sind. Ohne alle Gesetze zu kennen und zu berücksichtigen, war die Leistung, gelinde gesagt, unbefriedigend und die Telefone überhitzt. So sehr, dass ich daran dachte, meine eigene einfache spezialisierte Engine für 2D-Physik zu schreiben. Glücklicherweise erwies sich die Physik in Unity als flexibel genug, dass alle Probleme umgangen und erzeugt werden konnten einzigartiges Spiel, es war genug nur ein paar Wochen Experimente.

    Jetzt, da Sie alle Hauptfallen der Unity-Physik-Engine kennen, können Sie unser Spiel schnell klonen und die Träume, das Leben und den Glauben von drei armen Studenten an die Menschheit zerstören. Ich hoffe, dieser Artikel wird Ihnen in Zukunft viel Zeit ersparen und Ihnen helfen, nicht ganz offensichtliche Verstöße gegen die Gesetze der Produktivphysik in Ihren Projekten zu finden.

    Lesen Sie die Dokumentation und experimentieren Sie, auch wenn Sie einfache und intuitive Tools verwenden.



    Unterstützen Sie das Projekt - teilen Sie den Link, danke!
    Lesen Sie auch
    Spielregeln für Hahnenkämpfe Spielregeln für Hahnenkämpfe Mod für Minecraft 1.7 10 Uhr Rezepte.  Rezepte zum Herstellen von Gegenständen in Minecraft.  Waffen in Minecraft Mod für Minecraft 1.7 10 Uhr Rezepte. Rezepte zum Herstellen von Gegenständen in Minecraft. Waffen in Minecraft Schilling und Pfund Sterling - der Ursprung der Wörter Schilling und Pfund Sterling - der Ursprung der Wörter