Resolves #210
Fixed issue where the original script made an incorrect assumption about the association between a prefab and a script. Menu now stacks the gameObject prefabs instead of the prefabs themselves.pull/413/head
parent
b12ade6b12
commit
75bcf05f32
|
@ -187,6 +187,11 @@ Prefab:
|
||||||
propertyPath: MenuScreens.Array.size
|
propertyPath: MenuScreens.Array.size
|
||||||
value: 5
|
value: 5
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 114785289659472098, guid: f0f89c3fccbfa4bddbac45ae1effe466,
|
||||||
|
type: 2}
|
||||||
|
propertyPath: menuScreens.Array.size
|
||||||
|
value: 5
|
||||||
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 4108131592329822, guid: f0f89c3fccbfa4bddbac45ae1effe466, type: 2}
|
- target: {fileID: 4108131592329822, guid: f0f89c3fccbfa4bddbac45ae1effe466, type: 2}
|
||||||
propertyPath: m_LocalPosition.x
|
propertyPath: m_LocalPosition.x
|
||||||
value: 0
|
value: 0
|
||||||
|
@ -254,6 +259,41 @@ Prefab:
|
||||||
propertyPath: StartScreen
|
propertyPath: StartScreen
|
||||||
value: 0
|
value: 0
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 114785289659472098, guid: f0f89c3fccbfa4bddbac45ae1effe466,
|
||||||
|
type: 2}
|
||||||
|
propertyPath: menuScreens.Array.data[0]
|
||||||
|
value:
|
||||||
|
objectReference: {fileID: 114026954515301400, guid: e9be8b59801ec4bbe829f57f7b2b9d88,
|
||||||
|
type: 2}
|
||||||
|
- target: {fileID: 114785289659472098, guid: f0f89c3fccbfa4bddbac45ae1effe466,
|
||||||
|
type: 2}
|
||||||
|
propertyPath: menuScreens.Array.data[1]
|
||||||
|
value:
|
||||||
|
objectReference: {fileID: 114359196589700260, guid: 5617592ee912047459b98264a09ddb8a,
|
||||||
|
type: 2}
|
||||||
|
- target: {fileID: 114785289659472098, guid: f0f89c3fccbfa4bddbac45ae1effe466,
|
||||||
|
type: 2}
|
||||||
|
propertyPath: menuScreens.Array.data[2]
|
||||||
|
value:
|
||||||
|
objectReference: {fileID: 114412859951304140, guid: 85d45cc7dbcc7490b91c0aa61f4e73c2,
|
||||||
|
type: 2}
|
||||||
|
- target: {fileID: 114785289659472098, guid: f0f89c3fccbfa4bddbac45ae1effe466,
|
||||||
|
type: 2}
|
||||||
|
propertyPath: menuScreens.Array.data[3]
|
||||||
|
value:
|
||||||
|
objectReference: {fileID: 114109697501719388, guid: 11104fd9ff8884a49b96b0d3d0accb5c,
|
||||||
|
type: 2}
|
||||||
|
- target: {fileID: 114785289659472098, guid: f0f89c3fccbfa4bddbac45ae1effe466,
|
||||||
|
type: 2}
|
||||||
|
propertyPath: menuScreens.Array.data[4]
|
||||||
|
value:
|
||||||
|
objectReference: {fileID: 114030211315693384, guid: 5f7dc93bebf1e41e280baafd8eaa59ec,
|
||||||
|
type: 2}
|
||||||
|
- target: {fileID: 114785289659472098, guid: f0f89c3fccbfa4bddbac45ae1effe466,
|
||||||
|
type: 2}
|
||||||
|
propertyPath: startScreen
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
m_RemovedComponents: []
|
m_RemovedComponents: []
|
||||||
m_ParentPrefab: {fileID: 100100000, guid: f0f89c3fccbfa4bddbac45ae1effe466, type: 2}
|
m_ParentPrefab: {fileID: 100100000, guid: f0f89c3fccbfa4bddbac45ae1effe466, type: 2}
|
||||||
m_IsPrefabParent: 0
|
m_IsPrefabParent: 0
|
||||||
|
|
|
@ -133,7 +133,7 @@ GameObject:
|
||||||
m_Icon: {fileID: 0}
|
m_Icon: {fileID: 0}
|
||||||
m_NavMeshLayer: 0
|
m_NavMeshLayer: 0
|
||||||
m_StaticEditorFlags: 0
|
m_StaticEditorFlags: 0
|
||||||
m_IsActive: 0
|
m_IsActive: 1
|
||||||
--- !u!114 &114012036402784198
|
--- !u!114 &114012036402784198
|
||||||
MonoBehaviour:
|
MonoBehaviour:
|
||||||
m_ObjectHideFlags: 1
|
m_ObjectHideFlags: 1
|
||||||
|
|
|
@ -9,6 +9,7 @@ namespace UnityEngine.UI.Extensions
|
||||||
{
|
{
|
||||||
public static T Instance { get; private set; }
|
public static T Instance { get; private set; }
|
||||||
|
|
||||||
|
|
||||||
protected virtual void Awake()
|
protected virtual void Awake()
|
||||||
{
|
{
|
||||||
Instance = (T)this;
|
Instance = (T)this;
|
||||||
|
@ -21,13 +22,17 @@ namespace UnityEngine.UI.Extensions
|
||||||
|
|
||||||
protected static void Open()
|
protected static void Open()
|
||||||
{
|
{
|
||||||
|
GameObject clonedGameObject = null;
|
||||||
if (Instance == null)
|
if (Instance == null)
|
||||||
MenuManager.Instance.CreateInstance(typeof(T).Name);
|
{
|
||||||
//MenuManager.Instance.CreateInstance<T>();
|
MenuManager.Instance.CreateInstance(typeof(T).Name, out clonedGameObject);
|
||||||
|
MenuManager.Instance.OpenMenu(clonedGameObject.GetMenu());
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
Instance.gameObject.SetActive(true);
|
Instance.gameObject.SetActive(true);
|
||||||
|
MenuManager.Instance.OpenMenu(Instance);
|
||||||
MenuManager.Instance.OpenMenu(Instance);
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static void Close()
|
protected static void Close()
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
/// Credit Adam Kapos (Nezz) - http://www.songarc.net
|
/// Credit Adam Kapos (Nezz) - http://www.songarc.net
|
||||||
/// Sourced from - https://github.com/YousicianGit/UnityMenuSystem
|
/// Sourced from - https://github.com/YousicianGit/UnityMenuSystem
|
||||||
/// Updated by SimonDarksideJ - Refactored to be a more generic component
|
/// Updated by SimonDarksideJ - Refactored to be a more generic component
|
||||||
|
/// Updated by SionDarksideJ - Fixed implementation as it assumed GO's we automatically assigned to instances
|
||||||
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
@ -11,19 +12,35 @@ namespace UnityEngine.UI.Extensions
|
||||||
[DisallowMultipleComponent]
|
[DisallowMultipleComponent]
|
||||||
public class MenuManager : MonoBehaviour
|
public class MenuManager : MonoBehaviour
|
||||||
{
|
{
|
||||||
public Menu[] MenuScreens;
|
[SerializeField]
|
||||||
public int StartScreen = 0;
|
private Menu[] menuScreens;
|
||||||
|
|
||||||
|
public Menu[] MenuScreens
|
||||||
|
{
|
||||||
|
get { return menuScreens; }
|
||||||
|
set { menuScreens = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
[SerializeField]
|
||||||
|
private int startScreen = 0;
|
||||||
|
|
||||||
|
public int StartScreen
|
||||||
|
{
|
||||||
|
get { return startScreen; }
|
||||||
|
set { startScreen = value; }
|
||||||
|
}
|
||||||
|
|
||||||
private Stack<Menu> menuStack = new Stack<Menu>();
|
private Stack<Menu> menuStack = new Stack<Menu>();
|
||||||
|
|
||||||
public static MenuManager Instance { get; set; }
|
public static MenuManager Instance { get; set; }
|
||||||
|
|
||||||
private void Awake()
|
private void Start()
|
||||||
{
|
{
|
||||||
Instance = this;
|
Instance = this;
|
||||||
if (MenuScreens.Length > 0 + StartScreen)
|
if (MenuScreens.Length > 0 + StartScreen)
|
||||||
{
|
{
|
||||||
CreateInstance(MenuScreens[StartScreen].name);
|
var startMenu = CreateInstance(MenuScreens[StartScreen].name);
|
||||||
OpenMenu(MenuScreens[StartScreen]);
|
OpenMenu(startMenu.GetMenu());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -36,26 +53,26 @@ namespace UnityEngine.UI.Extensions
|
||||||
Instance = null;
|
Instance = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void CreateInstance<T>() where T : Menu
|
public GameObject CreateInstance(string MenuName)
|
||||||
{
|
|
||||||
var prefab = GetPrefab<T>();
|
|
||||||
|
|
||||||
Instantiate(prefab, transform);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void CreateInstance(string MenuName)
|
|
||||||
{
|
{
|
||||||
var prefab = GetPrefab(MenuName);
|
var prefab = GetPrefab(MenuName);
|
||||||
|
|
||||||
Instantiate(prefab, transform);
|
return Instantiate(prefab, transform);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OpenMenu(Menu instance)
|
public void CreateInstance(string MenuName, out GameObject menuInstance)
|
||||||
|
{
|
||||||
|
var prefab = GetPrefab(MenuName);
|
||||||
|
|
||||||
|
menuInstance = Instantiate(prefab, transform);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OpenMenu(Menu menuInstance)
|
||||||
{
|
{
|
||||||
// De-activate top menu
|
// De-activate top menu
|
||||||
if (menuStack.Count > 0)
|
if (menuStack.Count > 0)
|
||||||
{
|
{
|
||||||
if (instance.DisableMenusUnderneath)
|
if (menuInstance.DisableMenusUnderneath)
|
||||||
{
|
{
|
||||||
foreach (var menu in menuStack)
|
foreach (var menu in menuStack)
|
||||||
{
|
{
|
||||||
|
@ -66,12 +83,12 @@ namespace UnityEngine.UI.Extensions
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var topCanvas = instance.GetComponent<Canvas>();
|
var topCanvas = menuInstance.GetComponent<Canvas>();
|
||||||
var previousCanvas = menuStack.Peek().GetComponent<Canvas>();
|
var previousCanvas = menuStack.Peek().GetComponent<Canvas>();
|
||||||
topCanvas.sortingOrder = previousCanvas.sortingOrder + 1;
|
topCanvas.sortingOrder = previousCanvas.sortingOrder + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
menuStack.Push(instance);
|
menuStack.Push(menuInstance);
|
||||||
}
|
}
|
||||||
|
|
||||||
private GameObject GetPrefab(string PrefabName)
|
private GameObject GetPrefab(string PrefabName)
|
||||||
|
@ -86,23 +103,6 @@ namespace UnityEngine.UI.Extensions
|
||||||
throw new MissingReferenceException("Prefab not found for " + PrefabName);
|
throw new MissingReferenceException("Prefab not found for " + PrefabName);
|
||||||
}
|
}
|
||||||
|
|
||||||
private T GetPrefab<T>() where T : Menu
|
|
||||||
{
|
|
||||||
// Get prefab dynamically, based on public fields set from Unity
|
|
||||||
// You can use private fields with SerializeField attribute too
|
|
||||||
var fields = this.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
|
|
||||||
foreach (var field in fields)
|
|
||||||
{
|
|
||||||
var prefab = field.GetValue(this) as T;
|
|
||||||
if (prefab != null)
|
|
||||||
{
|
|
||||||
return prefab;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new MissingReferenceException("Prefab not found for type " + typeof(T));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void CloseMenu(Menu menu)
|
public void CloseMenu(Menu menu)
|
||||||
{
|
{
|
||||||
if (menuStack.Count == 0)
|
if (menuStack.Count == 0)
|
||||||
|
@ -122,12 +122,12 @@ namespace UnityEngine.UI.Extensions
|
||||||
|
|
||||||
public void CloseTopMenu()
|
public void CloseTopMenu()
|
||||||
{
|
{
|
||||||
var instance = menuStack.Pop();
|
var menuInstance = menuStack.Pop();
|
||||||
|
|
||||||
if (instance.DestroyWhenClosed)
|
if (menuInstance.DestroyWhenClosed)
|
||||||
Destroy(instance.gameObject);
|
Destroy(menuInstance.gameObject);
|
||||||
else
|
else
|
||||||
instance.gameObject.SetActive(false);
|
menuInstance.gameObject.SetActive(false);
|
||||||
|
|
||||||
// Re-activate top menu
|
// Re-activate top menu
|
||||||
// If a re-activated menu is an overlay we need to activate the menu under it
|
// If a re-activated menu is an overlay we need to activate the menu under it
|
||||||
|
@ -150,4 +150,12 @@ namespace UnityEngine.UI.Extensions
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class MenuExtensions
|
||||||
|
{
|
||||||
|
public static Menu GetMenu(this GameObject go)
|
||||||
|
{
|
||||||
|
return go.GetComponent<Menu>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
Loading…
Reference in New Issue