Bu bölümde, burada Unreal Engine ile geliştirdiğimiz projeye görev takip sistemi eklemeye çalışacağız.
Görev takip sistemi, bir oyunda oyunculara belirli hedefler ve görevler atayarak, bu hedeflere ulaştıklarında ödüllendirilmesini sağlayan bir oyun mekaniğidir. Bu sistem, oyuncunun ilerlemesini düzenler, hikayeyi ve oyun akışını yönlendirir. Daha basit bir ifadeyle, bir görev takip sistemi, oyundaki "yapılacaklar listesi" gibidir. Bu liste, oyuncuya ne yapması gerektiğini, nerede yapması gerektiğini ve bu görevi tamamladığında ne kazanacağını gösterir.
Görev takip sisteminin temel unsurları
Bir görev takip sistemini oluşturan ana unsurlar şunlardır:
- Görevin tanımı: Görevin adı, hikayesi, oyuncuya ne yapması gerektiği gibi bilgileri içerir. (Örnek: "Kadim Kılıcı Bul")
- Hedefler: Görevi tamamlamak için yerine getirilmesi gereken somut adımlardır. (Örnek: "1. Karanlık Ormana Git", "2. Yüce Ejderhayı Yen", "3. Kılıcı Al")
- İlerleme durumu: Görevin mevcut durumunu gösterir. (Örnek: "Başlamadı", "Devam Ediyor", "Tamamlandı", "Başarısız")
- Ödüller: Görev tamamlandığında oyuncuya verilen nesneler, deneyim puanları veya para gibi teşviklerdir. (Örnek: "Altın", "Tecrübe Puanı", "Yeni Bir Silah")
- Kullanıcı Arayüzü (UI): Oyuncunun aktif görevlerini, hedeflerini ve ilerlemesini takip etmesini sağlayan oyun içi arayüzüdür. Genellikle bir görev günlüğü veya ekranda beliren bir mini-görev listesi şeklinde görülür.
Görev takip sisteminin faydaları
Görev takip sistemi, oyun tasarımında kritik bir role sahip olup en faydalı özellikleri aşağıdadır:
- Oyunculara ne yapmaları gerektiği konusunda net bir yol haritası sunar. Bu sayede oyuncular, açık dünya gibi büyük oyun ortamlarında kaybolmadan ilerleyebilirler.
- Belirli bir hedefe ulaşma ve ödül kazanma beklentisi, oyuncuyu oyuna devam etmeye motive eder.
- Görevler, oyunun ana hikayesini veya yan hikayelerini anlatmak için güçlü bir araçtır.
- Oyuncu, her görevi tamamladığında bir başarı hissi yaşar ve karakterinin güçlendiğini veya hikayenin ilerlediğini görür.
Görev takip sistemi, oyuncu deneyimini daha akıcı, anlamlı ve ödüllendirici hale getiren temel bir oyun mekaniğidir.
Oyunlarda görev takip sistemi başladığında, oyuncu tarafından yapılacak görevleri ekranda göstermek ve yapılan işlemleri takip etmek amacıyla aşağıdaki adımları sırasıyla gerçekleştirelim:
1. "Content\Game\Blueprints" dizini içinde iken, sağ tıklayınca açılan menüden "Blueprint -> Structure" seçeneği ile bir nesne oluşturarak adını "S_Quest" olarak değiştirelim.
2. "S_Quest" nesnesini çift tıklayarak açalım.
- "MemberVar_0" nesnesinin adını "QuestName" ve veri türünü "Name" olarak değiştirelim.
- "+ Add Variable" butonu ile ikinci bir değişken oluşturalım ve adını "QuestDescription" ve veri türünü "Name" olarak belirleyelim.
1. "Content\Game\Blueprints" dizini içinde iken, sağ tıklayınca açılan pencerenin en üstteki arama satırına "Table" yazdığımızda çıkan "Data Table" seçeneğini seçelim.
2. Karşımıza gelen "Pick Row Structure" penceresinin seçme kutusunda "S_Quest" değerini seçelim ve "OK" butonuna tıklayarak bir "Data Table" oluşturalım ve adını "DT_Quest" olarak değiştirelim.
3. "DT_Quest" tablosunu çift tıklayarak açarak, "+ Add" butonu ile 6 satır ekleyelim ve aşağıda gösterilen verileri girip kaydedelim:
1. "Content\Game\UI" dizini içinde iken, sağ tıklayınca açılan menüden "User Interface -> Widget Blueprint" seçeneği ile açılan pencerede, "User Widget" butonuna tıklayarak yeni bir nesne oluşturalım ve adını "WBP_Quest" olarak değiştirelim.
2. "WBP_Quest" penceresinde,
- Sol üst satıra "CanvasPanel" yazdığımızda çıkan değeri sürükleyip sol alttaki "WBP_Quest" altına veya sahneye bırakalım.
- Bir adet "Text" nesnesi sürükleyip "Canvas Panel" içine bırakalım.
- Adı -> "ActiveQuestName"
- Is Variable -> İşaretli
- Font Size -> 28
- Position X -> 40
- Position Y -> 40
- Text -> Active Quest
- "ActiveQuestName" değişkeninin bir kopyasını oluşturalım.
- Adı -> "ActiveQuestDescription"
- Is Variable -> İşaretli
- Font Typeface -> Regular
- Font Size -> 18
- Position X -> 76
- Position Y -> 100
- Text -> "Your mission"
- "ActiveQuestName" değişkeninin bir kopyasını oluşturalım.
- Name -> "QuestCompleted"
- Is Variable -> İşaretsiz
- Anchors -> Top Center
- Position X -> 0
- Position Y -> 133,5
- Size X -> 675
- Size Y -> 80
- Alignment -> 0,5 0,5
- Justification -> Center
- Font Size -> 48
- Text -> "Quest completed"
- Bir "Vertical Box" sürükleyip "Canvas Panel" sağ üst köşesine bırakalım ve adını "VerticalBoxQuest" olarak değiştirelim.
- "Anchors" değerini sağ üst olarak ayarlayalım.
- "VerticalBoxQuest" içine 6 adet "Text" nesnesi yerleştirelim ve "Name", "Text", "Padding Bottom" ve "Font Size" değerlerini aşağıdaki şekilde değiştirip "Is Variable" değişkenlerini işaretleyelim:
- TextQuests, Quests, 10, 24
- TextQuest1, 1. Destroy the sphere!, 5, 14
- TextQuest2, 2. Turn on the first lamp!, 5, 14
- TextQuest3, 3. Turn on the second lamp by triggering the cube!, 5, 14
- TextQuest4, 4. Turn on the lamp group by triggering the button!, 5, 14
- TextQuest5, 5. Enter the room!, 5, 14
- "Window -> Animations" menüsü ile altta animasyon penceresi açalım.
- "QuestCompleted" nesnesi seçili iken, "+ Animation" butonuna tıklayarak yeni bir animasyon oluşturalım ve adını "QuestCompletedNotification" olarak değiştirelim.
- "QuestCompletedNotification" nesnesi seçili iken,
- "Details" sekmesinde, "Color and Opacity" altında "A" değerini 0 yapalım ve sağ taraftaki karo butonuna tıklayarak bir "Key frame" ekleyelim.
- Sağ alttaki kırmızı renkli çubuğu 0,50 değerine getirelim.
- "A" değerini 1 yapalım ve sağ taraftaki karo butonuna tıklayarak bir "Key frame" daha ekleyelim.
- Sağ alttaki kırmızı renkli çubuğu 1,30 değerine getirelim.
- "A" değerini 1 yapalım ve sağ taraftaki karo butonuna tıklayarak bir "Key frame" daha ekleyelim.
- Sağ alttaki kırmızı renkli çubuğu 2,00 değerine getirelim.
- "A" değerini 0 yapalım ve sağ taraftaki karo butonuna tıklayarak bir "Key frame" daha ekleyelim.
- "Active Quest Name" nesnesini seçelim.
- "+ Add" butonuna tıklayınca açılan menüden "Active Quest Name" değerini seçelim. Alttaki pencerenin en üst satırına "ActiveQuestName" satırı eklenir.
- "Details" sekmesinde, "Color and Opacity" altında "A" değerini 1 yapalım ve sağ taraftaki karo butonuna tıklayarak bir "Key frame" ekleyelim.
- Sağ alttaki kırmızı renkli çubuğu 0,50 değerine getirelim.
- "A" değerini 0 yapalım ve sağ taraftaki karo butonuna tıklayarak bir "Key frame" daha ekleyelim.
- "ActiveQuestDescription" nesnesini seçelim.
- "+ Add" butonuna tıklayınca açılan menüden "Active Quest Desscription" değerini seçelim. Alttaki pencerenin en üst satırına "ActiveQuestDesscription" satırı eklenir.
- "Details" sekmesinde, "Color and Opacity" altında "A" değerini 1 yapalım ve sağ taraftaki karo butonuna tıklayarak bir "Key frame" ekleyelim.
- Sağ alttaki kırmızı renkli çubuğu 0,50 değerine getirelim.
- "A" değerini 0 yapalım ve sağ taraftaki karo butonuna tıklayarak bir "Key frame" daha ekleyelim.
- Kırmızı çubuk 0'da iken, "Active Quest Name" ve "Active Quest Dessription" yazıları ekranda görünür. 0,50 değerine ilerlerken görünen yazılar yavaşca kaybolur ve "Quest Completed" yazısı ekranda belirir. 0,50-1,30 arasında yazı ekranda kalırken, 1,30-2,00 arasında yavaçca kaybolur.

Projede yer alan tüm Actor'ları sıra ile düzenleyelim:
1. "BP_Sphere" penceresinde,
- Sol altta, "EVENT DISPATCHERS" satırının sağındaki + butonuna tıklayarak bir nesne oluşturalım ve adını "OnSphereDestroyed" olarak değiştirelim.
- "OnSphereDestroyed" nesnesi seçili iken, "Details" sekmesinin "Inputs" satırının sağındaki + butonu ile, "Integer" veri türünden "QuestNo" adlı bir değişken oluşturalım.
- "EventGraph" sekmesinde, "Event Interact" zincirinde,
- "Event Interact" kutusu ile "Destroy Actor" kutusu arasında bir "Branch" kutusu yerleştirelim.
- "questNoRef" değişkeni ile sahnede bir "GET" kutusu oluşturalım.
- "Quest No Ref" kutusundan "Get Quest No" kutusu oluşturalım.
- "Quest No" kutusunun çıkışından bir "==" kutusu (Değeri 1) oluşturalım.
- "==" kutusunun çıkışını "Branch" kutusunun "Condition" portuna bağlayalım
- En sondaki "Print String" kutusunun sağına, "questNoRef" değişkeni ile sahnede bir "GET" kutusu oluşturalım.
- "Quest No Ref" kutusundan "Set Quest No" kutusu oluşturup "Quest No" değerini 2 yapalım ve "Print String" kutusunun çıkışını bu kutunun girişine bağlayalım.
- "OnSphereDestroyed" nesnesini sürükleyip, "Quest No SET" kutusunun sağına bırakalım. Açılan menüden "Call" seçeneğini seçelim.
- "Quest No SET" kutusunun çıkışını "Call On Sphere Destroyed" kutusuna ve sağ alt port çıkışını "Quest No" girişine bağlayalım.

2. "BP_Light" penceresinde,
- Sol altta, "EVENT DISPATCHERS" satırının sağındaki + butonuna tıklayarak bir nesne oluşturalım ve adını "OnLightOn" olarak değiştirelim.
- "OnLightOn" nesnesi seçili iken, "Details" sekmesinin "Inputs" satırının sağındaki + butonu ile, "Integer" veri türünden "QuestNo" adlı bir değişken oluşturalım.
- "EventGraph" sekmesinde, "Event Interact" zincirinde,
- "Event Interact" kutusunun çıkışından bir "Branch" kutusu oluşturalım.
- "questNoRef" değişkeni ile sahnede bir "GET" kutusu oluşturalım.
- "Quest No Ref" kutusundan "Get Quest No" kutusu oluşturalım.
- "Quest No" kutusunun çıkışından bir "==" kutusu (Değeri 2) oluşturalım.
- "==" kutusunun çıkışını "Branch" kutusunun "Condition" portuna bağlayalım
- "Quest No Ref" kutusundan "Set Quest No" kutusu oluşturup "Quest No" değerini 3 yapalım ve "Branch" kutusunun "True" çıkışını bu kutuya bağlayalım.
- "Branch" kutusunun "False" çıkışını "Set Visibility" kutusunun girişine bağlayalım.
- "OnLightOn" nesnesini sürükleyip, "Quest No SET" kutusunun sağına bırakalım. Açılan menüden "Call" seçeneğini seçelim.
- "Quest No SET" kutusunun çıkışını "Call On Light On" kutusuna ve sağ alt port çıkışını "Quest No" girişine bağlayalım.
- "Call On Light On" kutusunun çıkışını "Set Visibility" kutusunun girişine bağlayalım.

3. "BP_Cube" penceresinde,
- Sol altta, "EVENT DISPATCHERS" satırının sağındaki + butonuna tıklayarak bir nesne oluşturalım ve adını "OnCubeTriggered" olarak değiştirelim.
- "OnCubeTriggered" nesnesi seçili iken, "Details" sekmesinin "Inputs" satırının sağındaki + butonu ile, "Integer" veri türünden "QuestNo" adlı bir değişken oluşturalım.
- "EventGraph" sekmesinde, "Event Interact" zincirinde,
- "Event Interact" kutusunun çıkışından bir "Branch" kutusu oluşturalım.
- "questNoRef" değişkeni ile sahnede bir "GET" kutusu oluşturalım.
- "Quest No Ref" kutusundan "Get Quest No" kutusu oluşturalım.
- "Quest No" kutusunun çıkışından bir "==" kutusu (Değeri 3) oluşturalım.
- "==" kutusunun çıkışını "Branch" kutusunun "Condition" portuna bağlayalım
- "Quest No Ref" kutusundan "Set Quest No" kutusu oluşturup "Quest No" değerini 4 yapalım ve "Branch" kutusunun "True" çıkışını bu kutuya bağlayalım.
- "Branch" kutusunun "False" çıkışını "Print String" kutusunun girişine bağlayalım.
- "OnCubeTriggered" nesnesini sürükleyip, "Quest No SET" kutusunun sağına bırakalım. Açılan menüden "Call" seçeneğini seçelim.
- "Quest No SET" kutusunun çıkışını "Call On Cube Triggered" kutusuna ve sağ alt port çıkışını "Quest No" girişine bağlayalım.
- "Call On Cube Triggered" kutusunun çıkışını "Print String" kutusunun girişine bağlayalım.

4. "BP_Button" penceresinde,
- Sol altta, "EVENT DISPATCHERS" satırının sağındaki + butonuna tıklayarak bir nesne oluşturalım ve adını "OnButtonActive" olarak değiştirelim.
- "OnButtonActive" nesnesi seçili iken, "Details" sekmesinin "Inputs" satırının sağındaki + butonu ile, "Integer" veri türünden "QuestNo" adlı bir değişken oluşturalım.
- "EventGraph" sekmesinde, "Event Interact" zincirinde,
- "Event Interact" kutusunun çıkışından bir "Branch" kutusu oluşturalım.
- "questNoRef" değişkeni ile sahnede bir "GET" kutusu oluşturalım.
- "Quest No Ref" kutusundan "Get Quest No" kutusu oluşturalım.
- "Quest No" kutusunun çıkışından bir "==" kutusu (Değeri 4) oluşturalım.
- "==" kutusunun çıkışını "Branch" kutusunun "Condition" portuna bağlayalım
- "Quest No Ref" kutusundan "Set Quest No" kutusu oluşturup "Quest No" değerini 5 yapalım ve "Branch" kutusunun "True" çıkışını bu kutuya bağlayalım.
- "OnButtonActive" nesnesini sürükleyip, "Quest No SET" kutusunun sağına bırakalım. Açılan menüden "Call" seçeneğini seçelim.
- "Quest No SET" kutusunun çıkışını "Call On Button Active" kutusuna ve sağ alt port çıkışını "Quest No" girişine bağlayalım.
- "Call On Button Active" kutusunun çıkışını "Call On Button Triggered" kutusuna bağlayalım.
- "Branch" kutusunun "False" çıkışını "Call On Button Triggered" kutusunun girişine bağlayalım.
- "Call On Button Triggered" kutusunun çıkışını "Print String" kutusunun girişine bağlayalım.

5. "BP_Door" penceresinde,
- Sol altta, "EVENT DISPATCHERS" satırının sağındaki + butonuna tıklayarak bir nesne oluşturalım ve adını "OnDoorOpen" olarak değiştirelim.
- "OnDoorOpen" nesnesi seçili iken, "Details" sekmesinin "Inputs" satırının sağındaki + butonu ile, "Integer" veri türünden "QuestNo" adlı bir değişken oluşturalım.
- "EventGraph" sekmesinde, "Event Interact" zincirinde,
- "Branch" kutusunun "True" portundan bir "Branch" kutusu oluşturalım.
- "questNoRef" değişkeni ile sahnede bir "GET" kutusu oluşturalım.
- "Quest No Ref" kutusundan "Get Quest No" kutusu oluşturalım.
- "Quest No" kutusunun çıkışından bir "==" kutusu (Değeri 5) oluşturalım.
- "==" kutusunun çıkışını "Branch" kutusunun "Condition" portuna bağlayalım
- "Boolean" türünden "QuestTriggered" adlı bir değişken oluşturalım.
- "QuestTriggered" değişkeni ile sahnede bir "GET" kutusu oluşturalım.
- İkinci "Branch" kutusunun "True" portundan bir "Branch" kutusu oluşturalım ve "Quest Triggered" kutusunun çıkışını bu kutunun "Condition" portuna bağlayalım.
- "OnDoorOpen" nesnesini sürükleyip, "Branch" kutusunun sağına bırakalım. Açılan menüden "Call" seçeneğini seçelim.
- "Branch" kutusunun "False" portunu "Call On Door Open" kutusuna ve "True" portunu "Print String" kutusuna bağlayalım.
- "Call On Door Open" kutusunun "Quest No" değerini 6 yapalım.
- "QuestTriggered" değişkeni ile sahnede bir "SET" kutusu oluşturup "Quest Triggered" değerini işaretleyelim ve "Call On Door Open" kutusunun çıkışını bu kutuya bağlayalım.
- "Quest Triggered SET" kutusunun çıkışını "Print String" kutusunun girişine bağlayalım.

1. "Content\Game\Blueprints" dizini içinde iken, sağ tıklayınca açılan menüden "Blueprint Class" seçeneği ile açılan pencerede, "Actor Component" seçeneği ile bir nesne oluşturarak adını "BPC_Quest" olarak değiştirelim.
2. "BPC_Quest" nesnesine çift tıklayarak açalım ve "EventGraph" sekmesinde, "Add Custom Event" ile bir "CustomEvent" kutusu oluşturalım ve adını "Start Quest" olarak değiştirelim.
- "Start Quest" kutusu seçili iken, "Details" sekmesinde "Inputs" satırının sağındaki + butonuna tıklayarak yeni bir giriş değeri oluşturarak adını "Quest" ve veri türünü "S_Quest" olarak değiştirelim.
- "Start Quest" kutusundaki "Quest" değerine sağ tıklayıp "Promote to Variable" seçeneği ile bir "SET" kutusu ve değişken oluşturup, değişken adını "CurrentQuest" olarak değiştirelim.
- "Current Quest SET" kutusu çıkışından "Create Widget" ile "Construct NONE" kutusu açalım.
- "Construct NONE" kutusunun Class değerini "WBP_Quest" olarak seçelim. Böylece, Construct NONE kutusunun adı "Create WBP Quest Widget" olarak değişir.
- "Create WBP Quest Widget" kutusunun "Return Value" değerine sağ tıklayıp "Promote to Variable" değerini seçerek, yeni "SET" kutusu ve değişken oluşturalım ve değişken adını "QuestWidget" olarak değiştirelim.
- "Create WBP Quest Widget" kutusunun çıkışını "Quest Widget SET" kutusuna ve "Return Value" çıkışını aynı kutunun "Quest Widget" girişine bağlayalım.
- "Quest Widget SET" kutusundan "Add to Viewport" kutusu oluşturalım ve "Quest Widget SET" kutusunun sağ alt portunu aynı kutunun "Target" portuna bağlayalım.
- "QuestWidget" değişkeninden bir "GET" kutusu oluşturalım.
- "Quest Widget" kutusundan "Get Active Quest Name" kutusu oluşturalım.
- "Active Quest Name" kutusundan "SetText (Text)" kutusu oluşturalım.
- "Add to Viewport" kutusunun çıkışını "SetText (Text)" kutusuna bağlayalım.
- "CurrentQuest" değişkeninden bir "GET" kutusu oluşturalım.
- "Current Quest" kutusunda sağ tıklayıp "Split Struct Pin" değerini seçerek 2 değer (Name ve Decription) oluşturalım.
- "Current Quest Quest Name" portunu "SetText (Text)" kutusunun "In Text" portuna bağlayalım (Araya bir "To Text (Name) kutusu açılır).
- "QuestWidget" değişkeninden bir "GET" kutusu oluşturalım.
- "Quest Widget" kutusundan "Get Active Quest Description" kutusu oluşturalım.
- "Active Quest Name" kutusundan "SetText (Text)" kutusu oluşturalım.
- İlk "SetText (Text)" kutusunun çıkışını ikinci "SetText (Text)" kutusuna bağlayalım.
- "Current Quest Quest Description" portunu ikinci "SetText (Text)" kutusunun "In Text" portuna bağlayalım (Araya bir "To Text (Name) kutusu açılır).
- İkinci "SetText (Text)" kutusunun çıkışından "Play Sound 2D" kutusu oluşturup "Sound" değerini "StartSimulate" olarak seçelim.
- "Play Sound 2D" kutusundan "Print String" kutusu oluşturup "In String" değerini "Start Quest" olarak değiştirelim.

3. "Add Custom Event" ile bir "CustomEvent" kutusu oluşturalım ve adını "Update Quest" olarak değiştirelim.
- "Update Quest" kutusu seçili iken, "Details" sekmesinde "Inputs" satırının sağındaki + butonuna tıklayarak yeni bir giriş değeri oluşturarak adını "QuestNo" ve veri türünü "Integer" olarak değiştirelim.
- "Update Quest" kutusu çıkışından "Get Data Table Row" kutusu oluşturup "Data Table" değerini "DT_Quest" olarak değiştirelim.
- "Update Quest" kutusunun "Quest No" portundan "To String (Integer)" kutusu oluşturalım.
- "To String (Integer)" kutusunun çıkışını "Get Data Table Row" kutusunun "Row Name" girişine bağlayalım (Otomatik olarak "String to Name" kutusu eklenir.)
- "Update Quest" kutusunun "Quest No" portundan "Subtract" kutusu oluşturalım ve diğer port değerini 2 yapalım.
- "QuestWidget" değişkeninden bir "GET" kutusu oluşturalım.
- "Quest Widget" kutusundan aşağıdaki 5 değer için birer adet "GET" kutusu oluşturalım.
- "Get TextQuest1"
- "Get TextQuest2"
- "Get TextQuest3"
- "Get TextQuest4"
- "Get TextQuest5"
- Bir "Select" kutusu oluşturup "Option" sayısı 5 (Option 0 - 4) olana kadar "Adds pin" butonu ile ekleme yapalım.
- "-" kutusunn sağ üst portunu "Select" kutusunun "Index" portuna ve 5 adet "TextQuest" kutusunun çıkışlarını sırasıyla "Option" portların bağlayalım.
- "CurrentQuest" değişkeninden "SET" kutusu oluşturalım.
- "Get Data Table Row" kutusunun "Row Found" çıkışını "Current Quest SET" kutusuna ve "Out Row" çıkışını değişkeninden "Current Quest SET" kutusunun "Current Quest" portuna bağlayalım.
- "Current Quest SET" kutusundan "Text" sınıfına ait "Set Color and Opacity" kutusu oluşturalım.
- Oluşturduğumuz "SET" kutusunun "Color And Opacity" portuna sağ tıklayıp, "Split Struct Pin" seçeneği ile, "Color and Opacity Specified Color" ve "Color and Opacity Color Use Rule" değerlerini elde edelim.
- "Color and Opacity Specified Color" rengini yeşil olarak ayarlayalım.
- Select" kutusunun "Return Value" çıkışını "Color and Opacity Color SET" kutusunun "Target" portuna bağlayalım.
- "Quest Widget" kutusundan "Get Active Quest Name" kutusu oluşturalım.
- "Active Quest Name" kutusundan "SetText (Text)" kutusu oluşturalım.
- "Add to Viewport" kutusunun çıkışını "SetText (Text)" kutusuna bağlayalım.
- "CurrentQuest" değişkeninden bir "GET" kutusu oluşturalım.
- "Current Quest" kutusunda sağ tıklayıp "Split Struct Pin" değerini seçerek 2 değer (Name ve Decription) oluşturalım.
- "Current Quest Quest Name" portunu "SetText (Text)" kutusunun "In Text" portuna bağlayalım (Araya bir "To Text (Name) kutusu açılır).
- "QuestWidget" değişkeninden bir "GET" kutusu oluşturalım.
- "Quest Widget" kutusundan "Get Active Quest Description" kutusu oluşturalım.
- "Active Quest Name" kutusundan "SetText (Text)" kutusu oluşturalım.
- İlk "SetText (Text)" kutusunun çıkışını ikinci "SetText (Text)" kutusuna bağlayalım.
- "Current Quest Quest Description" portunu ikinci "SetText (Text)" kutusunun "In Text" portuna bağlayalım (Araya bir "To Text (Name) kutusu açılır).
- İkinci "SetText (Text)" kutusunun çıkışından "Print String" kutusu oluşturup "In String" değerini "Update Quest" olarak değiştirelim.

4. "Add Custom Event" ile bir "CustomEvent" kutusu oluşturalım ve adını "Complete Quest" olarak değiştirelim.
- "Complete Quest" kutusundan bir "Play Sound 2D" kutusu oluşturup "Sound" değerini "PossessPlayer" olarak seçelim.
- "Play Sound 2D" kutusunun çıkışından bir "Play Animation" kutusu oluşturalım.
- "QuestWidget" değişkeni ile bir "GET" kutusu oluşturalım.
- "Quest Widget" kutusunun çıkışını "Play Animation" kutusunun "Target" portuna bağlayalım.
- "Quest Widget" kutusundan bir "Get QuestCompletedNotification" kutusu oluşturalım.
- "Quest Completed Notification" kutusunun çıkışını "Play Animation" kutusunun "In Animation" portuna bağlayalım.
- "Play Animation" kutusunun çıkışından ""Delay" kutusu (2 saniye) oluşturalım.
- "Delay" kutusu çıkışından bir "Update Quest" kutusu oluşturalım.
- "Complete Quest" kutusunun "Quest No" portunu "Update Quest" kutusunun "Quest No" portuna bağlayalım.
- "Update Quest" kutusunun çıkışından bir "Play Animation" kutusu oluşturalım ve "Play Mode" değerini "Reverse" olarak değiştirelim.
- "Quest Widget" kutusunun çıkışını "Play Animation" kutusunun "Target" portuna ve "Quest Completed Notification" kutusunun çıkışını "Play Animation" kutusunun "In Animation" portuna bağlayalım.
- "Play Animation" kutusunun çıkışından "Print String" kutusu oluşturup "In String" değerini "Complete Quest" olarak değiştirelim.

5. "WBP_Quest" görünürlüğünü değiştirme
- "Content\Game\Input\Actions" dizini içinde iken, sağ tıklayıp açılan menüden, "Input -> Input Action" seçeneğini seçerek yeni bir nesne oluşturalım ve adını "IA_Quest" olarak değiştirelim.
- "Content\Input" dizinindeki "IMC_Default" nesnesine çift tıklayıp açtıktan sonra, "Details" sekmesinde:
- "Mappings" ifadesinin hemen sağında yer alan + butonuna tıklayarak yeni bir seçme kutusu ekleyelim.
- Seçme kutusundan "IA_Quest" değerini seçelim.
- Altta yer alan klavye resmine tıkladıktan sonra, klavyeden Q tuşuna basarak atamayı yapalım.
- "BPC_Quest" penceresinin "EventGraph" sekmesinde
- "EnhancedInputAction IA_Quest" kutusu açalım.
- "EnhancedInputAction IA_Interact" kutusunun "Started" çıkışından bir "? Is Valid" kutusu oluşturalım.
- "? Is Valid" kutusunun "Is Valid" çıkışından bir "Branch" kutusu oluşturalım.
- "QuestWidget" değişkeninden bir "GET" kutusu oluşturalım.
- "Quest Widget" kutusunun çıkışını "Is Visible (Widget)" kutusunun "Input Object" portuna bağlayalım.
- "Quest Widget" kutusundan bir "Is Visible (Widget)" kutusu oluşturalım.
- "Is Visible (Widget)" kutusunun "Return Value" çıkışını "Branch" kutusunun "Condition" portuna bağlayalım.
- "Quest Widget" kutusundan bir "Set Visibility (Widget)" kutusu oluşturalım.
- "Branch" kutusunun "True" portunu "Set Visibility (Widget)" kutusuna bağlayalım.
- "Set Visibility (Widget)" kutusunun "In Visibility" değerini "Hidden" olarak değiştirelim.
- "Quest Widget" kutusundan ikinci bir "Set Visibility (Widget)" kutusu oluşturalım.
- "Branch" kutusunun "False" portunu "Set Visibility (Widget)" kutusuna bağlayalım.
- "Set Visibility (Widget)" kutusunun "In Visibility" değerini "Not Hit-Testable (Self Only)" olarak değiştirelim.

Oyunda, kullanıcı Q tuşuna her bastığında, görev listesini ve aktif görevi içeren "WBP_Quest" nesnesini ekranda gösterir veya gizler.
6. "BP_BasicCharacter" penceresinde, "+ Add" butonu ile "BPC_Quest" nesnesi ekleyelim.
Oyuncu belli bir nokta ya da bölgeye geldiğinde, oyuncu tarafından yapılacak görevleri ekranda gösterme amacıyla bir Trigger oluşturmak için aşağıdaki adımları sırasıyla gerçekleştirelim:
1. "Content\Game\Blueprints" dizini içinde iken, sağ tıklayınca açılan menüden "Blueprint Class" seçeneği ile açılan pencerede, "Actor" seçeneğini seçerek yeni bir nesne oluşturalım ve adını "BP_QuestTrigger" olarak değiştirelim.
2. "BP_QuestTrigger" nesnesine çift tıklayarak açalım.
- "+ Add" butonu ile "Box Collision" nesnesi ekleyelim ve adını "Trigger" olarak değiştirelim.
- "Trigger" nesnesi seçili iken "default" sekmesinde, "Events" satırı altında "On Component Begin Overlap" satırının sağındaki + butonuna tıklayarak, "EventGraph" sekmesinde "On Component Begin Overlap (Trigger)" kutusu açalım.
- "On Component Begin Overlap (Trigger)" kutusundan bir "Do Once" kutusu oluşturalım.
- "Do Once" kutusunun çıkışından bir "Print String" kutusu oluşturup "In String" değerini "Player overlap trigger!" olarak değiştirelim.
- "Print String" kutusundan bir "Branch" kutusu oluşturalım.
- "On Component Begin Overlap (Trigger)" kutusunun "Other Actor" çıkışından "Cast To BP_BasicCharacter" kutusu oluşturalım ve "Branch" kutusunun "True" çıkışını "Cast To BP_BasicCharacter" kutusunun girişine bağlayalım.
- "On Component Begin Overlap (Trigger)" kutusunun "Other Actor" çıkışından "Actor Has Tag" kutusu oluşturalım ve "Tag" değerini "Player" yapalım.
- "Actor Has Tag" kutusunun "Return Value" çıkışını "Branch" kutusunun "Condition" portuna bağlayalım.
- "Cast To BP_BasicCharacter" kutusunun "As BP Basic Character" portundan "Get BPC Quest" kutusu oluşturalım.
- "BPC Quest" kutusunun çıkışından "Start Quest" kutusu oluşturalım.
- "Cast To BP_BasicCharacter" kutusunun çıkışını "Start Quest" kutusuna bağlayalım.
- Hepsi "Public" olmak üzere aşağıdaki değişkenleri oluşturalım.
- Button (BP_Button Object Reference)
- Light (BP_Light Object Reference)
- Cube (BP_Cube Object Reference)
- Door (BP_Door Object Reference)
- Sphere (BP_Sphere Object Reference)
- Quest (S_Quest Structure)
- questNo (Integer - Ön tanımlı değeri: 1)
- "Quest" değişkenini sürükleyip sahneye bırakarak bir "GET" kutusu oluşturalım ve kutunun çıkışını "Start Quest" kutusunun "Quest" portuna bağlayalım.
- "Sphere" değişkeni ile sahnede bir "GET" kutusu oluşturalım.
- "Sphere" kutusundan "Bind Event to On Sphere Destroyed" kutusu oluşturalım.
- "Start Quest" kutusunun çıkışını "Bind Event to On Sphere Destroyed" kutusuna bağlayalım.
- "Bind Event to On Sphere Destroyed" kutusunun "Event" portundan "Add Custom Event" kutusu oluşturup adını "Complete Quest" olarak değiştirelim.
- "BPC Quest" kutusundan "Complete Quest" kutusu oluşturalım.
- "Complete Quest" Custom Event kutusunun çıkışını "Complete Quest BPC Quest" kutusuna ve "Complete Quest" Custom Event kutusunun "Quest No" portunu "Complete Quest BPC Quest" kutusunun "Quest No" portuna bağlayalım.
- "Light" değişkeni ile sahnede bir "GET" kutusu oluşturalım.
- "Light" kutusundan "Bind Event to On Light On" kutusu oluşturalım.
- "Bind Event to On Sphere Destroyed" kutusunun çıkışını "Bind Event to On Light On" kutusuna bağlayalım.
- "Bind Event to On Light On" kutusunun "Event" portunu "Complete Quest" Custom Event kutusunun sağ üst portuna bağlayalım.
- "Cube" değişkeni ile sahnede bir "GET" kutusu oluşturalım.
- "Cube" kutusundan "Bind Event to On Cube Triggered" kutusu oluşturalım.
- "Bind Event to On Light On" kutusunun çıkışını "Bind Event to On Cube Triggered" kutusuna bağlayalım.
- "Bind Event to On Cube Triggered" kutusunun "Event" portunu "Complete Quest" Custom Event kutusunun sağ üst portuna bağlayalım.
- "Button" değişkeni ile sahnede bir "GET" kutusu oluşturalım.
- "Button" kutusundan "Bind Event to On Button Active" kutusu oluşturalım.
- "Bind Event to On Cube Triggered" kutusunun çıkışını "Bind Event to On Button Active" kutusuna bağlayalım.
- "Bind Event to On Button Active" kutusunun "Event" portunu "Complete Quest" Custom Event kutusunun sağ üst portuna bağlayalım.
- "Door" değişkeni ile sahnede bir "GET" kutusu oluşturalım.
- "Door" kutusundan "Bind Event to On Door Open" kutusu oluşturalım.
- "Bind Event to On Button Active" kutusunun çıkışını "Bind Event to On Door Open" kutusuna bağlayalım.
- "Bind Event to On Door Open" kutusunun "Event" portunu "Complete Quest" Custom Event kutusunun sağ üst portuna bağlayalım.

3. "BasicLevel" penceresinde,
- "Content\Game\Blueprints" dizininde iken, "BP_QuestTrigger" nesnesini sürükleyip "PlayerStart" önüne bırakalım ve aşağıdaki değerleri değiştirelim.
- Location -> X: -3270 Y: 165 Z: 220
- Scale -> X: 1 Y: 20,3 Z: 6,5
- Quest Name -> "Quest-1"
- Quest Description -> "Destroy the sphere!"
- "Details" sekmesinde aşağıdaki satırların her biri için, satırın en sağındaki "Pick Actor from scene" butonuna tıkladıktan sonra, sahnedeki nesneyi seçelim.
- Button
- Cube
- Door
- Light
- Sphere
- "Player Start" için, "Details" sekmesindeki "Location" değerlerini X: -3800 Y: 205 Z: 92 olarak değiştirelim.
4. Actor pencerelerinde Trigger tanımlamaları
Aşağıda gösterilen tüm Actor'lerin pencerelerinde "BP_QuestTrigger" türünden "questNoRef" adlı bir değişken oluşturalım (Public). "BasicLevel" penceresinde, aşağıda gösterilen tüm Actor'leri sıra ile seçerek, "Details" sekmesinde "Quest No Ref" satırının en sağındaki "Pick Actor from scene" butonuna tıkladıktan sonra, sahnedeki "BP_QuestTrigger" nesnesini seçelim.
- BP_Sphere
- BP_Light
- BP_Cube
- BP_Button
- BP_Door
- BP_Door2
Oyuncu görevleri kurallara uygun bir şekilde yerine getirmek için aşağıdaki sıralamayı takip etmelidir:
- E tuşu ile "BP_Sphere" nesnesini yok etmek.
- E tuşu ile ilk lambayı yakmak.
- E tuşu ile "BP_Cube" yoluyla ikinci lambayı yakmak.
- E tuşu ile "BP_Button" yoluyla grup içindeki 3 lambayı yakmak.
- "BP_Door" kapısından giriş yapmak.
Oyuncu sahnedeki işlemleri yukarıdaki sıra dahilinde yapmadığı takdirde, "BP_Sphere" nesnesini yok edebilir, ilk lambayı, "BP_Cube" yoluyla ikinci lambayı ve "BP_Button" yoluyla lambalar grubunu yakabilir ancak görevler yerine getirilmiş olmaz. Görevlerin tamamlandığını gösteren mesajlar ancak işlemler belirtilen sıra dahilinde yerine getirildiğinde güncellenir.
1. Oyun başladığında, oyuncu sahnedeki "BP_QuestTrigger" ile etkileşime geçtiğinde, görev takip sistemi için ilk olarak "BP_QuestTrigger" Actor'ı devreye girer.
- "On Component Begin Overlap (Trigger)" zinciri devreye girer ve "Do Once" kutusu sayesinde sadece bir kez çalışır.
- "Player overlap trigger" karakter dizisi ekrana yazılır.
- Oyuncunun adı "Player" ise, zincirin çalışması devam eder.
- "Cast To BP_BasicCharacter" kutusu ile "BP_BasicCharacter" karakteri içinde tanımlı, "BPC_Quest" Actor Component'ı da dahil olmak üzere, tüm nesnelere erişim sağlanır.
- "Cast To BP_BasicCharacter" kutusunun "As BP Basic Character" portundan oluşturulan "Get BPC Quest" kutusu ile "BPC_Quest" içinde yer alan "Start Quest" çağrılır ve "S_Quest" değeri bu fonksiyona parametre olarak geçirilir. "Start Quest" zincirinde,
- "SET" kutusu ile, "Quest" parametre içeriği olan "Quest-1" ve "Destroy the sphere!" değerleri sırasıyla, "S_Quest" yapısının nesne referansı olan "CurrentQuest" ile "S_Quest" yapısının "QuestName" ve "QuestDecsription" değerlerine atanır.
- "WBP_Quest" kullanılarak oluşturulan arayüz ile "WBP_Quest" referansı olan "QuestWidget" değeri güncellenir.
- "Add to Viewport" kutusu ile "WBP_Quest" Viewport'a aktarılır.
- "SetText" kutuları ile "CurrentQuest" referansının gösterdiği "S_Quest" içeriği ile "QuestWidget" referansının gösterdiği "WBP_Quest" içinde yer alan "ActiveQuestName" ve "ActiveQuestDescription" değerleri güncellenir.
- "Play Sound 2D" kutusu ile bir ses dosyası oynatılır.
- "Print String" kutusu ile "Start Quest" ifadesi ekrana yazılır.

- Aşağıdaki Actor'ların içinde tanımlı her bir "Event Dispatcher" için "Bind Event to" yöntemiyle bağlantı yapılır. Böylece, bu Actor'lar içinde "Call" yöntemiyle "Event Dispatcher" çağrısı yapıldığında, "Comple Quest" Custom Event'i yoluyla "BPC_Quest" içindeki "Complete Quest" Custom Event'i çağrılır.
- "BP_Sphere"
- "BP_Light"
- "BP_Cube"
- "BP_Button"
- "BP_Door"
2. Oyuncu "BP_Sphere" nesnesi başına gidip 'E' tuşuna bastığında, "Event Interact" zinciri devreye girer:
- Eğer "questNoRef" referansı ile erişilen "BP_QuestTrigger" içinde tanımlı "questNo" değişken değeri 1'e eşit ise "Destroy Actor" kutusu çalışır ve "BP_Sphere" nesnesini sahneden yok eder.
- "Print String" kutusu ile "Sphere destroyed!" ifadesini ekrana yazar.
- "SET" kutusu ile "questNo" değerini 2 olarak değiştirir.
- "Call" kutusu ile "OnSphereDestroyed" Event Dispatch'ini çağırır. Böylece, "BP_QuestTrigger" içindeki "Bind Event to On Sphere Destroyed" kutusu yoluyla "Complete Quest" Custom Event'i ve dolayısıyla da "BPC_Quest" içindeki "Complete Quest" Custom Event tetiklenir.

- "BPC_Quest" içindeki "Complete Quest" Custom Event zincirinde,
- "Play Sound 2D" kutusu ile bir ses dosyası oynatılır.
- İlk "Play Animation" kutusu oynatılarak, "Quest-1" ve "Destroy the sphere!" yazıları yavaşca kaybolurken "Quest Completed" yazısı ekranda belirir ve kısa bir süre sonra yavaçca kaybolur.
- "Delay" kutusu ile zincirin çalışması 2 saniye duraklatılır.
- "Update Quest" kutusu ile,
- "Get Data Table Row DT_Quest" kutusu ile "Data Table" içindeki ikinci veri satırı okunur ("Quest-2" ve "Turn on the first lamp!").
- "SET" kutusu ile "CurrentQuest" referansı yoluyla "S_Quest" değerleri güncellenir.
- "SET Color and Opacity" kutusu ile "WBP_Quest" içindeki "TextQuest1" nesnesinin rengi yeşile çevrilir.
- "SetText" kutuları ile "CurrentQuest" referansının gösterdiği "S_Quest" içeriği ile "QuestWidget" referansının gösterdiği "WBP_Quest" içinde yer alan "ActiveQuestName" ve "ActiveQuestDescription" değerleri güncellenir ("Quest-2" ve "Turn on the first lamp!").
- "Print String" kutusu ile "Update Quest" ifadesi ekrana yazılır.
- İkinci "Play Animation" kutusu ile animasyon bu kez tersine oynatılır.
- "Print String" kutusu ile "Complete Quest" ifadesi ekrana yazılır.

3. Oyuncu "BP_Light" nesnesi başına gidip 'E' tuşuna bastığında, "Event Interact" zinciri devreye girer:
- Eğer "questNoRef" referansı ile erişilen "BP_QuestTrigger" içinde tanımlı "questNo" değişken değeri 2'ye eşit ise, "SET" kutusu ile "questNo" değerini 3 olarak değiştirir.
- "Call" kutusu ile "OnLightOn" Event Dispatch'ini çağırır. Böylece, "BP_QuestTrigger" içindeki "Bind Event to On Light On" kutusu yoluyla "Complete Quest" Custom Event'i ve dolayısıyla da "BPC_Quest" içindeki "Complete Quest" Custom Event tetiklenir.
- "BPC_Quest" içindeki "Complete Quest" Custom Event zincirinde, aynı işlemler gerçekleştirilir.
- "Set Visibility" kutusu ile lamba yakılır.
4. Oyuncu "BP_Cube" nesnesi başına gidip 'E' tuşuna bastığında, "Event Interact" zinciri devreye girer:
- Eğer "questNoRef" referansı ile erişilen "BP_QuestTrigger" içinde tanımlı "questNo" değişken değeri 3'ye eşit ise, "SET" kutusu ile "questNo" değerini 4 olarak değiştirir.
- "Call" kutusu ile "OnCubeTriggered" Event Dispatch'ini çağırır. Böylece, "BP_QuestTrigger" içindeki "Bind Event to On Cube Triggered" kutusu yoluyla "Complete Quest" Custom Event'i ve dolayısıyla da "BPC_Quest" içindeki "Complete Quest" Custom Event tetiklenir.
- "BPC_Quest" içindeki "Complete Quest" Custom Event zincirinde, aynı işlemler gerçekleştirilir.
- "Print String" kutusu ile "Cube triggered!" ifadesi ekrana yazılır.
- "Interact" kutusu ile "BP_Light" nesnesinin "Event Interact" zinciri tetiklenir ve "BP_Light2" lambası yanar.
5. Oyuncu "BP_Button" nesnesi başına gidip 'E' tuşuna bastığında, "Event Interact" zinciri devreye girer:
- Eğer "questNoRef" referansı ile erişilen "BP_QuestTrigger" içinde tanımlı "questNo" değişken değeri 4'e eşit ise, "SET" kutusu ile "questNo" değerini 5 olarak değiştirir.
- "Call" kutusu ile "OnButtonActive" Event Dispatch'ini çağırır. Böylece, "BP_QuestTrigger" içindeki "Bind Event to On Cube Triggered" kutusu yoluyla "Complete Quest" Custom Event'i ve dolayısıyla da "BPC_Quest" içindeki "Complete Quest" Custom Event tetiklenir.
- "BPC_Quest" içindeki "Complete Quest" Custom Event zincirinde, aynı işlemler gerçekleştirilir.
- "Call" kutusu ile "OnButtonTriggered" Event Dispatch'ini çağırır. Böylece, "BP_Light" içindeki "Bind Event to On Button Triggered" kutusu yoluyla "TurnLightOnOff" Custom Event'i tetiklenerek grup içinde yer alan 3 lamba yakılır.
- "Print String" kutusu ile "Button triggered!" ifadesi ekrana yazılır.
Oyuncu yukarıdaki 4 görevin tamamını sıra ile gerçekleştiğinde kapıdan geçiş yapabilecektir.
6. Oyuncu "BP_Door" nesnesi ile temsil edilen kapıdan geçtiğinde, "BP_Door" içindeki "On Component Begin Overlap (Trigger)" zinciri devreye girer:
- Oyuncu adı "Player" ise, zincirin çalışması devam eder.
- Eğer "questNoRef" referansı ile erişilen "BP_QuestTrigger" içinde tanımlı "questNo" değişken değeri 5'e eşit zincirin çalışması devam eder.
- "QuestTriggered" değişken değeri,
- "False" ise, "Call" kutusu ile "OnDoorOpen" Event Dispatch'ini "QuestNo" değerini 6 vererek çağırır ve "QuestTriggered" değerini "SET" kutusu ile "True" yapar. Böylece, "BP_QuestTrigger" içindeki "Bind Event to On Cube Triggered" kutusu yoluyla "Complete Quest" Custom Event'i ve dolayısıyla da "BPC_Quest" içindeki "Complete Quest" Custom Event tetiklenir ve aynı işlemler gerçekleştirilir.
- "True" ise doğrudan "SET" kutusu çıkışına geçiş yapar.
- "Print String" kutusu ile "Triggered door!" ifadesi ekrana yazılır.
- "Set Direction" kutusu ile kapı yönü düzenlenir.
- "Open Door" kutusu ile kapı açılır.