Orta seviye öğreticiler

Etkileşimli UI Oluşturma

*Bu içerik, yapay zekâ (beta) kullanılarak çevrildi ve hatalar içerebilir. Sayfayı İngilizce görüntülemek için buraya tıkla.

Bir HUD (Heads-Up Display) deneyiminizde genellikle, HUD metreleri oluşturun bölümünde gösterilen sağlık ölçer gibi etkileşimli olmayan UI bileşenlerini görüntüler. Bunun yanı sıra, hemen her deneyim etkileşimli UI öğeleri gerektirir; buna, oyuncu etkileşimine yanıt veren, etkinleştirildiğinde animasyonlanan, diğer etkileşimli kontrollerle birlikte açılıp kapanan menüler gibi butonlar dahildir.

Ayarlar butonu ve ses kaydırıcıları içeren ayarlar menüsünü gösteren bir oyun içi görünüm.

UI Temelleri - HUD Metresi bölümünü başlangıç noktası olarak kullanarak ve UI Temelleri - Etkileşimlilik bölümünü bitmiş referans olarak alarak, bu öğretici şunları gösterir:

  • Ayarlar butonunu ekranın üst kenarında nasıl konumlandıracağınız.
  • Etkileşimli sürüklenebilir kaydırıcılar içeren bir ayarlar menüsünün tasarımı.
  • Durumlu beyanlarla UI nesnelerinin genişletilebilir kontrolleri için "denetleyici" modülleri oluşturmak için bir ModuleScript kullanımı.
  • Butonları, ayarlar menüsünü açıp kapatmak için oyuncu etkileşimi ile nasıl bağlayacağınız.
  • Sesi efektleri ve arka plan ortam sesi için ayrı ayrı ayarlamak amacıyla sürüklenebilir UI kaydırıcılarını nasıl bağlayacağınız.

Aygıt Emülatörünü Etkinleştirin

HUD metreleri oluşturun bölümünde belirtildiği gibi, telefonlar ve tabletler en az ekran alanına sahiptir, bu nedenle UI öğelerinizin daha küçük ekranlara sığması ve oyunculara net bir şekilde görünmesi önemlidir. Eğer henüz yapmadıysanız, Studio'da Aygıt Emülatörü'nü etkinleştirin:

  1. Studio'da UI Temelleri - HUD Metresi şablonunu açın.

  2. Studio'nun Test menüsünden Aygıt Emülatörü'nü etkinleştirin.

  3. Ana görünüm penceresinin hemen üstündeki çubuktan iPhone X veya Samsung Galaxy A51 gibi bir telefon emülasyonu seçin. Ardından, görünüm boyutunu Pencereye Sığdır olarak ayarlayarak Studio'daki maksimum alanı kullanın.

    Görünüm penceresinin üstünde belirtilen Aygıt Emulatorü ayarları.

Ayarlar Butonunu Oluşturun

GuiButtons etkileşimli kullanıcı arayüzü öğeleridir ve Activated etkinliği gibi yerleşik işlevselliğe sahiptir; bu, butona tıkladığınızda veya dokunduğunuzda ateş eder. GuiButton sınıfı iki varyasyona sahiptir; TextButton ve ImageButton, ve bu öğretici ayarlar menüsünü açıp kapatmak için bir "dişli" şeklindeki ImageButton kullanır.

Ayarlar butonu için kullanılan Roblox bileşeni.

Ayarlar butonunu oluşturmak için:

  1. Explorer penceresinde StarterGui içinde HUDContainer'ı bulun.

    Seçilen HUDContainer gösteren Explorer penceresi.
  2. HUDContainer'a bir ImageButton ekleyin ve adını SettingsButton olarak değiştirin.

    Yeni ImageButton'ın eklendiği ve SettingsButton olarak yeniden adlandırıldığı Explorer penceresi. Görünümde yeni ImageButton.
  3. Yeni buton seçiliyken, Properties penceresinde aşağıdakileri ayarlayın:

    • AnchorPoint = 0.5, 0.25 (yatay merkez ve dikey üst çeyrek)
    • BackgroundTransparency = 1 (tamamen şeffaf)
    • Position = 0.5, 0, 0, 0 (üst merkez konumlandırma)
    • Size = 0.1, 0, 0.1, 0 (oran kısıtlandığında ekran yüksekliğinin %10'u)
    • Image = rbxassetid://104919049969988 (dişli sembolünün varlık kimliği)
  4. Butona varsayılan özelliklerle bir UIAspectRatioConstraint ekleyin (1:1 genişlik-yükseklik oranı).

    SettingsButton butonuna eklenmiş yeni UIAspectRatioConstraint gösteren Explorer penceresi.
  5. Butonun maksimum piksel yüksekliğini sınırlamak için bir UISizeConstraint ekleyin ve MaxSize'ını inf, 44 olarak ayarlayın.

    SettingsButton butonuna eklenmiş yeni UISizeConstraint gösteren Explorer penceresi.
    Yeni UISizeConstraint için beklenen değerleri gösteren Properties penceresi.
    Ekranın üst merkezinde nihai ayarlar butonu.

Ayarlar Menüsünü Oluşturun

Yeni ayarlar butonu, oyuncuların ayarlara veya diğer bilgilere anında erişim sağlaması için bir ayarlar menüsünü açıp kapatmak üzere betimlenecektir. Bu öğreticide, menü arka plan sesinin ve ses efektlerinin ses seviyelerini ayrı olarak ayarlamak için etkileşimli kaydırıcılar içerecektir.

Ayarlar menüsü için kullanılan temel bileşenler.

Ana Çerçeveyi Oluşturun

HUD metreleri oluşturun bölümünde belirtildiği gibi, bir Frame, diğer UI nesneleri için bir konteyner görevi görür. Tüm ayarlar menüsü, durumlu bir nesne olarak, mevcut duruma göre farklılık göstererek girdiye yanıt verme işlemini basit hale getiren tek bir ana çerçeve ile oluşturulacaktır.

  1. HUDContainer'a bir Frame ekleyin ve adını SettingsMenu olarak değiştirin.

    Yeni çerçeve eklenmiş ve SettingsMenu olarak yeniden adlandırıldığı Explorer penceresi.
  2. SettingsMenu seçiliyken aşağıdaki özellikleri ayarlayın:

    Çerçeve yeniden konumlandırıldı, yeniden boyutlandırıldı ve şeffaf lacivert arka planla stil verildi.
  3. SettingsMenu'ya bir UIAspectRatioConstraint ekleyin ve AspectRatio özelliğini 2.5 olarak ayarlayın. (2.5:1 genişlik-yükseklik oranı).

    SettingsMenu çerçevesine eklenmiş yeni UISizeConstraint gösteren Explorer penceresi.
    Yeni UISizeConstraint için beklenen değerleri gösteren Properties penceresi.
  4. SettingsMenu'nin piksel genişliği ve yüksekliğini sınırlamak için bir UISizeConstraint ekleyin. MaxSize'ını 800, inf ve MinSize'ını 350, 0 olarak ayarlayın.

    SettingsMenu çerçevesine eklenmiş yeni UISizeConstraint gösteren Explorer penceresi.
    Yeni UISizeConstraint için beklenen değerleri gösteren Properties penceresi.
    Köşeleri yuvarlatılmış şekilde stil verilmiş çerçeve.

Bir Kaydırıcı Oluşturun

Oyuncuların ses seviyelerini ayarlamalarına izin vermek için ayarlar menüsü, UIDragDetector ile desteklenen iki sürüklenebilir kaydırıcı bileşeni içerecektir; bu kullanılabilir nesne, 2D kullanıcı arayüzü öğeleri ile etkileşimi kolaylaştırır.


İlk kaydırıcı için bir ana konteyner oluşturmak üzere:

  1. SettingsMenu konteynerine yeni bir Frame ekleyin ve adını EffectsVolumeSlider olarak değiştirin.

    EffectsVolumeSlider adında yeni bir çerçeve eklenmiş olan SettingsMenu çerçevesini gösteren Explorer penceresi.
  2. EffectsVolumeSlider çerçevesi seçiliyken aşağıdaki özellikleri ayarlayın:

    • AnchorPoint = 0.5 (merkez noktasını)
    • BackgroundTransparency = 1 (tamamen şeffaf)
    • Position = 0.5, 0, 0.35, 0 (yatay merkez ve konteynerin üstünden %35)
    • Size = 0.8, 0, 0.1, 0 (konteynerin genişliğinin %80'i ve yüksekliğinin %10'u)
    Kaydırıcı bileşenlerini içermek için eklenen boş çerçeve.
  3. EffectsVolumeSlider'a yeni bir UIListLayout ekleyin. Bu düzenleyici, kardeş GuiObjects bileşenlerini yatay satırlara veya dikey sütunlara otomatik olarak yerleştirmek için güçlü bir yol sunar; ayrıca esnek kavramlarını uygulama yeteneğine sahiptir.

    EffectsVolumeSlider çerçevesine eklenmiş yeni UIListLayout gösteren Explorer penceresi.
  4. Yeni UIListLayout için aşağıdaki özellikleri ayarlayın:

Kaydırıcı simgesi

Basit bir simge, ayarlar menüsü açıldığında kaydırıcının amacını oyunculara göstermek için bir ses notası ve "patlama" sembolü içerir.

Ayarlar menüsündeki kaydırıcının amacını gösteren simge.
  1. EffectsVolumeSlider çerçevesine bir ImageLabel ekleyin ve adını Icon olarak değiştirin. Bu simge, oyuncuların kaydırıcının hangi deneyim boyutunu kontrol ettiğini anlamalarına yardımcı olacaktır.

    EffectsVolumeSlider çerçevesine eklenmiş ImageLabel'ı gösteren Explorer penceresi.
  2. Icon seçiliyken, aşağıdaki özellikleri ayarlayın:

    • BackgroundTransparency = 1 (tamamen şeffaf)
    • Size = 2.5, 0, 2.5, 0 (oran kısıtlandığında ana çerçevenin %250'si)
    • Image = rbxassetid://90019827067389 (ses notası ve "patlama" sembolünün varlık kimliği)
  3. Icon'a bir UIAspectRatioConstraint ekleyin ve varsayılan özelliklerini olduğu gibi bırakın (1:1 genişlik-yükseklik).

    ImageLabel'a eklenmiş UIAspectRatioConstraint gösteren Explorer penceresi. Ayarlar menüsünde nihai simge.

Aralık çerçevesi

Simge sağında kaydırıcının etkileşimli kısmı başka bir Frame içinde tutulmalıdır.

Kaydırıcının etkileşimli kısmının hedef boyutu ve konumu.
  1. EffectsVolumeSlider çerçevesine yeni bir Frame ekleyin ve adını SliderFrame olarak değiştirin. Bunun, UIListLayout düzenleyicisinin doğrudan kardeşi olması gerektiğini unutmayın.

    EffectsVolumeSlider çerçevesine eklenmiş yeni çerçeveyi gösteren Explorer penceresi.
  2. SliderFrame seçiliyken aşağıdaki özellikleri ayarlayın:

  3. SliderFrame'e aşağıdaki düzenleyicileri ekleyin:

    • UICorner ile CornerRadius özelliği 0.5, 0 olarak ayarlanmış ("hap" şekli)
    • UISizeConstraint ile MaxSize özelliği inf, 30 olarak ayarlanmış (maksimum 30 piksel yükseklik)
    • UIStroke ile Color 0, Class.UIStroke.Thickness|Thicknessolarak3, Class.UIStroke.Transparency|Transparencyolarak0.25` (şeffaflığın %75'i siyah kenarlık)
    Simge sağında yer alan çerçeve.

Etkileşimli tutamak

Kaydırıcı konteyner oluşturulduktan sonra, şimdi oyuncuların oyun esnasında etkileşimde bulunacakları bir sürüklenebilir tutamak oluşturabilirsiniz.

Etkileşimli kaydırıcı tutamağı.
  1. SliderFrame konteynerine yeni bir Frame ekleyin ve adını Handle olarak değiştirin.

    SliderFrame çerçevesine eklenmiş çocuğu olan yeni çerçeveyi gösteren Explorer penceresi.
  2. Handle seçiliyken aşağıdaki özellikleri ayarlayın:

    • AnchorPoint = 0.5 (merkez noktasını)
    • Position = 0.5, 0, 0.5, 0 (ana çerçevenin yatay ve dikey merkezi)
    • Size = 1.2, 0, 1.2, 0 (oran kısıtlandığında ana çerçevenin %120'si)
    • ZIndex = 3 (tutamak katmanını diğer kaydırıcı bileşenlerinin önünde görsel olarak yerleştirin)
  3. Handle'a aşağıdaki düzenleyicileri ekleyin:

  4. Handle'a bir UIDragDetector nesnesi ekleyin. Bu kullanılabilir nesne, 2D kullanıcı arayüzü öğeleriyle etkileşimde bulunmayı kolaylaştırır ve teşvik eder.

    Handle çerçevesine eklenmiş UIDragDetector'ı gösteren Explorer penceresi.
  5. Yeni UIDragDetector için aşağıdaki özellikleri ayarlayın:

  6. Tutamağın lineer sürükleme aralığını sınırlamak için, BoundingUI özelliğini SliderFrame konteynerine bağlayın:

    1. UIDragDetector'ı seçin.
    2. Properties penceresinde BoundingUI özelliğine tıklayın.
    3. Explorer penceresine döndüğünüzde, tutamağın ebeveyni SliderFrame'e tıklayın.
    Algılayıcının BoundingUI özelliğini SliderFrame konteynerine bağlama sürecini gösteren diyagram.

    BoundingUI özelliği bağlandığında, artık SliderFrame konteynerini yansıtır:

    Algılayıcının BoundingUI özelliğinin SliderFrame konteynerine bağlandığını gösteren Properties penceresi.

Şimdi deneyimini oynatmayı denediğinizde, tutamağı ebeveyn konteynerine göre sola ve sağa sürükleyebilirsiniz:

İç Dolgu

Kaydırıcının 0%-100% aralığını kontrol ettiği daha net bir şekilde göstermek için, tutamağın değişken pozisyonuyla senkronize olacak bir iç dolgu ekleyebilirsiniz.

SliderFrame'e eklenmiş iç dolgu.
  1. SliderFrame konteynerine yeni bir Frame ekleyin ve adını InnerFill olarak değiştirin.

    SliderFrame içerisindeki InnerFill çerçevesini gösteren Explorer penceresi.
  2. InnerFill çerçevesi için aşağıdaki özellikleri ayarlayın:

    • AnchorPoint = 0, 0.5 (sol kenar ve dikey merkez)
    • BackgroundColor3 = [0, 150, 255] (kaydırıcının tutamağı ile uyumlu mavi)
    • BackgroundTransparency = 0.35 (şeffaflığın %65'i)
    • Position = 0, 0, 0.5, 0
    • Size = 0.5, 0, 1, 0 (çerçevenin %50'si genişlik ve %100'ü yükseklik)
    • ZIndex = 2 (ana çerçevenin dolgu/kenarlığının önünde görsel katman)
  3. Ana SliderFrame konteynerinin "hap" şeklini eşleştirmek için bir UICorner düzenleyicisi ekleyin ve CornerRadius özelliğini 0.5, 0 olarak ayarlayın.

    InnerFill çerçevesine eklenmiş UICorner gösteren Explorer penceresi.
    Yeni UICorner için beklenen değerleri gösteren Properties penceresi.
    İç dolgu çerçevesi mavi arka plan ve yuvarlak köşelerle stillendirilmiştir.

Kaydırıcıyı Kopyalayın

İlk kaydırıcı oluşturulduğunda, kolayca kopyalayabilir ve başka bir amacını belirtmek için bazı görsel yönlerini değiştirebilirsiniz; bu durumda arka plan sesinin hacim seviyesini simgeleyen müzik notaları içeren bir simge ile gösterilecektir.

Arka plan ses kaydırıcısının hedef konumu.
  1. Tamamlanan EffectsVolumeSlider nesnesini seçin.

    Tamamlanmış EffectsVolumeSlider seçilmiş gösteren Explorer penceresi.
  2. Bunu çoğaltın (CtrlD veya D) ve çoğaltmayı BackgroundVolumeSlider olarak yeniden adlandırın.

    BackgroundVolumeSlider adında çoğaltılmış kaydırıcıyı gösteren Explorer penceresi.
  3. Şu özelliği değiştirin: Position öğesini 0.5, 0, 0.7, 0 olarak ayarlayın ve böylece ilk kaydırıcının altına yerleştirin.

    EffectsVolumeSlider'ın altında konumlandırılmış BackgroundVolumeSlider.
  4. BackgroundVolumeSlider'ın en üst dalını genişletin, Icon resim etiketini seçin ve Image özelliğini rbxassetid://101125859760167 (müzik notalarının sembolünün varlık kimliği) olarak değiştirin.

    BackgroundVolumeSlider içindeki Icon etiketini gösteren Explorer penceresi.
    Icon etiketi için beklenen değerleri gösteren Properties penceresi.
    Değiştirilen simge resmi ile BackgroundVolumeSlider.
  5. SliderFrameHandle dalını genişletin, içindeki UIStroke düzenleyicisini seçin ve Color özelliğini [255, 0, 125] (macenta) olarak ayarlayın.

    BackgroundVolumeSlider'ın tutamakları içindeki UIStroke düzenleyicisini gösteren Explorer penceresi.
    BackgroundVolumeSlider'daki UIStroke düzenleyicisinde beklenen değerleri gösteren Properties penceresi.
    Arka plan ses kaydırıcısı, değiştirilmiş simge resmi.
  6. SliderFrame içinde InnerFill çerçevesini seçin ve BackgroundColor3 özelliğini aynı macenta rengine ([255, 0, 125]) değiştirin.

    BackgroundVolumeSlider içindeki InnerFill çerçevesini gösteren Explorer penceresi.
    InnerFill çerçevesinde beklenen değerleri gösteren Properties penceresi.
    Değiştirilmiş InnerFill rengine sahip BackgroundVolumeSlider.

Kapatma Butonunu Oluşturun

Ayarlar menüsünün son öğesi, oyunculara menüyü kapatmak için ek bir giriş sağlayan bir kapatma butonudur (ekranın üst merkezindeki SettingsButton benzer işlevi görecektir).

Ayarlar menüsünü gösteren ve üst sağ köşede kapatma butonunu işaret eden görüntü.
  1. SettingsMenu konteynerine yeni bir ImageButton ekleyin ve adını CloseButton olarak değiştirin.

    SettingsMenu'ya eklenmiş yeni bir ImageButton'ı gösteren Explorer penceresi. Ayarlar menüsünün üst köşesinde yerleştirilmiş boş ImageButton.
  2. CloseButton seçiliyken aşağıdaki özellikleri ayarlayın:

    • AnchorPoint = 1, 0 (üst sağ köşe)
    • BackgroundTransparency = 1 (tamamen şeffaf)
    • Position = 1, -10, 0, 10 (üst sağ köşeden 10 piksel içe)
    • Size = 0.15, 0, 0.15, 0 (oran kısıtlandığında çerçeve yüksekliğinin %15'i)
    • Image = rbxassetid://5577404210 (kapatma butonu sembolünün varlık kimliği)
    • ImageTransparency = 0.25 (şeffaflığın %75'i)
  3. Butona varsayılan özelliklerle bir UIAspectRatioConstraint ekleyin (1:1 genişlik-yükseklik).

    CloseButton'a eklenmiş UIAspectRatioConstraint'ı gösteren Explorer penceresi. Nihai kapatma butonu, ayarlar menüsünün sağ üst köşesinde.

Kontrol Modüllerini Oluşturun

Genişletilebilir bir kontrol modülü kurulumu, etkileşimli UI yönetimini, her nesne içine yerleştirilecek olan bireysel betiklerin yerine daha düzenli hale getirir. ModuleScripts, istemci-sunucu sınırının farklı tarafları arasında veya sınırın aynı tarafında kodu yeniden kullanmanıza izin vererek bu genişletilebilir işlevselliği kolaylaştırır.

Durumlu nesne denetleyicisi

Aşağıdaki durumlu nesne denetleyici modülü, UI nesnelerine, örneğin SettingsButton ve SettingsMenu gibi davranışlar eklemenizi sağlar ve çeşitli durumlar arasında kolayca geçiş yapabilirsiniz. Modülü oluşturmak için:

  1. ReplicatedStorage konteynerine bir ModuleScript ekleyin ve adını StatefulObjectController olarak değiştirin.
ReplicatedStorage konteyneri içerisindeki StatefulObjectController modülünü gösteren Explorer penceresi.
  1. Modül içerisine aşağıdaki kodları yapıştırın:

    StatefulObjectController

    local TweenService = game:GetService("TweenService")
    local StatefulObjectController = {}
    StatefulObjectController.__index = StatefulObjectController
    export type StateName = string
    export type State = {
    transition: TweenInfo,
    properties: { [string]: any },
    }
    function StatefulObjectController.hydrate(props: {
    object: Instance,
    states: { [StateName]: State },
    initialStateName: StateName
    })
    local object, states, initialStateName = props.object, props.states, props.initialStateName
    local self = setmetatable({
    states = states,
    currentStateName = initialStateName,
    tweens = {},
    }, StatefulObjectController)
    -- Create tweens for reuse to avoid making new tweens every time state is changed
    for stateName, state in states do
    self.tweens[stateName] = TweenService:Create(object, state.transition, state.properties)
    end
    self:setState(self.currentStateName)
    return self
    end
    function StatefulObjectController:setState(stateName: StateName)
    local stateTween: Tween = self.tweens[stateName]
    if not stateTween then
    warn(string.format("Attempted to set %s to unknown state '%s'", self.object:GetFullName(), stateName))
    return
    end
    self.currentStateName = stateName
    -- Make sure other tweens aren't conflicting
    for _, tween in self.tweens do
    tween:Cancel()
    end
    stateTween:Play()
    end
    return StatefulObjectController
    SıraAmaç
    610Bu modülü kullanırken otomatik tamamlama ve linting'i iyileştirmek için Luau türlerini tanımlar ve dışa aktarır.
    1233Bir durumlu UI nesnesi oluşturmak için kullanılan işlevdir, GuiObject'u object olarak kabul eder, durumlar ve bunların ilgili TweenInfo verileri ile bir tablodur ve bir başlangıç durumu adı alır. Bu işlevin içinde, satırlar 2628 her durum için Tweens oluşturur ve satır 30, modülün setState() işlevini çağırarak nesneyi başlangıç durumuna getirir.
    3550Bir durumlu nesnenin durumunu ayarlamak için kullanılan işlevdir. İçinde, satırlar 5354 nesnenin konumunun ve iç dolgu boyutunun eşleşmesini sağlarken ve satır 57 son değişiklik değerini geribildirim fonksiyonuna gönderir.

Kaydırıcı denetleyicisi

Ek bir modül, iki ses kaydırıcısını başlatır ve kontrol eder. Ayrıca, kaydırıcıyla oyuncu etkileşimini algılamak ve deneyimde istenen değişiklikleri uygulamak için her kaydırıcıya bir geri çağırma işlevi bağlamanıza olanak tanır.

  1. ReplicatedStorage konteynerine bir ModuleScript ekleyin ve adını SliderController olarak değiştirin.

    ReplicatedStorage konteyneri içerisindeki SliderController modülünü gösteren Explorer penceresi.
  2. Modül içerisine aşağıdaki kodları yapıştırın:

    SliderController

    local SliderController = {}
    SliderController.__index = SliderController
    export type Value = number
    export type OnChanged = (Value) -> ()
    function SliderController.hydrate(props: {
    object: Instance,
    onChanged: OnChanged,
    initialValue: Value?
    })
    local object, onChanged, initialValue = props.object, props.onChanged, props.initialValue
    local handle = object:FindFirstChild("Handle", true)
    if not handle then
    warn(string.format("Attempted to hydrate slider %s but couldn't find Handle", object:GetFullName()))
    end
    local innerFill = object:FindFirstChild("InnerFill", true)
    if not innerFill then
    warn(string.format("Attempted to hydrate slider %s but couldn't find InnerFill", object:GetFullName()))
    end
    local dragDetector = handle:FindFirstChildWhichIsA("UIDragDetector")
    if not dragDetector then
    warn(string.format("Attempted to hydrate slider %s but couldn't find UIDragDetector", object:GetFullName()))
    end
    local self = setmetatable({
    handle = handle,
    innerFill = innerFill,
    dragDetector = dragDetector,
    value = initialValue or 0.5,
    onChanged = onChanged,
    }, SliderController)
    -- Set initial value
    self:setValue(self.value)
    -- Connect detector to player manipulation
    self.dragConnection = dragDetector.DragContinue:Connect(function()
    self:setValue(handle.Position.X.Scale)
    end)
    return self
    end
    function SliderController:setValue(value: Value)
    local clampedValue = math.clamp(value, 0, 1)
    self.value = clampedValue
    -- Update the handle position and inner frame size to match
    self.handle.Position = UDim2.fromScale(clampedValue, 0.5)
    self.innerFill.Size = UDim2.fromScale(clampedValue, 1)
    -- Run the user's callback with the latest value
    local changeSuccess, changeResult = pcall(self.onChanged, clampedValue)
    if not changeSuccess then
    warn("Error in slider callback:", changeResult)
    end
    end
    return SliderController
    SıraAmaç
    746Kaydırıcı bileşeninin davranışını başlatmak ve eklemek için kullanılan işlevdir. Frame'in ebeveyni olarak object kabul eder, kaydırıcı değişikliklerini işlemek için bir onChanged geri çağırma işlevi ve kaydırıcının kolu pozisyonu için bir başlangıç değeri alır. İşlevin içinde 1427 satırları, kaydırıcının tutamağını, iç dolgusunu ve UIDragDetector bileşenlerinin varlığı olduğundan emin olur. Satır 38, modülün setValue() işlevini çağırır ve satır 4143, sürükleyicinin DragContinue olayını modülün setValue() işlevine bağlar (bu satır için aşağıda daha fazla bilgi verilmiştir).
    4861Kaydırıcının değerini ayarlamak için kullanılan işlevdir. İşlevin içinde, 5354 satırları, tutamağın konumunu ve iç dolgu boyutunu eşleştirir. Satır 57, değişmiş olan değeri geri çağırma fonksiyonuna iletir, böylece değeri istediğiniz gibi kullanabilirsiniz.

Ayarlar Betiğini Oluşturun

ayarlar butonu ve ayarlar menüsü tamamlandığında, hepsini birleştirecek bir betik oluşturabilirsiniz; bu betik kontrol modüllerini kullanır.

  1. HUDContainer'e yeni bir LocalScript ekleyin ve amacını açıklamak için adını SettingsScript olarak değiştirin. Bu betiğin SettingsMenu ve SettingsButton ile aynı seviyede (kardeş) olması gerektiğini unutmayın; çünkü yöneteceği üst düzey UI nesneleridir.

    HUDContainer konteynırındaki SettingsScript betiğini gösteren Explorer penceresi.
  2. Betik içerisine aşağıdaki kodları yapıştırın:

    SettingsScript

    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local SoundService = game:GetService("SoundService")
    local SliderController = require(ReplicatedStorage.SliderController)
    local StatefulObjectController = require(ReplicatedStorage.StatefulObjectController)
    local HUDContainer = script.Parent
    -- Initialize settings button
    local settingsButton = StatefulObjectController.hydrate({
    object = HUDContainer:FindFirstChild("SettingsButton"),
    states = {
    menuOpen = {
    transition = TweenInfo.new(0.5, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out),
    properties = {
    Rotation = 45,
    },
    },
    menuClosed = {
    transition = TweenInfo.new(0.5, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out),
    properties = {
    Rotation = 0,
    },
    },
    },
    initialStateName = "menuClosed"
    })
    -- Initialize settings menu frame
    local settingsMenu = StatefulObjectController.hydrate({
    object = HUDContainer:FindFirstChild("SettingsMenu"),
    states = {
    menuOpen = {
    transition = TweenInfo.new(0.5, Enum.EasingStyle.Bounce, Enum.EasingDirection.Out),
    properties = {
    Position = UDim2.fromScale(0.5, 0.5),
    Visible = true,
    },
    },
    menuClosed = {
    transition = TweenInfo.new(0),
    properties = {
    Position = UDim2.fromScale(0.5, 0.4),
    Visible = false,
    },
    },
    },
    initialStateName = "menuClosed"
    })
    -- Initialize effects volume slider
    local effectsAudio = SoundService:FindFirstChild("Effects")
    local effectsVolumeSlider = SliderController.hydrate({
    object = HUDContainer:FindFirstChild("EffectsVolumeSlider", true),
    initialValue = effectsAudio and effectsAudio.Volume or 0.5,
    onChanged = function(value: SliderController.Value)
    if effectsAudio then
    effectsAudio.Volume = value
    end
    end,
    })
    -- Initialize background volume slider
    local backgroundAudio = SoundService:FindFirstChild("Background")
    local backgroundVolumeSlider = SliderController.hydrate({
    object = HUDContainer:FindFirstChild("BackgroundVolumeSlider", true),
    initialValue = backgroundAudio and backgroundAudio.Volume or 0.5,
    onChanged = function(value: SliderController.Value)
    if backgroundAudio then
    backgroundAudio.Volume = value
    end
    end,
    })
    -- Connect buttons to player interaction
    HUDContainer:FindFirstChild("SettingsButton").Activated:Connect(function()
    local targetState = if settingsButton.currentStateName == "menuClosed"
    then "menuOpen"
    else "menuClosed"
    settingsButton:setState(targetState)
    settingsMenu:setState(targetState)
    end)
    HUDContainer:FindFirstChild("CloseButton", true).Activated:Connect(function()
    settingsButton:setState("menuClosed")
    settingsMenu:setState("menuClosed")
    end)
  3. Betiğin takip eden bölümlerini inceleyerek, betiğin kontrol modüllerini nasıl kullandığını keşfedin.

    10-27 satırları, ayarlar butonu için davranışı başlatır ve ekler, şu şekilde:

    SıraAmaç
    1011Yerel settingsButton referansı tanımlanır ve StatefulObjectController.hydrate() fonksiyonu ile beslenir; SettingsButton butonu HUDContainer içinde referans olarak kullanılır.
    1225İki benzersiz durum, menuOpen ve menuClosed ile birlikte geçen bir states tablosu geçilir. Her durum, belirli özelliklerine ulaşma yöntemini tanımlamak için bir geçiş ile birlikte (bir TweenInfo aracılığıyla) tanımlanır. Bu durumda, menuOpen, butonun Rotation değerini 45° olarak değiştirir ve geçiş süresi Exponential olarak ve yarım saniye kadar tanımlanır; buna karşılık, menuClosed butonu 0 konumuna geri döndürür.
    26Butonun ilk durumu menuClosed olarak ayarlanır (bu, states tablosundaki herhangi bir durum adıyla ayarlanabilir).

    Betiğin ilerleyen kısımlarında (satırlar 76-86), butonlar oyunun etkileşimine bağlanarak UI durum değişikliklerini tetikler:

    SıraAmaç
    7682SettingsButton'ın Activated etkinliğine bağlı olup anonim bir fonksiyonu çağırır. Bu anonim fonksiyon içinde, targetState değişkeni menuOpen ve menuClosed arasında geçiş yapar. Satır 80, setState() fonksiyonunu çağırarak butonun durumunu targetState olarak ayarlar ve satır 81, SettingsMenu için aynı işlemi yaparak menünün açılıp kapanmasını sağlar.
    8386CloseButton, Activated olayına bağlanarak, iki durumda da SettingsButton ve SettingsMenu'nun durumunu menuClosed olarak ayarlar.

    30-49 satırları, ayarlar menüsü için davranışı başlatır ve ekler, şu şekilde:

    SıraAmaç
    3031Yerel bir settingsMenu referansı tanımlanır ve StatefulObjectController.hydrate() fonksiyonu ile beslenir, SettingsMenu çerçevesi HUDContainer içinde referans olarak kullanılır.
    3246Ayarlar butonundaki gibi, iki benzersiz durum olan menuOpen ve menuClosed ile bir states tablosu aynı şekilde geçirilir. Burada, menuOpen, çerçevenin Position'unda bir durum değişimi tanımlar; bu, 0.5, 0.5 konumuna geçiş yapar ve Bounce geçiş süresi yarım saniyedir; Visible değişkeni yalnızca true olarak güncellenir. Bunun tam tersine, menuClosed, çerçevenin pozisyona olan durumunu değiştirir; UDim2.fromScale(0.5, 0.4)'ya karşılık gelir ve Visible durumu false doğrulanır. Ancak, TweenInfo sıfır süreyle belirlendiği için, bu durum anında kapanır.
    48Çerçevenin ilk durumu menuClosed olarak belirlenir.

    Betiğin ilerleyen kısımlarında (satırlar 76-86), ayarlar menüsü oyunun etkileşimine bağlanır:

    SıraAmaç
    81SettingsMenu için aynı targetState ayarlanarak, SettingsButton'ın tetiklenmesi ile senkronize olması sağlanır.
    85CloseButton etkinleştirildiğinde, SettingsMenu durumunu menuClosed olarak ayarlar.

    51-73 satırları, EffectsVolumeSlider ve BackgroundVolumeSlider'e davranış eklemek için kullanılır, şu şekilde:

    SıraAmaç
    52SoundService içindeki Effects SoundGroup'una yerel bir referans gösterilir. Bir SoundGroup, birden fazla Sounds nesnesiyle ilişkili olmanızı sağlar ve bu seslerin tüm sesini, grubun Volume özelliği aracılığıyla kontrol etmenize imkân sağlar.
    5354Yerel bir effectsVolumeSlider referansı tanımlanır ve SliderController.hydrate() fonksiyonu ile beslenir; EffectsVolumeSlider çerçevesi HUDContainer ⟩ SettingsMenu içinde referans olarak kullanılır. true ikinci parametresi, FindFirstChild() metodunun, HUDContainer dalı boyunca EffectsVolumeSlider içindeki bileşeni bulmasını sağlayan bir özelliktir.
    55Kaydırıcının başlangıç değeri, Effects ses grubunun mevcut Volume değerine veya 0.5 olarak belirlenir.
    5660Kaydırıcı değeri değişikliklerini, Effects ses grubunun sesine uygulamak için geri çağırma fonksiyonu oluşturulur.
    6473Temel olarak, 52-61 satırlarının aynı işleminde, ancak HUDContainer ⟩ SettingsMenu içindeki BackgroundVolumeSlider çerçevesinde ve kaydırıcı değerinin Background ses grubunun sesine uygulanmasını sağlandığı bir başlangıç değeri ayarlanır.

Artık SettingsScript yerleştirildiğinde, deneyim artık ilgili bir dizi UI nesnesini oyuncu etkileşimine bağlayan tamamen işlevsel bir etkileşimli UI örneği sunmaktadır.

©2026 Roblox Corporation. Roblox, the Roblox logo and Powering Imagination are among our registered and unregistered trademarks in the U.S. and other countries.