TIL β Π€ΠΈΠ·ΠΈΠΊΠ° Π² Unity (Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ) Π΄Π΅ΡΠ΅ΡΠΌΠΈΠ½ΠΈΡΠΎΠ²Π°Π½Π°
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Nvidia Physx Π² Π΄Π²ΠΈΠΆΠΊΠ΅ Unity, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΡ ΡΠ΅ΠΏΠ΅ΡΡ ΠΌΠΎΠ³ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΡΠ΅ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Π·Π° ΠΊΡΠ»ΠΈΡΠ°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ ΡΠ΄Π΅Π»Π°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΈΠ·ΠΈΠΊΠΈ Unity ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠΌ.
Π ΠΏΡΠΎΠ΅ΠΊΡΠ΅, Π½Π°Π΄ ΠΊΠΎΡΠΎΡΡΠΌ Ρ ΡΠ°Π±ΠΎΡΠ°Ρ, Ρ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΡΡ Ρ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, ΡΠ²ΡΠ·Π°Π½Π½ΠΎΠΉ Ρ ΠΏΠΎΠΏΡΡΠΊΠΎΠΉ Π·Π°ΠΏΡΡΡΠΈΡΡ ΡΠΈΠΌΡΠ»ΡΡΠΈΡ ΡΠΈΠ·ΠΈΠΊΠΈ Π² Π΄Π²ΠΈΠΆΠΊΠ΅ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΡ ΠΈ ΠΏΡΠ°Π²Π΄ΠΎΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ Π΄ΠΈΠΎΡΠ°ΠΌ. Π¦Π΅Π»Ρ Π·Π°ΠΊΠ»ΡΡΠ°Π»Π°ΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΈΠΌΠ΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ½ΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ Π½Π°ΡΠ°Π»ΡΠ½ΡΡ ΡΠΎΡΠΊΡ Π΄Π»Ρ ΡΡΠ΅Π½Ρ, Π° Π·Π°ΡΠ΅ΠΌ, ΡΡΠΈΡΡΠ²Π°Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΌΠ΅ΡΠΊΡ (Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ³ΠΎ Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΈΡΠ»Π°), ΡΠΈΠΌΡΠ»ΡΡΠΈΡ ΠΌΠΎΠ³Π»Π° ΠΏΡΠΎΠ΄Π²ΠΈΠ³Π°ΡΡ ΡΡΠ΅Π½Ρ Π²ΠΏΠ΅ΡΠ΅Π΄ Π²ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, Π³Π΄Π΅ Π±ΡΠ»Π° ΡΠΊΠ°Π·Π°Π½Π° Π²ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΠΌΠ΅ΡΠΊΠ°, Π³Π΄Π΅ Ρ Π·Π°ΡΠ΅ΠΌ Π±ΡΠ΄Ρ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΡΠΌΠΎΠ΄Π΅Π»ΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ ΠΈ ΡΡΠ°ΡΠΈΠΎΠ½Π°ΡΠ½Π°Ρ Π΄ΠΈΠΎΡΠ°ΠΌΠ°!
ΠΠΆΠΈΠ΄Π°Π΅ΠΌΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΎΡ ΡΡΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΏΡΠ°Π²Π΄ΠΎΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ ΠΈ ΠΏΡΠ΅Π²Π΄ΠΎΡΠ°Π½Π΄ΠΎΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΡΡΠ΅Π½ΠΎΠΉ, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ»Π° ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π° Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎ ΡΠΎΡΠ½ΠΎΠΉ ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠΈΠΌΡΠ»ΡΡΠΈΠΈ! Π§ΡΠΎΠ±Ρ Π²ΡΡΡΠ½ΡΡ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΡΠΈΠ·ΠΈΠΊΠΎΠΉ Π² ββUnity, ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π½Π°ΡΠ°ΡΡ Ρ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π°Π²ΡΠΎΡΠΈΠΌΡΠ»ΡΡΠΈΠΈ Π²Π½ΡΡΡΠΈ Unity. ΠΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΠΊΠΎΠ΄Π°:
Physics.autoSimulation = false;
Π§ΡΠΎΠ±Ρ ΠΏΡΠΎΠ΄Π²ΠΈΠ½ΡΡΡ ΡΠΈΠΌΡΠ»ΡΡΠΈΡ Π²ΡΡΡΠ½ΡΡ, Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ Π²ΡΠ·Π²Π°ΡΡ ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ:
Physics.Simulate(Time); // Time being the desired timestamp in seconds
ΠΠΠΠΠΠΠΠ.
ΠΠ΄Π½Π°ΠΊΠΎ Π΅ΡΡΡ ΠΎΠ΄Π½ΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ΅ΡΠ΅ΠΆΠ΅Π½ΠΈΠ΅β¦
Π€ΠΈΠ·ΠΈΠΊΠ° Π² Unity ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ»ΡΡΡΠ΅Π½Π° ΡΠΎΠ»ΡΠΊΠΎ Π½Π° ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Unity Time.fixedDeltaTime Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ°Π΄ΡΠ΅, ΠΏΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ ΡΡΠΎ-ΡΠΎ ΡΠ»ΠΎΠΌΠ°Π΅ΡΡΡ! π€―
ΠΠ΄Π½Π°ΠΊΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΅ΡΡΡβ¦
ΠΡ ΠΈΡΠ΅ΡΠΈΡΡΠ΅ΠΌ ΡΠΈΠΌΡΠ»ΡΡΠΈΡ ΡΠΈΠ·ΠΈΠΊΠΈ ΡΠ΅ΡΠ΅Π· X ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΠ°Π΄ΡΠΎΠ², ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠ΅ ΡΠ΅ΠΌ, ΠΊΠ°ΠΊ Π΄Π°Π»Π΅ΠΊΠΎ Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ ΠΏΡΠΎΠ΄Π²ΠΈΠ½ΡΡΡΡΡ ΡΠΈΠΌΡΠ»ΡΡΠΈΠΈ ΡΠΈΠ·ΠΈΠΊΠΈ.
ΠΠΎΡ ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΌΠΎΡΡ Π½Π°ΠΌ Π² ΡΡΠΎΠΌ:
public void RunSimulation( float Seconds ) { float TempSeconds = Seconds; while (TempSeconds >= Time.fixedDeltaTime) { TempSeconds -= Time.fixedDeltaTime; Physics.Simulate(Time.fixedDeltaTime); } Physics.Simulate(TempSeconds); // Progress any remainder }
Π€Ρβ¦
ΠΡΡ ΠΏΠ°ΡΠ°Π΄ΠΈΠ³ΠΌΡ Π΄Π΅ΡΡΡΡΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ½ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Ρ Π±ΡΠ΄Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π° ΠΏΡΠΎΡΡΠΆΠ΅Π½ΠΈΠΈ Π²ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ Π»Π°Π½Π΄ΡΠ°ΡΡΠ° β Ρ ΡΠ°ΡΡΠΊΠ°ΠΆΡ ΠΎΠ± ΡΡΠΎΠΌ ΠΏΠΎΠ·ΠΆΠ΅ Π² Π±Π»ΠΎΠ³Π΅.
Π ΠΏΠΎΠΊΠ° Π΄Π°Π²Π°ΠΉΡΠ΅ ΡΠΎΡΡΠ΅Π΄ΠΎΡΠΎΡΠΈΠΌΡΡ Π½Π° ΠΏΠΈΠΊΠ°Π½ΡΠ½ΡΡ Π²Π΅ΡΠ°Ρ : Π²Π·ΡΡΠ²Ρ!
ΠΠ·ΡΡΠ²Ρ ΠΎΡΠ΅Π½Ρ Π»Π΅Π³ΠΊΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π² Unity, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Ρ Π² Π²ΠΈΠ΄Π΅ Π³ΠΎΡΠΎΠ²ΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² Π²Π½ΡΡΡΠΈ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ° Rigidbody. ΠΡΠ΅ Π΄Π°Π½Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π°ΠΌ Π½ΡΠΆΠ½Ρ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π²Π·ΡΡΠ²Π°:
- ΠΡΠΎΠΈΡΡ ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π²Π·ΡΡΠ²Π° (Vector3)
- Π Π°Π΄ΠΈΡΡ Π²Π·ΡΡΠ²Π° (ΠΏΠ»Π°Π²Π°ΡΡΠΈΠΉ)
- Π‘ΠΈΠ»Π° Π²Π·ΡΡΠ²Π° (ΠΏΠΎΠΏΠ»Π°Π²ΠΎΠΊ)
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ ΠΈΠ· ΠΌΠ΅ΡΡΠ° Π²Π·ΡΡΠ²Π°, ΡΡΠΎΠ±Ρ Π²ΡΠ΅ ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΈ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π² Π΄Π°Π½Π½ΡΡ
. Π― Π½Π°ΡΡΡΠΎΠΈΠ» ScriptableObject Π΄Π»Ρ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ ΡΡΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΡΠ²ΠΎΠΈΡΡ Π²Π·ΡΡΠ²Π½ΠΎΠΌΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ.
Π ΡΠ΅ΠΎΡΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΡΠΎ Π²ΡΠ΅, ΡΡΠΎ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π΄Π»Ρ ΠΈΠΌΠΈΡΠ°ΡΠΈΠΈ Π²Π·ΡΡΠ²Π°!
[CreateAssetMenu(fileName = "New Explosion Data", menuName = "DataAsset/Explosion", order = 1)] public class ExplosionParams : ScriptableObject { [Header("Exposion Data")] [Tooltip("in metres")] public float Radius = 10.0f; public float Force = 1.0f; }
ΠΠΎΡΠΌΠΎΡΡΠΈΠΌ Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΠΈβ¦
ΠΠ° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΡΠΈΠ·ΠΈΠΊΠ° ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠΎΡΡΠ°, Π½ΠΎ ΠΎΠ½Π° ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ ΡΡΡΠΎΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Π±Π»ΠΎΠΊΠΈ Π΄ΠΎΡΡΡΠΏΠ½Ρ Π΄Π»Ρ ΠΏΠΎΠ»Π½ΡΡ ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠΈΠΌΡΠ»ΡΡΠΈΠΉ Π² Unity. ΠΠΎΠΊΠ° Π½ΠΈΡΠ΅Π³ΠΎ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΠ³ΠΎ, Π½ΠΎ ΡΠ»Π΅Π΄ΠΈΡΠ΅ Π·Π° ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡΠΌΠΈ β Π΄Π΅ΡΠ΅ΡΠΌΠΈΠ½ΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ ΡΠΊΠ΅Π»Π΅ΡΠ½Π°Ρ Π°Π½ΠΈΠΌΠ°ΡΠΈΡ Π΄Π°Π»ΡΡΠ΅.π