Huawei Cloud DB ile Unityde Çok Oyunculu 3 Taş Oyunu 3/3

Alihan98ersoy
Huawei Developers - Türkiye
5 min readAug 26, 2021

Sizlere ilk yazımda HMS eklentisini Unity’e nasıl entegre edebileceğimizi göstermiştim. 2. yazımda ise Cloud DB’yi nasıl kullanabileceğimizi daha detaylı anlatmıştım. Bu yazımda ise Cloud DB realtime özelliğini kullanarak basit bir çok oyunculu oyunu nasıl yapabileceğimizi göstereceğim.

Öncelikle oyunun çalışma mantığından bahsetmek istiyorum.

1- Sahne ilk açıldığında arka planda Huawei ID ile login oluyor eğer hiç giriş yapılmadıysa Huawei hesabınız ile giriş yapmanızı istiyor.

2- Giriş yapıldıktan sonra isminiz sol altta yazıyor ve arka planda Cloud DB’nin initialize işlemlerini gerçekleştiriyor.

3- Oyuna başlamak için play tuşuna basmanız lazım. Play tuşuna bastığınız anda gerçek zamanlı olarak Databasedeki değişimleri yakalamaya başlıyor. Ve eğer daha önceden bağlanan kullanıcı varsa onu veya tahta temizlenmediyse son oyunu sahnede gösteriyor.

Normalde olması gereken yapı, oyun intro gösterirken login ve initialize işlemlerini yapması oyun odaları gösterdiği sırada otomatik olarak realtime yakalaması ve birden fazla oyun odasının olması. Ama ben bu yazıda olabildiğince basit tutmak için tek oyun odalı bir örnek oluşturdum.

4- Play tuşuna bastıktan sonra join tuşları etkinleşiyor ve oyuna katılmak için join tuşuna basmanız gerekiyor. Join tuşuna bastığınız anda sizin adınızı o koltuğa yazıyor ve Database’i güncelliyor.

5- Diğer oyuncunun da bağlanmasıyla oyunumuz başlıyor.

İlk O başlar ve 3 taş kısaca aynı 3 taşı yan yana getirenin kazandığı bir oyundur. Çarpraz, yatay veya dikey. Oynayabilecek kutucuk kalmaz ve herhangi bir taştan 3 tane yan yana olmazsa berabere olur.

Sıranın kimde olduğunu belirlemek için tahtadaki O ların sayısı X lere eşit ise sıra O da değilse sıra X de.

6- Eğer kazanan olursa veya berabere durumunda tahtayı sıfırlamak için reset tuşuna basılıyor böylece hem tahta hemde oyuncu koltukları sıfırlanıyor ve oyuncuların koltuklara tekrar oturmasıyla oyun tekrar başlıyor.

Gözünüzde canlanabilmesi için unity sahnemi paylaşıyorum. GameManager gameObjectimde Cloud DB bağlantılarını ve methodlarımı çalıştırdığım Cloud DB Service scriptim ve oyun mekaniklerini yönettiğim GameManager scriptim var. CloudDBService scriptimde Cloud DB’yi nasıl kullandığımı önceki 2 yazımda anlattım. Şimdiki yazımda GameManager kısmını detaylı olarak anlatacağım.

Öncelikle sahnemden bahsetmek istiyorum. Sahnemde Huawei Unity sdk ile CloudDB, AuthService ve Account kiti etkinleştirdim. Sonrasında Oyun tahtam 9 kutucuktan oluşuyor ve her kutucuğun içerisinde 2 alt nesnem var. Bunlar O ve X spritelarını tutan ve sprite renderları kapalı 2 nesne. Her kutucuk ve altındaki alt nesneler kendi içlerinde X ve O yu göstermelerini sağlayan scriptler içeriyor.

Tablomda 11 data var. Bunların ilk 9'u kutucukları 10 ve 11 ise oyuncu1 ve oyuncu2 yi temsil ediyor. Basit bir anlatım için hepsini tek tablo halinde oluşturdum.

Hadi başlayalım,

GameManager Script (Oyunun Tüm Mekanikleri)

Kısaca isLocal kavramından bahsetmek istiyorum. Oyunumuz çok oyunculu olduğu için bazı kodlamaların localde yani yerel cihazda mı yoksa server üzerinden transfer olup diğer oyuncuda mı çalışması lazım sorunu var. Bunu aşmak için isLocal mantığı devreye giriyor. currentPlayer değişkenim ile yerel cihazdaki oyuncu X mi O mu diye tutuyoruz. Yani yerel cihazda çalışan servera gitmemesi gereken bir değişken. Ama mesela counterlar serverdan gelen bilgi ile güncelleniyor yerel değişken değiller. Yani iki oyuncuda da counterlar aynı iken bir oyuncuda currentPlayer “O”, diğer oyuncuda “X”.

Değişkenlerimizi tanımlıyoruz.

Counterlar ile tahtamızdaki X ve O sayısını tutuyoruz böylelikle eğer “X” ve “O” sayısı eşit ise sıra “O” da.

isPlayable ile oyunumuzun durumunu tutuyoruz. Oyun ilk işlemler tamamlandıktan sonra oynanmaya hazırsa 1 değilse 0. Eğer tur bitmiş reset gerekiyorsa 2.

boardArray oyun tahtamızda bulunan kutucuklar.

Public değişkenler ile sahnemizdeki gameObjectleri tanımlıyoruz detaylar için sahnemi inceleyebilirsiniz.

Public değişkenleri tanımlamak için hierarchy deki gameObjectleri, hierarchydeki gameManager nesnemize tıkladıktan sonra inspectorda gameManager nesnemizin içerisinde bulunan gameManager script’imizin içindeki kutucuklara sürükleyip bırakıyoruz.

Enumlarımızı tanımlıyoruz daha anlaşılır olması için.

Start methodumuzda tuşlarımızın onCLick Listenerlarını tanımlıyoruz.

Reset tuşu play tuşu basılmadıysa çalışmıyor.

oyuncu1 ve oyuncu2 tuşları join tuşları. Oyuncuların tahtaya oyun odasında koltuğa oturması için. Eğer başka bir oyuncu koltuktaysa yani join yazmıyorsa yada oyun oynanabilir değilse tuşlar çalışmıyor.Tuşa tıklanınca mesela oyuncu2'ye tıklanınca currentPlayer X oluyor ve database güncelleniyor.

Tuşlar hakkında daha detaylı bilgi için yukarıdaki 6 maddelik oyunun çalışma mantığını daha detaylı anlattığım kısıma göz atabilirsiniz.

LateUpdate: Her frame’de tek bir kez çalıştırılır. Ve her framede tahtadaki kutucuklara tıklandı mı diye kontrol ediyor.

Her kutucuğun tag’leri gridCell ve BoxColliderları var.

Eğer kutucuğa tıklandıysa currentPlayer’ın boş olmadığını kontrol ediyor. Sonra kutucuğun boş olduğunu ve oyunun oynanabilir olduğunu kontrol ediyor. Eğer tüm koşullar sağlanıyorsa kutucuğu currentPlayer’ın sembolü ile yani X ise X, O ise O ile dolduruyor ve bunu aynı zamanda databasede güncelliyor.

getCurrentPlayer methodu currentPlayer’ın sembolünü CellScript içindeki CellStates olarak döndürüyor ve bu CellStates ile Cell’lerin yani kutucukların Statelerini yani durumlarını güncelleniyor.

(CellState ile kutucukların güncellenmesi kullandığım asset ile ilgili referanslarda linkine ulaşabilirsiniz.)

UpdateWithData methodu ile realtime olarak databaseden yakaladığımız datayı sahneye yansıtıyoruz. Realtime ile datayı nasıl yakaladığımızı öğrenmek için bir önceki yazımı daha detaylı inceleyebilirsiniz. UpdateWithData oyunumuzun çok oyunculu olduğu kısım.

Öncelikle Counterları sıfırlıyoruz.

Eğer gelen datadaki nesnenin ID si 10 veya 11 ise onlar oyuncu1 ve oyuncu2 ilk 9 tahtadaki kutucuklar.

BoardArray bizim public değişken listemiz. Sahnemizdeki kutucukları tutuyor. Gelen datadaki nesnelerin sembolleri ile yereldeki kutucukları güncelliyor ve yeni tanımladığımız WİnnerCondition arrayine koyuyor. Sonra bu array’i CheckforWinner methoduna gönderiyoruz ve kazanan var mı diye kontrol ediyoruz her seferinde.

Eğer nesnenin IDsi 10 ve 11 ise join yazısını oyuncuların isimleri ile güncelliyor.

Eğer karşıdaki oyuncu resete tıklarsa bunu kontrol ediyor ve diğer oyuncuda da çalışması için gerekli değişiklikleri yapıyor böylece iki oyuncuda bir sonraki tura hazır oluyor.

CheckForWinner ile kazanan var mı tespit ediyoruz. Eğer her kutucuk dolmuş ve kazanan yoksa berabere.

Ve son olarak ClearBoard methodumuz ile tüm oyunu resetledikten sonra bunu karşıdaki oyuncuda da etki etmesi için database’i de resetliyoruz.

Dikkat etmeniz gerekenler:

Öncelikle bu yazım 3 yazılık bir serinin son kısmı önceki yazılarımı da dikkatli okumanızı tavsiye ederim.

Bu 3 yazılık seride olabildiğince kısa bir şekilde sizlere Huawei Cloud DB ile Unityde çok oyunculu basit bir oyunu nasıl yapabileceğinizi göstermeye çalıştım. Gerisi sizin tamamıyla sizin yaratıcılığınıza kalmış.

Umuyorum ki sizlere Unity ile çok oyunculu oyun yapma konusunda yeni fikirler sunabilmiş ve yardımcı olabilmişimdir. Diğer yazılarımda görüşmek üzere :)

Referanslar:

Part1: Cloud DB’nin Unityde HMS Unity eklentisinin 2.0 Sürümüyle Entegrasyonu

Part2: Unityde Cloud DB Kullanımı

Kullandığım Unity asseti: Tic-Tac-Two: Turn-Based Game Tutorial v2.1

--

--