added playable location and main menu

This commit is contained in:
MrTorex committed 2026-02-23 14:12:46 +03:00
1 parent ec8d233189
commit b87010d2e5
42 files changed
+19291 -29

No files matched your search

+25
View File
@@ -0,0 +1,25 @@
using Code.DI;
using Code.Input;
using UnityEngine;
namespace Code.UI
{
public class GameplayController : MonoBehaviour
{
private IInputService _inputService;
private AudioSource _audioSource;
private void Start()
{
var container = FindFirstObjectByType<DIContainer>();
_inputService = container.Resolve<IInputService>();
_inputService.EnableMap(ActionMapping.Gameplay);
_audioSource = FindFirstObjectByType<AudioSource>();
}
private void OnDestroy()
{
_inputService.DisableMap(ActionMapping.Gameplay);
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: a3588e28011b4da2ac7c10df1cfe025a
timeCreated: 1771844237
+177 -5
View File
@@ -1,3 +1,7 @@
using Code.DI;
using Code.Input;
using DG.Tweening;
using TMPro;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
@@ -6,21 +10,189 @@ namespace Code.UI
{
public class MainMenuController : MonoBehaviour
{
[SerializeField] private Button playButton;
[SerializeField] private TMP_Text logotype;
[SerializeField] private Button startGameButton;
[SerializeField] private Button exitButton;
[SerializeField] private Transform parallaxRoot;
[SerializeField] private Image fader;
[SerializeField] private Image backgroundImage;
[SerializeField] private float parallaxStrength = 25f;
[SerializeField] private float parallaxSharpness = 15f;
[SerializeField] private float logoAppearDuration = 0.3f;
[SerializeField] private float logoPunchScale = 1.2f;
[SerializeField] private float logoPunchDuration = 0.2f;
[SerializeField] private float backgroundZoomSpeed = 15f;
private Vector3 _targetParallaxOffset;
private Vector3 _currentParallaxOffset;
private IInputService _inputService;
private AudioSource _audioSource;
private void Start()
{
playButton.onClick.AddListener(LoadGameplay);
var container = FindFirstObjectByType<DIContainer>();
_inputService = container.Resolve<IInputService>();
_inputService.EnableMap(ActionMapping.MainMenu);
_audioSource = FindFirstObjectByType<AudioSource>();
SetupButtons();
AnimateLogo();
AnimateBackground();
FadeIn();
}
private void LoadGameplay()
private void SetupButtons()
{
SceneManager.LoadScene("Gameplay");
startGameButton.onClick.AddListener(OnStartGameClicked);
exitButton.onClick.AddListener(OnExitButtonClicked);
AddButtonHoverEffect(startGameButton);
AddButtonHoverEffect(exitButton);
}
private void AddButtonHoverEffect(Button button)
{
var rect = button.GetComponent<RectTransform>();
button.onClick.AddListener(() =>
{
rect.DOPunchScale(Vector3.one * 0.2f, 0.1f, 5, 0.5f);
});
}
private void AnimateLogo()
{
var rect = logotype.rectTransform;
var originalColor = logotype.color;
rect.localScale = Vector3.zero;
logotype.color = new Color(originalColor.r, originalColor.g, originalColor.b, 0f);
var logoSequence = DOTween.Sequence();
logoSequence.Append(rect.DOScale(logoPunchScale, logoAppearDuration).SetEase(Ease.OutQuint))
.Join(logotype.DOColor(originalColor, logoAppearDuration).SetEase(Ease.OutQuint))
.Append(rect.DOScale(1f, 0.1f).SetEase(Ease.InOutSine));
logoSequence.OnComplete(() =>
{
rect.DOPunchScale(Vector3.one * 0.1f, 0.3f, 3, 0.5f)
.SetLoops(-1, LoopType.Restart)
.SetEase(Ease.InOutSine);
logotype.DOColor(new Color(originalColor.r, originalColor.g, originalColor.b, 0.8f), 0.2f)
.SetLoops(-1, LoopType.Yoyo)
.SetEase(Ease.InOutSine);
});
}
private void AnimateBackground()
{
if (backgroundImage == null) return;
var rect = backgroundImage.rectTransform;
rect.DOScale(1.3f, backgroundZoomSpeed)
.SetEase(Ease.InOutQuad)
.SetLoops(-1, LoopType.Yoyo);
rect.DORotate(new Vector3(0, 0, 2f), 10f)
.SetEase(Ease.InOutSine)
.SetLoops(-1, LoopType.Yoyo);
}
private void FadeIn()
{
_audioSource.volume = 0f;
_audioSource.DOFade(1f, 0.5f).SetEase(Ease.OutQuint);
fader.color = new Color(0, 0, 0, 1f);
fader.DOFade(0f, 0.5f).SetEase(Ease.OutQuint);
fader.raycastTarget = false;
}
private void Update()
{
HandleParallax();
}
private void HandleParallax()
{
if (!parallaxRoot) return;
var mousePos = _inputService.MainMenuParalax;
var center = new Vector2(Screen.width / 2f, Screen.height / 2f);
if (center.x == 0 || center.y == 0) return;
var offset = (mousePos - center) / center;
_targetParallaxOffset = new Vector3(
-offset.x * parallaxStrength,
-offset.y * parallaxStrength,
0f
);
_currentParallaxOffset = Vector3.Lerp(
_currentParallaxOffset,
_targetParallaxOffset,
Time.deltaTime * parallaxSharpness
);
parallaxRoot.localPosition = _currentParallaxOffset;
}
private void OnStartGameClicked()
{
startGameButton.transform.DOPunchScale(Vector3.one * 0.3f, 0.2f, 5, 0.5f);
FadeOutAndLoad("Gameplay");
}
private void OnExitButtonClicked()
{
exitButton.transform.DOPunchScale(Vector3.one * 0.3f, 0.2f, 5, 0.5f);
FadeOutAndQuit();
}
private void FadeOutAndLoad(string sceneName)
{
fader.raycastTarget = true;
var fadeSequence = DOTween.Sequence();
fadeSequence.Join(_audioSource.DOFade(0, 0.3f).SetEase(Ease.InQuint))
.Join(fader.DOFade(1f, 0.3f).SetEase(Ease.InQuint))
.OnComplete(() =>
{
SceneManager.LoadScene(sceneName);
});
}
private void FadeOutAndQuit()
{
fader.raycastTarget = true;
var fadeSequence = DOTween.Sequence();
fadeSequence.Join(_audioSource.DOFade(0, 0.3f).SetEase(Ease.InQuint))
.Join(fader.DOFade(1f, 0.3f).SetEase(Ease.InQuint))
.OnComplete(() =>
{
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#else
Application.Quit();
#endif
});
}
private void OnDestroy()
{
playButton.onClick.RemoveAllListeners();
_inputService?.DisableMap(ActionMapping.MainMenu);
_inputService?.DisableMap(ActionMapping.Gameplay);
startGameButton?.onClick.RemoveListener(OnStartGameClicked);
exitButton?.onClick.RemoveListener(OnExitButtonClicked);
DOTween.KillAll();
}
}
}