İlan
04 Haz 2026 23 çevrimiçi üye Duyurular
Ana Sayfa Mobil Uygulama - Oyun Geliştirme
Ana Sayfa Forum Mobil Uygulama - Oyun Geliştirme Unity Test Framework - Doğru yolu beklemek (Eğitim...
İlan Yan banner placeholder

Unity Test Framework - Doğru yolu beklemek (Eğitim) | Mobil Oyun Geliştirme

ArmanHAN 08.04.2026 06:36 1.3K görüntüleme 6 cevap
Son Mesaj
ArmanHAN
Üye
Üye
Katılım17 Ara 2025
Konular5
Mesajlar51
Elmas Konular0
Başarım0
ZirveCoin 0
Ticaret Puanı
+0 -0
08.04.2026 06:36 #1

​Merhaba değerli MMOZirve takipçileri, bir önceki gönderide, Unity Test Framework'e bir girişyaptık. Bu eğitimde, Unity testi sırasında bir şeyin olmasını beklemenin farklı yollarını göreceğiz.

UnityTest Ortak Programlarını Anlama

NUnit'in varsayılan Test özniteliği, tüm testi genellikle sınırlayıcı olan 1 çerçeve içinde çalıştıracaktır. Bunun üstesinden gelmek için Unity Test Framework, testlerinizi eşyordamlar olarak çalıştırmak için bir UnityTest özniteliği sağlar. Bu tür testler, 1 kareden daha geniş bir alanı kapsayan bir test çalıştırmanıza izin verdikleri için kullanışlıdır.

Bu eşyordamlar nasıl çalışır? UnityTest, temelde IEnumerator dönüş türüyle bildirilen ve bir veya daha fazla verim dönüş ifadesi içeren işlevlerdir. Numaralandırıcı böylece eşyordamın her adımını temsil eder ve getiri dönüş ifadeleri onun duraklama noktalarıdır.

Bir eşyordamı duraklatmanın en temel yolu boş bir değer döndürmektir:

Kod:
yield return null;

Bu, eşyordamı bir sonraki kareye kadar duraklatacaktır. Bir sonraki çerçeve işlenirken, işlev, verim ifadesini geçtikten sonra yürütmeye devam edecektir.

WaitForSeconds sınıfı

Bir şey olmadan önce beklemeniz gereken süreyi tam olarak biliyorsanız (örneğin bir animasyon gibi), WaitForSeconds sınıfı sayesinde teste belirli bir süre beklemesini söyleyebilirsiniz:

C#:
yield return new WaitForSeconds(10f);

WaitForSeconds, Time.timeScale'e bağlıdır. Bu yüzden oyununuzda zaman değiştirme mekaniği varsa dikkatli olun.

Pratik bir örnek olarak örnek projemizi kullanmaya devam edeceğiz ve WaitForSeconds sınıfını kullanarak yeni bir test yazacağız. (Önceki öğreticiyi incelemediyseniz, şimdi iyi bir zaman olabilir).

Pratik bir örnek

Pratik bir örnek olarak örnek projemizi kullanmaya devam edeceğiz ve WaitForSeconds sınıfını kullanarak yeni bir test yazacağız. (Önceki öğreticiyi incelemediyseniz, şimdi iyi bir zaman olabilir).

Örnek projemizi github'da bulun ve öğretici-temel dalına geçin (bu, önceki öğreticimizi tamamladıktan sonra projenin durumuna karşılık gelir):


Eğitim-temel dalına girdikten sonra, Kod > Zip İndir'e tıklayarak projeyi indirin.


Unity ile projeyi açın. Assets/Tests/TestSuite.cs dosyasını açın. Dosyaya yeni bir test ekleyin ve bir oynatıcı ve bir iskelet örneği oluşturun:

C#:
[UnityTest]
public IEnumerator TestSkeletonFollowsPlayer()
{
    Vector3 playerPos = new Vector3(2f, 1f, -5f);
    Quaternion playerDir = Quaternion.identity;
    Vector3 skeletonPos = new Vector3(2f, 0f, 5f);
    Quaternion skeletonDir = Quaternion.LookRotation(new Vector3(0f, 0f, -1f), Vector3.up);

    GameObject player = GameObject.Instantiate(playerPrefab, playerPos, playerDir);
    GameObject skeleton = GameObject.Instantiate(skeletonPrefab, skeletonPos, skeletonDir);
    yield return null;
}

Burada oyuncu ve iskeleti birbirinden uzağa yerleştiriyoruz. Amacımız iskeletin oyuncuyu takip edip etmeyeceğini kontrol etmektir. Ayrıca, IEnumerator türü tarafından gerekli olduğu için bir değer döndürmemiz gerektiğine dikkat edin. Test henüz bir şey yapmıyor, bu yüzden sadece null bir değer döndürüyoruz.

İskelet, bir oyuncunun takip etmesini gerektirir, bu yüzden ona bir tane veriyoruz:

C#:
GameObject player = GameObject.Instantiate(playerPrefab, playerPos, playerDir);
GameObject skeleton = GameObject.Instantiate(skeletonPrefab, skeletonPos, skeletonDir);
skeleton.GetComponent<Skeleton>().player = player.GetComponent();

yield return null;

Test hazır, şimdi önemli kısmı yazabiliriz. Oyunun birkaç saniye çalışmasına izin verdik ve iskeletin oyuncuya yaklaşıp yaklaşmadığını kontrol ettik:

C#:
yield return new WaitForSeconds(3f);

float distance = Math.Abs((skeleton.transform.position - player.transform.position).magnitude);
Assert.That(distance, Is.LessThan(2f));

Math, System ad alanına bağlı olduğundan, onu dosyamızın üstüne eklememiz gerekir:

C#:
using System;

Unity editöründe testi çalıştırırsanız, iskeletin oyuncuyu takip ettiğini ve testin başarıyla geçtiğini görmelisiniz.

Beklemenin daha akıllı bir yolu

Gördüğünüz gibi WaitForSeconds çok kullanışlıdır, ancak statik bekleme değerleri hantal olabilir. Bu tür "sihirli sayılar" lapa lapa yol açabilir. Statik beklemeden önce koşul yerine getirilebilirse, aynı zamanda zaman kaybediyoruz. Kapsamlı bir test dizisi yazarsanız (yapmanız gerektiği gibi), bu hızla toplanır.

Daha açık bir beklemeye ihtiyacımız var. Bir koşul ifade etmemiz ve teste "bu koşul sağlanana kadar bekle" dememiz gerekiyor.

Bunu başarmak için bir yardımcı program sınıfı yazacağız. Bir işlevi girdi olarak alır ve doğru olana kadar her karede çalıştırır:

C#:
public class Wait
{
    static public IEnumerator Until(Func<bool> condition, float timeout = 30f)
    {
        float timePassed = 0f;
        while (!condition() && timePassed < timeout) {
            yield return new WaitForEndOfFrame();
            timePassed += Time.deltaTime;
        }
        if (timePassed >= timeout) {
            throw new TimeoutException("Condition was not fulfilled for " + timeout + " seconds.");
        }
    }
}

Belirtilen süreden sonra koşul yerine getirilmezse, testin başarısız olacağını unutmayın. Bu çok önemlidir, çünkü zaman aşımı olmadan yöntem sonsuza kadar çalışacaktır.

Testimizde bu yeni yardımcı program sınıfını kullanırsak, son kod şöyle görünür:

C#:
[UnityTest]
public IEnumerator TestSkeletonFollowsPlayer()
{
    Vector3 playerPos = new Vector3(2f, 1f, -5f);
    Quaternion playerDir = Quaternion.identity;
    Vector3 skeletonPos = new Vector3(2f, 0f, 5f);
    Quaternion skeletonDir = Quaternion.LookRotation(new Vector3(0f, 0f, -1f), Vector3.up);

    GameObject player = GameObject.Instantiate(playerPrefab, playerPos, playerDir);
    GameObject skeleton = GameObject.Instantiate(skeletonPrefab, skeletonPos, skeletonDir);
    skeleton.GetComponent<Skeleton>().player = player.GetComponent();

    yield return Wait.Until(() => {
        float distance = Math.Abs((skeleton.transform.position - player.transform.position).magnitude);
        return distance <= 2f;
    }, timeout: 10f);
}

Testi çalıştırın ve koşul yerine getirilir getirilmez nasıl geçtiğini gözlemleyin. Bu daha verimli bir testtir ve iskeletin hızı değişse bile çalışacak kadar esnektir.

WaitForEndOfFrame hakkında bir not

Yardımcı program sınıfımızda WaitForEndOfFrame kullanıyoruz. Editörde kullanıldığında bu eşyordamın toplu modda çalışmadığını hatırlatmak önemlidir.

Düzenleyici testlerini toplu modda çalıştırmayı planlıyorsanız, verim döndürme boş ifadesi kullanılması tercih edilir.

İşte bu konuda daha fazla bilgi edinmek için iki bağlantı:

https://forum.unity.com/threads/do-not-use-waitforendofframe.883648/

Unity - Manual: Batch mode and built-in coroutine compatibility


Sonuç

Gördüğümüz gibi, testler sırasında beklemek basit olabilir, ancak aynı zamanda daha verimli bir şekilde elde edilebilir. Etkili testler yazmak biraz deneyim gerektirir ve zamanla herkes bu beceriyi edinebilir. Umarım bu eğitim, bu hedefe yaklaşmanıza yardımcı olmuştur.
mcreativee
Üye
Üye
Katılım26 Mar 2026
Konular11
Mesajlar85
Elmas Konular0
Başarım0
ZirveCoin 0
Ticaret Puanı
+0 -0
10.04.2026 09:24 #2
Paylaşım için teşekkürler.
ArmanHAN
Üye
Üye
Katılım17 Ara 2025
Konular5
Mesajlar51
Elmas Konular0
Başarım0
ZirveCoin 0
Ticaret Puanı
+0 -0
01.05.2026 16:00 #3
Paylaşım için teşekkürler.

rica ederim
saykut606
Üye
Üye
Katılım22 Ara 2025
Konular5
Mesajlar87
Elmas Konular0
Başarım0
ZirveCoin 0
Ticaret Puanı
+0 -0
03.05.2026 03:19 #4
Paylaşım için teşekkürler
ArmanHAN
Üye
Üye
Katılım17 Ara 2025
Konular5
Mesajlar51
Elmas Konular0
Başarım0
ZirveCoin 0
Ticaret Puanı
+0 -0
04.05.2026 21:22 #5
Paylaşım için teşekkürler

rica ederimm
Onurvacl
Üye
Üye
Katılım17 Şub 2026
Konular11
Mesajlar73
Elmas Konular0
Başarım0
ZirveCoin 0
Ticaret Puanı
+0 -0
04.05.2026 22:35 #6
Paylaşım için teşekkürler.
ArmanHAN
Üye
Üye
Katılım17 Ara 2025
Konular5
Mesajlar51
Elmas Konular0
Başarım0
ZirveCoin 0
Ticaret Puanı
+0 -0
05.05.2026 14:09 #7
Paylaşım için teşekkürler.

rica ederimm
Bu konuyu görüntüleyenler
1 misafir
Cevap yazmak için giriş yapın.
Benzer Konular
7 cevap
2K görüntüleme
5 cevap
2K görüntüleme
Mobil Oyun Geliştirme Rehber -4
astrafizik · 27 Mar 2026
6 cevap
1.7K görüntüleme
6 cevap
1.7K görüntüleme
Mobil Oyun Geliştirme Rehber -1
fortext · 03 May 2026
5 cevap
1.7K görüntüleme
İlan Yan banner placeholder