Wednesday, February 5, 2014

Unity 2D IV: The Reckoning of the UIs

I tentatively finished up (is that an oxymoron?) my UIs last night. I need to create assets for the other the Trade and Build aspects of the game, so I'm moving on to that today. I created an abstract class for all of my UI menus to extend from that adds some tween scaling on a specified 2D axis.

using UnityEngine;
using System.Collections;

public abstract class AbstractUi : MonoBehaviour {
    private TweenScale SubMenuTween;
    private GameObject LastMenu;
    private Vector3 OriginalScale;
    public enum Axis { X, Y, Z };
    private float TweenDuration = 0.2f;

    protected void Start()
    {
        
    }

    protected void openSubMenu(GameObject subMenu, Axis scaleAxis)
    {
        subMenu.SetActive(true);
        Vector2 finalScale = new Vector3(subMenu.transform.localScale.x, subMenu.transform.localScale.y, 1);
        switch (scaleAxis)
        {
            case Axis.X:
                subMenu.transform.localScale = new Vector3(0, subMenu.transform.localScale.y, subMenu.transform.localScale.z);
                break;
            case Axis.Y:
                subMenu.transform.localScale = new Vector3(subMenu.transform.localScale.x, 0, subMenu.transform.localScale.z);
                break;
            default:
                subMenu.transform.localScale = new Vector3(subMenu.transform.localScale.x, 0, subMenu.transform.localScale.z);
                break;
        }

        SubMenuTween = TweenScale.Begin(subMenu, TweenDuration, new Vector3(finalScale.x, finalScale.y));
        SubMenuTween.method = UITweener.Method.BounceIn;
    }

    protected void closeMenu(GameObject subMenu, float scaleX, float scaleY)
    {
        if (LastMenu == null)   // prevents multiple calls to close window while one is still animating. 
        {
            OriginalScale = new Vector3(subMenu.transform.localScale.x, subMenu.transform.localScale.y, 1);
            TweenScale.Begin(subMenu, TweenDuration, new Vector3(scaleX, scaleY));
            SubMenuTween.eventReceiver = gameObject;
            SubMenuTween.method = UITweener.Method.EaseIn;
            SubMenuTween.callWhenFinished = "onSubMenuTweenClose";
            LastMenu = subMenu;
        }
    }

    public void onSubMenuTweenClose()
    {
        LastMenu.SetActive(false);
        LastMenu.transform.localScale = OriginalScale;
        LastMenu = null;
    }

    

}
using UnityEngine;
using System.Collections;

public class HeadsUpUi : AbstractUi {
    public GameObject MenuUi;
    
    private TweenScale MainMenuTweenScale;
 // Use this for initialization
 void Start () {
        MenuUi.SetActive(false);
        
 }
 
 // Update is called once per frame
 void Update () {
 
 }

    public void OnMenuButtonClick()
    {
        if (!MenuUi.activeSelf)
            openSubMenu(MenuUi, Axis.Y);
        else
            closeMenu(MenuUi, MenuUi.transform.localScale.x, 0);

    }
}
using UnityEngine;
using System.Collections;

public class MenuUi : AbstractUi {

 // Use this for initialization
    public GameObject TravelUi;
    public GameObject BuildUi;
    public GameObject TradeUi;

 void Start () 
    {
        HideSubMenus();
 }

    private void HideSubMenus()
    {
        TravelUi.SetActive(false);
        //BuildUi.SetActive(false);
        //TradeUi.SetActive(false);
        
    }
 
 // Update is called once per frame
 void Update () 
    {
 
 }

    public void OnTravelClick()
    {
        HideSubMenus();
        TravelUi.SetActive(true);
        openSubMenu(TravelUi, Axis.X);
    }

    public void OnBuildClick()
    {
        HideSubMenus();
        //openSubMenu(BuildUi, Axis.X);
    }

    public void OnTradeClick()
    {
        HideSubMenus();
        //openSubMenu(TradeUi, Axis.X);
    }

    public void OnSubMenuItemChosen()
    {
        HideSubMenus();
        gameObject.SetActive(false);
    }

}
Ngui has click events built into buttons, so in my editor, all I had to do was assign things like OnTradeClick to the Trade button, OnBuildClick to the Build button, and so on. The UI needs some aesthetic refinement, but for now it's functional and I need to move on to asset creation to do the rest. Good bye UI programming... I shall return!!!

No comments:

Post a Comment