Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using UnityEngine;
- namespace Game.Player
- {
- [CreateAssetMenu(menuName = "GAME/Player/Player Movement")]
- public class PlayerMovementStats : ScriptableObject
- {
- [Header("🚶♂️ Ходьба (Walk)")]
- [Tooltip("Максимальная скорость ходьбы персонажа. Установите значение, которое определяет, насколько быстро персонаж может идти.")]
- [Range(1f, 100f)]
- public float MaxWalkSpeed = 3f;
- [Tooltip("Как быстро персонаж разгоняется на земле. Чем больше значение, тем быстрее он начнёт двигаться.")]
- [Range(1f, 100f)]
- public float GroundAcceleration = 8f;
- [Tooltip("Как быстро персонаж тормозит на земле. Чем выше значение, тем быстрее он остановится.")]
- [Range(1f, 100f)]
- public float GroundDeceleration = 12f;
- [Tooltip("Как быстро персонаж ускоряется в воздухе. Чем выше значение, тем быстрее персонаж будет набирать скорость в воздухе.")]
- [Range(1f, 100f)]
- public float AirAcceleration = 3f;
- [Tooltip("Как быстро персонаж замедляется в воздухе. Чем больше значение, тем медленнее персонаж будет замедляться в воздухе.")]
- [Range(1f, 100f)]
- public float AirDeceleration = 3f;
- [Range(0.25f,50f)] public float WallJumpMoveAcceleration = 5f;
- [Range(0.25f,50f)] public float WallJumpMoveDeceleration = 5f;
- [Header("🏃 Бег (Run)")]
- [Tooltip("Максимальная скорость бега персонажа. Установите значение, которое определяет, насколько быстро персонаж будет бегать.")]
- [Range(1f, 100f)]
- public float MaxRunSpeed = 4.5f;
- [Header("🛠️ Проверка столкновений (Collision Check)")]
- [Tooltip("Слой, который считается землёй. Обычно это слой 'Ground' или что-то похожее.")]
- public LayerMask GroundLayer;
- [Tooltip("Длина луча вниз для проверки земли. Чем больше значение, тем дальше луч будет проверять, есть ли земля.")]
- public float GroundDetectionRayLength = 0.05f;
- [Tooltip("Длина луча вверх для проверки удара головой. Этот луч проверяет, не упирается ли персонаж в потолок.")]
- public float HeadDetectionRayLength = 0.05f;
- [Tooltip("Ширина луча для проверки удара головой. Установите значение, чтобы определить, как широко проверяется потолок.")]
- [Range(0, 1f)] public float HeadWidth = 0.03f;
- public float WallDetectionRayLength = 0.125f;
- [Range(0.01f,2f)] public float WallDetectionRayLengthMultiplier = 0.9f;
- [Header("Jump")]
- [Tooltip("Высота прыжка. Это определяет, насколько высоко персонаж может прыгнуть.")]
- public float JumpHeight = 6.5f;
- [Tooltip("Коэффициент компенсации высоты прыжка. Это значение умножается на высоту прыжка для компенсации.")]
- [Range(1f, 1.1f)]
- public float JumpHeightCompensationFactor = 1.05f;
- [Tooltip("Время, которое требуется персонажу для достижения вершины прыжка.")]
- public float TimeTillJumpApex = 0.2f;
- [Tooltip("Множитель гравитации при отпускании кнопки прыжка. Это влияет на то, как быстро персонаж будет падать.")]
- [Range(0.01f, 5f)]
- public float GravityOnReleaseMultiplier = 1.5f;
- [Tooltip("Максимальная скорость падения персонажа. Это ограничивает, насколько быстро персонаж может падать.")]
- public float MaxFallSpeed = 26f;
- [Tooltip("Число прыжков, которые разрешены персонажу. Это позволяет делать дабл-джамп и другие механики.")]
- [Range(1, 5)]
- public float NumberOfJumpsAllowed = 2;
- [Header("Reset jump")]
- public bool ResetJumpOnWallSlide = true;
- [Header("Jump Cut")]
- [Tooltip("Время для отмены прыжка вверх. Если персонаж отпускает кнопку прыжка, он начнёт падать раньше.")]
- [Range(0.02f, 1f)]
- public float TimeForUpwardsCancel = 0.027f;
- [Header("Jump Apex")]
- [Tooltip("Порог для высоты прыжка, при которой считается, что персонаж достиг вершины. Изменение этого параметра влияет на плавность подъёма.")]
- [Range(0.5f, 1f)]
- public float ApexThreshold = 0.9f;
- [Tooltip("Время, которое персонаж зависает на вершине прыжка. Используется для создания ощущения плавности.")]
- [Range(0.01f, 1f)]
- public float ApexHangTime = 0.075f;
- [Header("Jump Buffer")]
- [Tooltip("Время, в течение которого игрок может нажать кнопку прыжка, даже если он уже не на земле.")]
- [Range(0f, 1f)]
- public float JumpBufferTime = 0.2f;
- [Header("Jump Coyote Time")]
- [Tooltip("Время, в течение которого персонаж ещё может прыгнуть после того, как покинул платформу.")]
- [Range(0f, 1f)]
- public float JumpCoyoteTime = 0.1f;
- [Header("Wall Slide")]
- [Min(0.01f)]public float WallSlideSpeed = 1.5f;
- [Range(0.25f, 50f)]public float WallSlideDecelerationSpeed = 50f;
- [Header("Wall Jump")]
- public Vector2 WallJumpDirection = new Vector2(-20f, 6.5f);
- [Range(0f, 1f)]public float WallJumpPostBufferTime = 0.125f;
- [Range(0.01f, 5f)]public float WallJumpGravityOnReleaseMultiplier = 0.9f;
- [Header("Dash")]
- [Range(0f,1f)]public float DashTime = 0.11f;
- [Range(1f,200f)] public float DashSpeed = 40f;
- [Range(0f,1f)]public float TimeBtwDashesOnGround = 0.225f;
- public bool ResetDashOnWallSlide = true;
- [Range(0, 5)] public int NumberOfDashes = 2;
- [Range(0f,0.5f)]public float DashDiagonallyBias = 0.4f;
- [Header("Dash Cancel Time")]
- [Range(0.01f,5f)]public float DashGravityOnReleaseMultiplier = 1f;
- [Range(0.02f, 0.3f)]public float DashTimeForUpwardsCancel = 0.027f;
- [Header("DEBUG TOOL")]
- [Tooltip("Показывать ли дугу прыжка при ходьбе.")]
- public bool ShowWalkJumpArc = false;
- [Tooltip("Показывать ли дугу прыжка при беге.")]
- public bool ShowRunJumpArc = false;
- [Tooltip("Останавливать ли дугу прыжка при столкновении с чем-то.")]
- public bool StopOnCollision = true;
- [Tooltip("Должен ли показываться прыжок вправо.")]
- public bool DrawRight = true;
- [Tooltip("Количество шагов для вычисления дуги прыжка. Увеличивайте для более точной визуализации.")]
- [Range(5, 100)]
- public int ArcResolution = 20;
- [Tooltip("Количество шагов, на которые будет визуализироваться дуга прыжка.")]
- [Range(0, 100)]
- public int VisualizationSteps = 90;
- public bool DebugShowIsGroundedBox;
- public bool DebugShowHeadBumpBox;
- public bool DebugShowWallHiotBox;
- public readonly Vector2[] DashDirections = new Vector2[]
- {
- new Vector2(0, 0), // nothing
- new Vector2(0, 1), // up
- new Vector2(0, -1), // down
- new Vector2(1, 0), // right
- new Vector2(1, 1).normalized, // TOP-right
- new Vector2(1, -1).normalized, // BOTTOM-right
- new Vector2(-1, 0), // left
- new Vector2(-1, 1).normalized, // TOP-left
- new Vector2(-1, -1).normalized // BOTTOM-left
- };
- //Jump
- public float Gravity { get; private set; }
- public float InitialJumpVelocity { get; private set; }
- public float AdjustedJumpHeight { get; private set; }
- //Wall Jump
- public float WallJumpGravity { get; private set; }
- public float InitialWallJumpVelocity { get; private set; }
- public float AdjustedWallJumpHeight { get; private set; }
- private void OnValidate()
- {
- CalculateValues();
- }
- private void OnEnable()
- {
- CalculateValues();
- }
- private void CalculateValues()
- {
- //JUMP
- // Применяем компенсацию высоты прыжка Это позволяет изменять реальную высоту прыжка в зависимости от настроек.
- AdjustedJumpHeight = JumpHeight * JumpHeightCompensationFactor;
- // Рассчитываем гравитацию, необходимую для достижения желаемой высоты прыжка.
- // Формула использует стандартное уравнение движения для определения ускорения:
- // g = -(2 * H) / t^2, где H — это высота прыжка, а t — время до достижения максимальной высоты.
- Gravity = -(2f * AdjustedJumpHeight) / Mathf.Pow(TimeTillJumpApex, 2f);
- // Рассчитываем начальную скорость прыжка (скорость на момент отрыва от земли).
- // Используется уравнение для расчёта скорости при заданной гравитации и времени до апекса прыжка:
- // v = |g| * t, где g — это гравитация, а t — время до апекса.
- InitialJumpVelocity = Mathf.Abs(Gravity) * TimeTillJumpApex;
- //WALL JUMP
- AdjustedWallJumpHeight = WallJumpDirection.y*JumpHeightCompensationFactor;
- WallJumpGravity = -(2f * AdjustedWallJumpHeight) / Mathf.Pow(TimeTillJumpApex, 2f);
- InitialWallJumpVelocity = Mathf.Abs(WallJumpGravity) * TimeTillJumpApex;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement