Advertisement
mygrood

Player Movement Stat for 2d plaformer

Feb 21st, 2025
385
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 11.46 KB | Source Code | 0 0
  1. using UnityEngine;
  2.  
  3. namespace Game.Player
  4. {
  5.     [CreateAssetMenu(menuName = "GAME/Player/Player Movement")]
  6.     public class PlayerMovementStats : ScriptableObject
  7.     {
  8.         [Header("🚶‍♂️ Ходьба (Walk)")]
  9.         [Tooltip("Максимальная скорость ходьбы персонажа. Установите значение, которое определяет, насколько быстро персонаж может идти.")]
  10.         [Range(1f, 100f)]
  11.         public float MaxWalkSpeed = 3f;
  12.         [Tooltip("Как быстро персонаж разгоняется на земле. Чем больше значение, тем быстрее он начнёт двигаться.")]
  13.         [Range(1f, 100f)]
  14.         public float GroundAcceleration = 8f;
  15.         [Tooltip("Как быстро персонаж тормозит на земле. Чем выше значение, тем быстрее он остановится.")]
  16.         [Range(1f, 100f)]
  17.         public float GroundDeceleration = 12f;
  18.         [Tooltip("Как быстро персонаж ускоряется в воздухе. Чем выше значение, тем быстрее персонаж будет набирать скорость в воздухе.")]
  19.         [Range(1f, 100f)]
  20.         public float AirAcceleration = 3f;
  21.         [Tooltip("Как быстро персонаж замедляется в воздухе. Чем больше значение, тем медленнее персонаж будет замедляться в воздухе.")]
  22.         [Range(1f, 100f)]
  23.         public float AirDeceleration = 3f;
  24.         [Range(0.25f,50f)] public float WallJumpMoveAcceleration = 5f;
  25.         [Range(0.25f,50f)] public float WallJumpMoveDeceleration = 5f;
  26.  
  27.         [Header("🏃 Бег (Run)")]
  28.         [Tooltip("Максимальная скорость бега персонажа. Установите значение, которое определяет, насколько быстро персонаж будет бегать.")]
  29.         [Range(1f, 100f)]
  30.         public float MaxRunSpeed = 4.5f;
  31.  
  32.         [Header("🛠️ Проверка столкновений (Collision Check)")]
  33.         [Tooltip("Слой, который считается землёй. Обычно это слой 'Ground' или что-то похожее.")]
  34.         public LayerMask GroundLayer;
  35.         [Tooltip("Длина луча вниз для проверки земли. Чем больше значение, тем дальше луч будет проверять, есть ли земля.")]
  36.         public float GroundDetectionRayLength = 0.05f;
  37.         [Tooltip("Длина луча вверх для проверки удара головой. Этот луч проверяет, не упирается ли персонаж в потолок.")]
  38.         public float HeadDetectionRayLength = 0.05f;
  39.         [Tooltip("Ширина луча для проверки удара головой. Установите значение, чтобы определить, как широко проверяется потолок.")]
  40.         [Range(0, 1f)] public float HeadWidth = 0.03f;
  41.         public float WallDetectionRayLength = 0.125f;
  42.         [Range(0.01f,2f)] public float WallDetectionRayLengthMultiplier = 0.9f;        
  43.  
  44.         [Header("Jump")]
  45.         [Tooltip("Высота прыжка. Это определяет, насколько высоко персонаж может прыгнуть.")]
  46.         public float JumpHeight = 6.5f;
  47.         [Tooltip("Коэффициент компенсации высоты прыжка. Это значение умножается на высоту прыжка для компенсации.")]
  48.         [Range(1f, 1.1f)]
  49.         public float JumpHeightCompensationFactor = 1.05f;
  50.         [Tooltip("Время, которое требуется персонажу для достижения вершины прыжка.")]
  51.         public float TimeTillJumpApex = 0.2f;
  52.         [Tooltip("Множитель гравитации при отпускании кнопки прыжка. Это влияет на то, как быстро персонаж будет падать.")]
  53.         [Range(0.01f, 5f)]
  54.         public float GravityOnReleaseMultiplier = 1.5f;
  55.         [Tooltip("Максимальная скорость падения персонажа. Это ограничивает, насколько быстро персонаж может падать.")]
  56.         public float MaxFallSpeed = 26f;
  57.         [Tooltip("Число прыжков, которые разрешены персонажу. Это позволяет делать дабл-джамп и другие механики.")]
  58.         [Range(1, 5)]
  59.         public float NumberOfJumpsAllowed = 2;
  60.  
  61.         [Header("Reset jump")]
  62.         public bool ResetJumpOnWallSlide = true;
  63.        
  64.         [Header("Jump Cut")]
  65.         [Tooltip("Время для отмены прыжка вверх. Если персонаж отпускает кнопку прыжка, он начнёт падать раньше.")]
  66.         [Range(0.02f, 1f)]
  67.         public float TimeForUpwardsCancel = 0.027f;
  68.  
  69.         [Header("Jump Apex")]
  70.         [Tooltip("Порог для высоты прыжка, при которой считается, что персонаж достиг вершины. Изменение этого параметра влияет на плавность подъёма.")]
  71.         [Range(0.5f, 1f)]
  72.         public float ApexThreshold = 0.9f;
  73.         [Tooltip("Время, которое персонаж зависает на вершине прыжка. Используется для создания ощущения плавности.")]
  74.         [Range(0.01f, 1f)]
  75.         public float ApexHangTime = 0.075f;
  76.  
  77.         [Header("Jump Buffer")]
  78.         [Tooltip("Время, в течение которого игрок может нажать кнопку прыжка, даже если он уже не на земле.")]
  79.         [Range(0f, 1f)]
  80.         public float JumpBufferTime = 0.2f;
  81.  
  82.         [Header("Jump Coyote Time")]
  83.         [Tooltip("Время, в течение которого персонаж ещё может прыгнуть после того, как покинул платформу.")]
  84.         [Range(0f, 1f)]
  85.         public float JumpCoyoteTime = 0.1f;
  86.  
  87.         [Header("Wall Slide")]
  88.         [Min(0.01f)]public float WallSlideSpeed = 1.5f;
  89.         [Range(0.25f, 50f)]public float WallSlideDecelerationSpeed = 50f;
  90.        
  91.         [Header("Wall Jump")]
  92.         public Vector2 WallJumpDirection = new Vector2(-20f, 6.5f);
  93.         [Range(0f, 1f)]public float WallJumpPostBufferTime = 0.125f;
  94.         [Range(0.01f, 5f)]public float WallJumpGravityOnReleaseMultiplier = 0.9f;
  95.        
  96.         [Header("Dash")]
  97.         [Range(0f,1f)]public float DashTime = 0.11f;
  98.         [Range(1f,200f)] public float DashSpeed = 40f;
  99.         [Range(0f,1f)]public float TimeBtwDashesOnGround = 0.225f;
  100.         public bool ResetDashOnWallSlide = true;
  101.         [Range(0, 5)] public int NumberOfDashes = 2;
  102.         [Range(0f,0.5f)]public float DashDiagonallyBias = 0.4f;
  103.        
  104.         [Header("Dash Cancel Time")]
  105.         [Range(0.01f,5f)]public float DashGravityOnReleaseMultiplier = 1f;
  106.         [Range(0.02f, 0.3f)]public float DashTimeForUpwardsCancel = 0.027f;
  107.        
  108.         [Header("DEBUG TOOL")]
  109.         [Tooltip("Показывать ли дугу прыжка при ходьбе.")]
  110.         public bool ShowWalkJumpArc = false;
  111.         [Tooltip("Показывать ли дугу прыжка при беге.")]
  112.         public bool ShowRunJumpArc = false;
  113.         [Tooltip("Останавливать ли дугу прыжка при столкновении с чем-то.")]
  114.         public bool StopOnCollision = true;
  115.         [Tooltip("Должен ли показываться прыжок вправо.")]
  116.         public bool DrawRight = true;
  117.         [Tooltip("Количество шагов для вычисления дуги прыжка. Увеличивайте для более точной визуализации.")]
  118.         [Range(5, 100)]
  119.         public int ArcResolution = 20;
  120.         [Tooltip("Количество шагов, на которые будет визуализироваться дуга прыжка.")]
  121.         [Range(0, 100)]
  122.         public int VisualizationSteps = 90;
  123.  
  124.         public bool DebugShowIsGroundedBox;
  125.         public bool DebugShowHeadBumpBox;
  126.         public bool DebugShowWallHiotBox;
  127.  
  128.         public readonly Vector2[] DashDirections = new Vector2[]
  129.         {
  130.             new Vector2(0, 0),  // nothing
  131.             new Vector2(0, 1),  // up
  132.             new Vector2(0, -1), // down
  133.             new Vector2(1, 0),  // right
  134.             new Vector2(1, 1).normalized,  // TOP-right
  135.             new Vector2(1, -1).normalized, // BOTTOM-right
  136.             new Vector2(-1, 0), // left
  137.             new Vector2(-1, 1).normalized,  // TOP-left
  138.             new Vector2(-1, -1).normalized  // BOTTOM-left
  139.         };
  140.  
  141.         //Jump
  142.         public float Gravity { get; private set; }
  143.         public float InitialJumpVelocity { get; private set; }
  144.         public float AdjustedJumpHeight { get; private set; }
  145.        
  146.         //Wall Jump
  147.         public float WallJumpGravity { get; private set; }
  148.         public float InitialWallJumpVelocity { get; private set; }
  149.         public float AdjustedWallJumpHeight { get; private set; }
  150.        
  151.        
  152.         private void OnValidate()
  153.         {
  154.             CalculateValues();
  155.         }
  156.  
  157.         private void OnEnable()
  158.         {
  159.             CalculateValues();
  160.         }
  161.  
  162.         private void CalculateValues()
  163.         {
  164.             //JUMP
  165.             // Применяем компенсацию высоты прыжка Это позволяет изменять реальную высоту прыжка в зависимости от настроек.
  166.             AdjustedJumpHeight = JumpHeight * JumpHeightCompensationFactor;
  167.             // Рассчитываем гравитацию, необходимую для достижения желаемой высоты прыжка.
  168.             // Формула использует стандартное уравнение движения для определения ускорения:
  169.             // g = -(2 * H) / t^2, где H — это высота прыжка, а t — время до достижения максимальной высоты.
  170.             Gravity = -(2f * AdjustedJumpHeight) / Mathf.Pow(TimeTillJumpApex, 2f);
  171.             // Рассчитываем начальную скорость прыжка (скорость на момент отрыва от земли).
  172.             // Используется уравнение для расчёта скорости при заданной гравитации и времени до апекса прыжка:
  173.             // v = |g| * t, где g — это гравитация, а t — время до апекса.
  174.             InitialJumpVelocity = Mathf.Abs(Gravity) * TimeTillJumpApex;
  175.            
  176.             //WALL JUMP
  177.             AdjustedWallJumpHeight = WallJumpDirection.y*JumpHeightCompensationFactor;
  178.             WallJumpGravity = -(2f * AdjustedWallJumpHeight) / Mathf.Pow(TimeTillJumpApex, 2f);
  179.             InitialWallJumpVelocity = Mathf.Abs(WallJumpGravity) * TimeTillJumpApex;
  180.         }
  181.  
  182.     }
  183. }
  184.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement