Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
- доработан flow призовой витрины и связанного UI: добавлены `PrizeStandButtonView` и `RulesPrizeListPage`, обновлены `PrizeStandController`, `PrizeStandPrize`, `PrizeStandModal`, `PrizeStandSettingsModal`, `LevelPrizeSettingsModal`, `QRCodeSettingsModal`, `BalanceDisplay`, `ButtonTextFocusColor` и связанные prefab'ы, чтобы улучшить настройку, навигацию, отображение кнопок и prize flow - расширена система настроек и сохранения значений: `OptionPicker` получил отдельный формат `ValueSelector`, обновлены `SettingsDatabase`, `SettingEntryDrawer`, `SettingUIItem`, `SettingsUIGenerator`, `ValueSelectorRow` и `MainSettingsDatabase.asset`, а сохранение option picker-значений, включая `gameplay.gameDifficulty`, исправлено и синхронизировано с остальными настройками - добавлены универсальные спавнеры сущностей: реализованы `EntitySpawner` и `EntitySpawnerManager` с поддержкой весов префабов, точек спавна, заполнения по проценту, ограничений на количество и автоспавна при инициализации - доработана логика игрового спавна и сложности: процент инициализационного спавна может зависеть от настройки `gameplay.gameDifficulty` с градациями 25/50/75/100, в одном цикле массового спавна повторно не используется та же точка, а gizmo спавнера теперь показывает только сами точки без линий - упрощена работа в редакторе Unity и добавлены editor-инструменты: в `GameManager` лицензия пропускается при запуске в `UNITY_EDITOR`, а `HierarchySelectionCounter`, `HierarchySelectionCountOverlay` и `HierarchyBulkRenamerWindow` добавляют подсчет выделения, realtime overlay в `SceneView` и массовое переименование объектов по правилам нумерации из Unity Project Settings - синхронизированы сцены, ресурсы и UI-ассеты под новый flow: обновлены `MainMenu`, `Level UI`, уровни `1-1` и `1-2`, строки настроек, кнопки, TMP/font assets, изображения UI, `prizes.json` и recovery-данные после правок интерфейса и логики - очищены и переразложены часть внешних и служебных ресурсов: удалён пакет `Lava_Flowing_Shader`, переименованы/заменены отдельные UI-prefab'ы и добавлены сопутствующие проектные артефакты, которые сейчас используются обновлённой конфигурацией проекта
75 lines
2.5 KiB
C#
75 lines
2.5 KiB
C#
using UnityEngine;
|
|
|
|
namespace RR.Common.Entities.Props
|
|
{
|
|
public sealed class LeafCollectible : EnvironmentalCollectibleBase
|
|
{
|
|
public override bool CountsTowardsSharedCollectionLimit => true;
|
|
|
|
[Header("Fall")]
|
|
[SerializeField] private float fallSpeed = 1.25f;
|
|
[SerializeField] private float horizontalAmplitude = 0.4f;
|
|
[SerializeField] private float horizontalFrequency = 1.1f;
|
|
[SerializeField] private float rotationAmplitude = 22f;
|
|
[SerializeField] private float rotationSpeed = 2.2f;
|
|
|
|
[Header("Grounding")]
|
|
[SerializeField] private bool stopAtGround = true;
|
|
[SerializeField] private LayerMask groundMask = ~0;
|
|
[SerializeField] private float groundCheckDistance = 0.2f;
|
|
[SerializeField] private float minY = -10f;
|
|
[SerializeField] private float groundedSwayAmplitude = 0.08f;
|
|
[SerializeField] private float groundedSwaySpeed = 1.5f;
|
|
|
|
private Vector3 _basePosition;
|
|
private float _time;
|
|
private bool _isGrounded;
|
|
|
|
protected override void OnSpawned()
|
|
{
|
|
_basePosition = transform.position;
|
|
_time = 0f;
|
|
_isGrounded = false;
|
|
}
|
|
|
|
protected override void TickBehaviour(float dt)
|
|
{
|
|
_time += dt;
|
|
|
|
Vector3 position = _basePosition;
|
|
float horizontalOffset = Mathf.Sin(_time * horizontalFrequency) * horizontalAmplitude;
|
|
|
|
if (_isGrounded)
|
|
{
|
|
position.x += Mathf.Sin(_time * groundedSwaySpeed) * groundedSwayAmplitude;
|
|
transform.position = position;
|
|
transform.rotation = Quaternion.Euler(0f, 0f, Mathf.Sin(_time * rotationSpeed) * (rotationAmplitude * 0.25f));
|
|
return;
|
|
}
|
|
|
|
position.y -= fallSpeed * dt;
|
|
position.x += horizontalOffset;
|
|
|
|
bool reachedGround = position.y <= minY;
|
|
if (!reachedGround && stopAtGround)
|
|
{
|
|
RaycastHit2D hit = Physics2D.Raycast(position, Vector2.down, groundCheckDistance, groundMask);
|
|
reachedGround = hit.collider != null;
|
|
}
|
|
|
|
if (reachedGround)
|
|
{
|
|
_isGrounded = true;
|
|
}
|
|
else
|
|
{
|
|
_basePosition.y = position.y;
|
|
_basePosition.x = SpawnPosition.x;
|
|
}
|
|
|
|
transform.position = position;
|
|
transform.rotation = Quaternion.Euler(0f, 0f, Mathf.Sin(_time * rotationSpeed) * rotationAmplitude);
|
|
}
|
|
}
|
|
}
|