Unity'de Arayüz Programlama

Unity'de Arayüz Programlama
Orijinal metne blogumdan ulaşabilirsiniz.

Arayüz programlarken acı mı çekiyorsunuz? Her şey birbirine mi giriyo? Bu sorunların çözümünü bu makalede bulablirsiniz! Hemen hemen her projemde kullandığım bir modelden bahsedeceğim.

Oyunlarda çoğu zaman sadece bir pencere görürüz, ana menü veya ayarlar gibi. Bu pencereleri kodun birçok yerinden açmak isteyebiliriz. Bir pencere açılırken doğal olarak diğerlerini de kapatmak istiyoruz. O halde kodun hernangi bir yerinden kolayca ulşabileceğimiz bir fonksiyona ihtiyacımız var. Bu fonksiyon istediğimiz bir pencereyi açaken diğerlerini kapatacak. Bunun için öncelikle yeni bir betik (script) yaratalım ve adını UIManager koyalım. UIManager buradaki singleton'dan türeceyecek ki kodun her noktasından kolaylıkla ulaşabilelim (singleton kullanırken dikkatli olmakta fayda var!).

Pencereler arasında daha kolay geçiş yapmak için enum yapısından faydalanacağım. Şimdilik üç penceremizin olacağını varsayalım: ana menü penceresi, oyun içi ve oyunu durdurma (pause) penceresi. Bir de muhtemelen pencerenin olmamasını isteyebiliriz. Bütün bunları göz önünde bulundurarak şöyle bir betik yazabiliriz:
public enum Window
{
    None,
    MainMenu,
    InGame,
    Pause
}

public class UIManager : Singleton<UIManager>
{
    public void SetWindow(Window window)
    {
        //pencere degistime komutlari buraya yazilacak
    }
}​

 

Oyundaki her pencerenin işlevi biraz farklı olacak (farklı butonlar gibi). Birinin diğerinden haberdar olması içn de bir sebep yok. Bu nedenle her pencere için ayrı bir betik yazabiliriz:

Ana menü:
using UnityEngine;

public class MainMenu : MonoBehaviour
{
}​

 

Oyun içi:
using UnityEngine;

public class InGame : MonoBehaviour
{
}​

 

Durdruma:
using UnityEngine;

public class Pause : MonoBehaviour
{
}​

 

Şimdi bunları UIManager'da tanıtalım:

[SerializeField]
private MainMenu mainMenu;
[SerializeField]
private InGame inGame;
[SerializeField]
private Pause pause;​

 

UIManager haricindeki betiklerin bunlardan haberdar olmasını istemediğimiz için hepsini private yaptık. Fakat bunları Unity'nin Inspector penceresinde görüp atayabilmek istiyoruz. [SerializeField] öznetliği (attribute) işte tam olarak bunu sağlıyor.

Son olarak SetWindow(Window window) fonksiyonuna bu pencereleri açıp kapatma kodu ekleyelim:

using UnityEngine;

public enum Window
{
    None,
    MainMenu,
    InGame,
    Pause
}

public class UIManager : Singleton<UIManager>
{
    [SerializeField]
    private MainMenu mainMenu;
    [SerializeField]
    private InGame inGame;
    [SerializeField]
    private Pause pause;

    public void SetWindow(Window window)
    {
       mainMenu.gameObject.SetActive(window == Window.MainMenu);
       inGame.gameObject.SetActive(window == Window.InGame);
       pause.gameObject.SetActive(window == Window.Pause);
    }
}​

 

Şimdi Unity'de pencereleri oluşturalım, betikleri ekleyelim ve UIManager'da değişkenere atayalım:

Unity Sahnesi

Bundan sonra ne bu pencereleri istediğiniz yerden şu komutu çağırarak değiştirebilirsiniz:

UIManager.Instance.SetWindow(Window.MainMenu);​

 

Benden şimdilik bu kadar! Bu projenin kodlarına GitHub'dan ulaşabilirsiniz. Eklemek veya düzeltmek istediğiniz bir şey olursa ya da daha iyi bir yöntem biliyorsanız lütfen bana ulaşın! Bunun gibi kısayolları ve yöntemleri topladığım, ExtraTools projeme de göz atmayı untumayın. Hakkında yazmamı isteidiginiz bir şey olursa haber verin :)
Yorumlar