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. Пока Π½ΠΈΡ‡Π΅Π³ΠΎ особСнного, Π½ΠΎ слСдитС Π·Π° обновлСниями β€” дСтСрминированная скСлСтная анимация дальшС.πŸ˜‰