Initial commit: Unity WordConnect project
This commit is contained in:
202
Assets/WordConnectGameToolkit/Scripts/Popups/MenuManager.cs
Normal file
202
Assets/WordConnectGameToolkit/Scripts/Popups/MenuManager.cs
Normal file
@ -0,0 +1,202 @@
|
||||
// // ©2015 - 2025 Candy Smith
|
||||
// // All rights reserved
|
||||
// // Redistribution of this software is strictly not allowed.
|
||||
// // Copy of this software can be obtained from unity asset store only.
|
||||
// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// // FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// // THE SOFTWARE.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
using UnityEngine.InputSystem;
|
||||
using UnityEngine.SceneManagement;
|
||||
using WordsToolkit.Scripts.System;
|
||||
using VContainer;
|
||||
|
||||
namespace WordsToolkit.Scripts.Popups
|
||||
{
|
||||
public class MenuManager : MonoBehaviour
|
||||
{
|
||||
public Fader fader;
|
||||
private List<Popup> popupStack = new();
|
||||
|
||||
[SerializeField]
|
||||
private Canvas canvas;
|
||||
|
||||
[Inject]
|
||||
private IPopupFactory popupFactory;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
DontDestroyOnLoad(this);
|
||||
}
|
||||
|
||||
private void OnEnable()
|
||||
{
|
||||
Popup.OnClosePopup += ClosePopup;
|
||||
Popup.OnBeforeCloseAction += OnBeforeCloseAction;
|
||||
SceneManager.activeSceneChanged += OnSceneLoaded;
|
||||
}
|
||||
|
||||
private void OnBeforeCloseAction(Popup popup)
|
||||
{
|
||||
if (fader != null && popupStack.Count == 1)
|
||||
{
|
||||
fader.FadeOut();
|
||||
}
|
||||
}
|
||||
|
||||
private void OnSceneLoaded(Scene scene, Scene scene1)
|
||||
{
|
||||
if (canvas == null && this != null)
|
||||
{
|
||||
canvas = GetComponent<Canvas>();
|
||||
}
|
||||
|
||||
canvas.worldCamera = Camera.main;
|
||||
}
|
||||
|
||||
private void OnDisable()
|
||||
{
|
||||
Popup.OnClosePopup -= ClosePopup;
|
||||
SceneManager.activeSceneChanged -= OnSceneLoaded;
|
||||
Popup.OnBeforeCloseAction -= OnBeforeCloseAction;
|
||||
}
|
||||
|
||||
public T ShowPopup<T>(Action onShow = null, Action<EPopupResult> onClose = null) where T : Popup
|
||||
{
|
||||
if (popupStack.OfType<T>().Any())
|
||||
{
|
||||
return popupStack.OfType<T>().First();
|
||||
}
|
||||
|
||||
var popup = popupFactory.CreatePopup<T>(transform);
|
||||
return (T)ShowPopupInternal(popup, onShow, onClose);
|
||||
}
|
||||
|
||||
public Popup ShowPopup(string pathWithType, Action onShow = null, Action<EPopupResult> onClose = null)
|
||||
{
|
||||
if (popupStack.Any(p => p.GetType().Name == pathWithType.Split('/').Last()))
|
||||
{
|
||||
return popupStack.First(p => p.GetType().Name == pathWithType.Split('/').Last());
|
||||
}
|
||||
|
||||
var popup = popupFactory.CreatePopup(pathWithType, transform);
|
||||
return ShowPopupInternal(popup, onShow, onClose);
|
||||
}
|
||||
|
||||
public Popup ShowPopup(Popup popupPrefab, Action onShow = null, Action<EPopupResult> onClose = null)
|
||||
{
|
||||
if (popupStack.Any(p => p.GetType() == popupPrefab.GetType()))
|
||||
{
|
||||
return popupStack.First(p => p.GetType() == popupPrefab.GetType());
|
||||
}
|
||||
var popup = popupFactory.CreatePopup(popupPrefab, transform);
|
||||
return ShowPopupInternal(popup, onShow, onClose);
|
||||
}
|
||||
|
||||
private Popup ShowPopupInternal(Popup popup, Action onShow = null, Action<EPopupResult> onClose = null)
|
||||
{
|
||||
if (popupStack.Count > 0)
|
||||
{
|
||||
popupStack.Last().Hide();
|
||||
}
|
||||
|
||||
popupStack.Add(popup);
|
||||
popup.Show<Popup>(onShow, onClose);
|
||||
|
||||
if (fader != null && popupStack.Count > 0 && popup.fade)
|
||||
{
|
||||
fader.transform.SetSiblingIndex(popup.transform.GetSiblingIndex() - 1);
|
||||
fader.FadeIn(popup.fadeAlpha);
|
||||
}
|
||||
|
||||
return popup;
|
||||
}
|
||||
|
||||
private void ClosePopup(Popup popupClose)
|
||||
{
|
||||
if (popupStack.Count > 0)
|
||||
{
|
||||
popupStack.Remove(popupClose);
|
||||
if (popupStack.Count > 0)
|
||||
{
|
||||
var popup = popupStack.Last();
|
||||
var siblingIndex = popup.transform.GetSiblingIndex() - 1;
|
||||
siblingIndex = Mathf.Clamp(siblingIndex, 0, transform.childCount - 1);
|
||||
fader.transform.SetSiblingIndex(siblingIndex);
|
||||
popup.OnActivate();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void ShowPurchased(GameObject imagePrefab, string boostName)
|
||||
{
|
||||
var menu = ShowPopup<PurchasedMenu>();
|
||||
menu.GetComponent<PurchasedMenu>().SetIconSprite(imagePrefab, boostName);
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
if (Application.platform != RuntimePlatform.IPhonePlayer)
|
||||
{
|
||||
if (Keyboard.current[Key.Escape].wasReleasedThisFrame)
|
||||
{
|
||||
if (popupStack is { Count: > 0 })
|
||||
{
|
||||
var closeButton = popupStack.Last().closeButton;
|
||||
if (closeButton != null)
|
||||
{
|
||||
closeButton.onClick?.Invoke();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public T GetPopupOpened<T>() where T : Popup
|
||||
{
|
||||
foreach (var popup in popupStack)
|
||||
{
|
||||
if (popup.GetType() == typeof(T))
|
||||
{
|
||||
return (T)popup;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public void CloseAllPopups()
|
||||
{
|
||||
for (var i = 0; i < popupStack.Count; i++)
|
||||
{
|
||||
var popup = popupStack[i];
|
||||
popup.Close();
|
||||
}
|
||||
|
||||
popupStack.Clear();
|
||||
}
|
||||
|
||||
public bool IsAnyPopupOpened()
|
||||
{
|
||||
return popupStack.Count > 0;
|
||||
}
|
||||
|
||||
public Popup GetLastPopup()
|
||||
{
|
||||
return popupStack.Last();
|
||||
}
|
||||
|
||||
public MainMenu GetMainMenu()
|
||||
{
|
||||
return FindObjectOfType<MainMenu>();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user