Unreal Engine Multiplayer Programlama Kavramları: Bu eğitimde, Unreal Engine'in multiplayer özellikleri hakkında incelemeler yaparken, öğreneceğiniz temel kavramları keşfedeceksiniz İster acemi ister deneyimli bir geliştirici olun, bu eğitim, Unreal Engine'de çok oyunculu oyun geliştirme konusunda sizi daha ileri seviyelere taşıyacaktır

Bugünlerde video oyunları giderek popüler hale geliyor ve birçok oyunun multiplayer özellikleri var. Bu multiplayer özellikleri, oyuncuların birbirleriyle etkileşim kurabilecekleri bir oyun ortamı sunuyor. Ancak bir multiplayer oyun geliştirmek, birçok farklı unsuru dikkate almayı gerektirir.
Bu makalede, Unreal Engine kullanarak multiplayer oyunlar geliştirmek isteyenler için temel kavramları ele alacağız. Bunlar arasında client-server mimarisi, replicasyon, netcode, istemci tipleri, ve kararlılık gibi konular bulunuyor.
- Client-server mimarisi, oyuncuların birbirleriyle etkileşimde bulunduğu çoğu multiplayer oyunun temel yapı taşıdır.
- Replicasyon, oyuncuların oyun dünyasının farklı yerlerindeki nesneleri görmelerini sağlar.
- Netcode, oyuncuların birbirleriyle iletişim kurmasını ve oyunun doğru bir şekilde çalışmasını sağlar.
- Istemci tipleri, oyunun nasıl çalışacağına dair önemli bir rol oynar.
- Kararlılık, oyuncuların oyunu düzgün bir şekilde oynamalarını sağlar.
Bu kavramları anlamak, multiplayer oyun geliştirme sürecinde önemli bir adımdır. Unreal Engine kullanarak multiplayer oyun geliştirmeyi öğrenmek isteyenler için bu makale temel bir başlangıç noktası sağlayacaktır.
Client-Server Mimari
Oyuncuların birbirleriyle etkileşime geçmek istedikleri çoğu multiplayer oyun, client-server mimarisi kullanır. Bu mimaride, oyuncular client rolünde olur ve oyun oynadıkları cihazlar (bilgisayar, tablet, telefon vb.) gibi cihazları kullanarak sunucuya bağlanır.
Sunucu, tüm oyun verilerinin gerçek kaynağıdır ve oyuncular her zaman sunucudan talep ettikleri verileri alırlar. Oyuncuların gönderdikleri veriler de sunucuya iletildikten sonra diğer oyuncuların görmesi için replike edilir. Replikasyon işlemi, ağ trafiği için önemliyken, aynı zamanda hızlı ve düzgün bir şekilde gerçekleştirilmelidir.
Client-server mimarisi, oyunun kararlılığı için çok önemlidir. Sunucu, oyunu yöneten kesindir ve oyunu verilerinin düzgün bir şekilde işlenmesini sağlar. Oyuncuların hile yapmalarını önlemek, veri kaybını önlemek ve oyunun bir takım varsayımlarına dayalı olarak düzgün çalışmasını sağlamak için de kullanılır.
Replication
Replication, multiplayer oyunlarda çok önemli bir kavramdır. Oyuncuların birbirleriyle senkronize olması ve aynı oyun dünyasında bulunmaları, doğru bir şekilde çalışan bir multiplayer oyunu için gereklidir.
Replication, oyundaki her öğenin hangi istemciler ve sunucular tarafından görülebileceğini belirler. Bazı öğelerin yalnızca sunucuda veya yalnızca istemcide yer alabileceğini bilmek önemlidir. Sunucuda bulunan öğeler, istemcilere gönderilirken replike edilirler. Bunun tersi de geçerlidir, istemcide yer alan öğeler ise sunucuya gönderilirken replike edilirler.
Bazı öğelerin, sadece sunucuda veya sadece istemcide olması gerektiğinde karşımıza "Server-Only Replication" ve "Client-Only Replication" terimleri çıkar. Sunucuda bulunan skor öğesi gibi bir öğeyi, istemcinin bilmesi gerekmez ve sadece sunucuda tutulur. Benzer şekilde, sadece istemcide bulunan bir arayüz öğesi gibi bir öğenin de sunucu tarafından bilinmesine gerek yoktur.
Bu konuda kullanabileceğimiz bir kavram ise "Replication Graph"dir. Replication Graph, bir multiplayer oyunun nasıl çalıştığına dair daha geniş bir kavramdır ve hangi öğelerin replike edileceğini kontrol etmek için kullanılır.
Server-Only ve Client-Only Replication
Multiplayer oyunlarında bazı öğelerin sadece sunucuda veya sadece istemcide replike edilebileceğini bilmek önemlidir. Bu, oyunda yer alan öğeler arasında bir ayrım yapılmasını sağlar ve doğru bir şekilde çalışmasını sağlar.
Bazı öğeler, sadece sunucuda bulunur ve istemciye replike edilmez. Bunlar genellikle oyuncular arasındaki etkileşimleri doğrudan etkilemeyen özelliklerdir. Bir örnek olarak, skor öğesi verilebilir. Bir oyuncunun skoru sadece sunucuda tutulur ve istemciler bu bilgiye direkt olarak erişemez. Skorun güncelleme işlemi sadece sunucuda gerçekleşir ve diğer istemciler skorun güncellendiği durumu yalnızca sunucudan analiz edebilirler.
Diğer öğeler, sadece istemcide bulunur ve sunucuya replike edilmez. Bunlar genellikle oyuncuların arayüzlerinde veya karmaşık istemci işlevlerinde görülür. Örneğin, bir oyuncunun etrafındaki ortam sesleri sadece istemcide yer alır ve sunucuya gönderilmez.
Her ne kadar bu öğeler oyuna doğrudan etki etmese de, onların doğru bir şekilde çalışması oyunun kararlılığı açısından önemlidir. Bu nedenle, Unreal Engine'deki bu kavramlar hakkında bilgi sahibi olmak, çoklu oyuncu oyunları geliştirmek isteyenler için önemlidir.
Server-Only Replication
Server-only replication, as the name suggests, is when certain elements of a multiplayer game are only present on the server and not replicated to the client. A key example of this is the game score.
Since the server is responsible for managing the game and maintaining its integrity, it makes sense that certain elements are only accessible by it. The client doesn't need to have access to every single piece of information, especially if it could potentially lead to cheating or other malicious actions.
With server-only replication, the client relies on the server to provide accurate information and updates about the game state. This means that the client has limited control over certain elements of the game, but it ensures the fairness and stability of the overall experience.
In order to properly implement server-only replication, developers must carefully consider which elements should be owned by the server and which can be safely replicated to the client. This decision must take into account both gameplay and network performance considerations. A well-designed server-only replication system can help ensure a smooth and fair multiplayer experience for all players involved.
Client-Only Replication
Client-only replication, as the name suggests, refers to the items that exist only on the client-side and are not replicated to the server. These items include UI elements such as health bars, scoreboards, and minimaps, which are not necessary for the server to know in order to maintain the game's integrity.
It's essential to be familiar with which items can be client-only replicated and which cannot. This knowledge can optimize bandwidth usage and improve the game's overall performance. However, it's important to note that this optimization should not come at the cost of gameplay elements that are necessary for maintaining the game's integrity and fairness.
Replication Graph
Replication Graph, multiplayer oyunlarında oyuncuların gördüğü veya etkileşime girdiği öğelerin nasıl replike edileceğini kontrol etmek için kullanılan bir sistemdir. Bu, sunucunun oyunculara gönderdiği veri miktarını azaltarak, performansı artırır ve oyunun daha akıcı bir şekilde oynamasını sağlar.
Replication Graph, bazı öğelerin her istemciye her zaman gönderilmesi gerektiğini, bazı öğelerin yalnızca yakındaki oyunculara gönderilmesi gerektiğini veya bazı öğelerin yalnızca sunucuda tutulması gerektiğini belirleyebilir. Bu, öğelerin senkronize bir şekilde replike edilmesini sağlayarak oyunun sağlam bir şekilde çalışmasını garanti eder.
Replication Graph, Unreal Engine'in varsayılan client-server mimarisi ile uyumlu olarak çalışır ve gerekli ayarlamaları yapmak için Blueprint veya C++ kodu kullanabilirsiniz.
Netcode
Netcode, bir multiplayer oyunun nasıl çalıştığına ve oyuncuların birbirleriyle nasıl etkileşimde bulunduğuna dair daha geniş bir kavramdır.
Bir multiplayer oyunun doğru çalışması, gecikmesiz ve sorunsuz bir şekilde gerçekleşmesi için sağlıklı bir netcode tasarımı ve uygulaması gereklidir. Netcode, oyuncuların birbirleriyle etkileşim kurduğu oyunları tasarlamak ve geliştirmek için kullanılan bir kavramdır. Oyuncuların birbirleriyle nasıl etkileşime girdiği ve oyun dünyasında nasıl hareket ettikleri, netcode tarafından belirlenir ve yönetilir.
Predictive netcode, istemcilerin kendi girdilerini işlemelerine ve sonuçlarını sunucudan beklemelerine dayanır. Bu sayede istemciler, sunucudan yanıt gelmesini beklemeden kendi girdilerinin sonuçlarını görüntüleyebilirler. Bu, daha hızlı tepki süreleri ve daha akıcı bir oyun deneyimi sağlar. Client-side prediction, predictive netcode'ın önemli bir parçasıdır. Sunucu, istemcinin tahminlerini doğrulamak için kendi hesaplamalarını yapar ve böylece oyun dünyasında tutarlı ve doğru sonuçlar elde edilir.
Rollback netcode, her istemcinin girdileri için öngörülen sonuçları kaydeder ve sadece sunucunun girdilerinde farklılık olduğunda geri döner. Bu sayede, oyuncuların girdileri hızlı ve sorunsuz bir şekilde işlenir, ve her oyuncunun oyun dünyasında tutarlı bir deneyim yaşaması sağlanır.
Netcode, bir multiplayer oyunu tasarlarken ve yaparken dikkate alınması gereken önemli bir faktördür. Doğru bir netcode tasarımı ve uygulaması, oyuncuların oyunu sorunsuz bir şekilde oynamasını ve keyifli bir deneyim yaşamasını sağlayabilir.
Predictive Netcode
Predictive netcode, multiplayer oyunlardaki sunucu-istemci ilişkisinde büyük bir rol oynamaktadır. Bu yöntem, istemcilerin kendi girdilerini işlemelerine ve sonuçlarını sunucudan beklemelerine dayanır. Böylece, herhangi bir gecikme olmadan eylemler gerçekleştirilebilir.
Client-Side Prediction, Predictive Netcode yöntemleri arasında en popüler olanıdır. İstemci, girdileri işleme konusunda biraz daha özgürlüğe sahiptir ve sunucu ile iletişimde bulunmadan önce önceden tahminler yapabilir. Bu sayede daha akıcı ve daha doğal bir oyun deneyimi sağlanmış olur.
Server Reconciliation, bu süreçte sunucu tahminlerin doğruluğunu kontrol eder ve geçerli olmayanları düzeltir. Bu sayede, istemcilerin olası yanlış tahminleri engellenir ve oyunun adil bir şekilde oynanması sağlanır.
Predictive Netcode yöntemi sayesinde oyuncular daha düşük gecikme süreleri ve daha hızlı tepki süreleri yaşayacağı için oyun daha keyifli hale gelir.
Client-Side Prediction
Multiplayer oyunlarda, istemcilerin sunucudan yanıt gelmesini beklemek yerine kendi girdilerinin sonuçlarını görüntüleyebilirler. Bu özellik, oyunculara daha hızlı ve kesintisiz bir oyun deneyimi sunar. Client-side prediction, çoğu zaman hareketle ilgili öğelerde kullanılır. Örneğin, karakterin konumu, animasyonları, silahlar ve daha fazlası.
Bununla birlikte, client-side prediction da bazı hatalara neden olabilir. İstemci tarafından tahmin edilen sonuçlar, sunucu tarafından doğrulanmazsa, hatalar meydana gelebilir. Bu da oyuncuların oyunun doğru şekilde çalışmasını engeller. Bu nedenle, client-side prediction kullanılırken, sunucu tarafından doğrulama süreci de ayrıca düşünülmelidir.
Bu özellik, oyuncuların daha az gecikme ve daha hızlı tepki süreleri ile oyun oynamasını sağlar. Ancak, kararlı bir oyun deneyimi için doğru şekilde konfigüre edilmesi gereklidir.
Server Reconciliation
Bir multiplayer oyununda, istemcilerin girdileri, sunucuya gönderilir ve sunucu da bu girdilere uygun yanıtlar verir. Ancak, istemcilerin internet bağlantılarından kaynaklı gecikmeler nedeniyle, sunucu tarafından verilen yanıt, istemcinin tahmininden farklı olabilir. Bu durumda, sunucu yapacağı hesaplamalarla, istemcinin tahmininin doğruluğunu kontrol eder ve düzeltir. İşte burada, Server Reconciliation devreye girer.
Sunucu, istemcinin tahminlerini doğrulamak için kendi hesaplamalarını yapar. İstemcilerin girdileri, sunucuya gönderilmek üzere kuyruğa alınır ve sunucu tarafından gecikme süresi hesaplanarak, istemcinin tahminlerine göre hesaplamalar yapılır. Bu hesaplamalar sonucu, sunucu tarafından yanıt, istemcinin tahmininden biraz farklıysa, sunucu, doğru sonucu hesaplayarak, istemciye gönderir.
Rollback Netcode
Rollback netcode, multiplayer oyunlarda sıkça kullanılan bir tekniktir. Bu teknik ile her istemcinin girdileri için öngörülen sonuçlar kaydedilir ve sadece sunucunun girdilerinde farklılık olduğunda geri döner. Bu sayede gecikme, hatasız bir şekilde giderilir ve oyuncuların daha eşit bir platformda oynamalarına olanak tanır.
Bu teknik, özellikle hızlı tempolu oyunlarda kullanılır. Bu tür oyunlar, düşük gecikme süresine sahip olmalıdır. Herhangi bir gecikme, oyuncuların tepki sürelerini etkileyebilir ve istenmeyen sonuçlara neden olabilir.
Rollback netcode, oyunun doğru bir şekilde çalışması için çok önemlidir, ancak uygulanması oldukça zordur. Oyun geliştiricileri, bu teknik için büyük bir öngörü ve planlama gerektirir. Bunun yanı sıra, oyun motorunun kendisi de bu teknik için uygun bir şekilde yapılandırılmalıdır.
İstemci Tipleri
Multiplayer oyunlarında, oyuncuların oyunu oynayabilecekleri birçok farklı istemci tipi kullanılabilir. Her bir istemci tipi, oyuncuların doğru bir şekilde etkileşime girmesini sağlayan benzersiz özelliklere sahiptir.
Bunlardan ilki, Dedicated Server (DS)'dır. Bir sunucu, sadece oyuncuların etkileşim kurmasına izin verir ve oyuncuların kendileri tarafından çalıştırılamaz. Bu, daha büyük oyunlarda birçok oyuncunun aynı anda oynadığı zamanlarda performansı artırabilir ve eş zamanlı çoklu iş yürütme açısından daha iyidir. Ancak, bir DS'nin yüksek maliyetleri vardır ve yönetilmesi zor olabilir.
Bir diğer istemci tipi Listen Server (LS)'dır. Listen server, bir oyuncunun hem sunucu hem de istemciyi aynı anda çalıştırdığı bir yapıdır. Bu, küçük oyunlarda doğru bir seçim olabilir, ancak büyük oyunlarda performans sıkıntısı yaratabilir ve {{client lag}} gibi sorunlara neden olabilir.
Son olarak, Peer-to-peer (P2P), oyuncular arasında doğrudan bir bağlantı kurulmasına izin verir, bu da daha az gecikme ve daha hızlı tepki süreleri sağlar. Bu, özellikle küçük oyunlarda ve oyuncuların yakın bir konumda olması durumunda etkilidir. Ancak, P2P'nin güvenilirliği düşük olabilir ve oyuncular arasında eşit bir paylaşımı garanti edemez.
Dedicated Server
Bir multiplayer oyun için kullanılacak sunucu tipi, oyunun kararlılığı ve performansını doğrudan etkiler. Dedicated server, sadece oyuncuların etkileşim kurmasına izin verir ve oyuncuların kendi bilgisayarlarından çalıştırılamaz. Bu, daha yüksek bir güvenilirlik sağlar ve oyuncuların oyun sırasında olası hatalar yaşamasının önüne geçer.
Dedicated server, sunucu yöneticisi tarafından yönetilir ve genellikle ücretli bir hizmet olarak sunulur. Bu nedenle, küçük ölçekli oyun geliştiricileri için bir seçenek olmayabilir. Bununla birlikte, büyük bir oyuncu kitlesine sahip olan ve gelir sağlayan oyunlar için, yatırımın karşılığı çok daha yüksek olabilir.
Listen Server
Listen Server, birçok multiplayer oyununda kullanılan bir istemci tipidir. Bu yapıda, bir oyuncu hem sunucu hem de istemci rollerini aynı anda üstlenir. Oyuncu, oyunu başlatarak, diğer oyunculara erişim sağlar ve oyunu başlatmak istediği haritayı seçer. Listen Server, internet üzerinden bağlantı kurduğu diğer oyunculara, oyunu başlatmak için görevlendirilmiştir.
Bir Listen Server, performans açısından pek çok avantaja sahiptir. Örneğin, oyuncular yerel bir ağda bağlandıklarında gecikme süresi oldukça düşüktür. Ayrıca, oyuncular yeni bir oyun başlattıklarında, Listen Server'ın kapasitesi, oyuncuların sayısına göre dinamik olarak ayarlanabilir. Bu da, oyunun daha verimli bir şekilde çalışmasını sağlar.
Listen Server, oyuncuların sunucu yönetimi işlemlerini de yapmalarına izin verir. Örneğin, Listen Server'a sahip olan bir oyuncu, banlama veya oyun kurallarını değiştirme gibi işlemleri yönetebilir. Ancak, Listen Server'ın bazı dezavantajları da vardır. Örneğin, sunucuyla ilgili herhangi bir sorun olduğunda, diğer oyuncular oyun oturumundan kopabilirler. Bu da, iş performansına ciddi bir zarar verebilir.
P2P
Peer-to-peer (P2P) teknolojisi, multiplayer oyunlar için kullanılan bir diğer istemci tipidir. Bu sistem, oyuncular arasında doğrudan bir bağlantı kurulmasına izin verir ve bu sayede sunucu kullanım maliyetini düşürür. P2P ağı, oyuncuların birbirleriyle direk bağlantı kurarak oynadığı bir sistemdir.
Bu teknoloji aynı zamanda daha az gecikme ve daha hızlı tepki süreleri sağlar. Diğer istemci tiplerine göre daha hızlı bir sistem olan P2P, oyuncular arasında doğrudan bir haberleşme kanalı oluşturur.
P2P teknolojisi, oyunculara daha fazla kontrol sağlar ve aynı zamanda oyunun sunucu tarafından kontrol edilmesi gereken kısımlarında bazı zorluklar ortaya çıkarabilir. Bu teknolojinin güvenliği de diğer istemci tiplerine göre daha azdır ve bu nedenle gizli bilgilerin iletilmesi durumunda risk oluşturabilir.
P2P ağı, birden fazla oyuncunun bağlı olduğu bir ağdır ve genellikle sınırlı sayıda oyuncu sayısı ile sınırlıdır. Oyuncular arası doğrudan bağlantı, her oyuncunun diğer oyuncularla etkileşimleri arasındaki gecikmeyi minimum düzeye indirir.
P2P kullanımı, tek bir sunucudan daha az maliyetli olabilir. Ancak, oyuncular arasındaki doğrudan bağlantı olması nedeniyle güvenlik riskleri oluşturabilir. Bu nedenle, P2P, küçük ölçekli multiplayer oyunları için uygun bir seçenektir.
Kararlılık
Bir multiplayer oyunun kararlılığı, yapılan etkileşimlerin doğru bir şekilde senkronize olmasıyla ilgilidir. Eğer bir oyuncunun yaptığı bir hareket diğer oyunculara yeterince hızlı bir şekilde yansıtılmazsa, oyunda hatalar meydana gelebilir.
Bu nedenle, bir multiplayer oyunun kararlılığı sağlamak için farklı faktörler düşünülmelidir. İlk olarak, replication lag önemli bir rol oynar. Replication lag, sunucudan istemcilere bilgi aktarırken meydana gelen gecikme süresidir. Bu gecikme süresi ne kadar uzun olursa, oyuncuların oyunu oynaması o kadar zor olacaktır. Bu nedenle, replication lag en aza indirilmelidir.
Diğer bir faktör ise, client-side prediction errors'dir. İstemci tarafından tahmin edilen sonuçlar, sunucu tarafından doğrulanmazsa, hatalar meydana gelebilir. Bu hatalar, oyunda kesintilere neden olabilir ve kararlılığı azaltabilir. Bu nedenle, client-side prediction errors da en aza indirilmelidir.
Bunların yanı sıra, iyi bir multiplayer oyunu için sunucuların kararlı olması da gereklidir. Sunucu tarafında meydana gelen herhangi bir sorun, oyuncuların oyunu oynamasını engelleyebilir. Bu nedenle, sunucular düzenli olarak bakım ve güncellemeler için kontrol edilmelidir.
Sonuç olarak, bir multiplayer oyunun kararlılığı, oyuncuların oyunu düzgün bir şekilde oynamalarını sağlayan önemli bir faktördür. Bu faktörleri göz önünde bulundurarak, bir multiplayer oyunun geliştirilmesi sırasında kararlılık için gereken tedbirler alınmalıdır.
Replication Lag
Replication lag, multiplayer oyunlarda karşılaşılabilecek en yaygın sorunlardan biridir. Bu sorun, sunucunun verileri istemcilere aktarırken oluşan gecikme süresi olarak tanımlanabilir. Yani, sunucuda gerçekleşen bir eylem, istemcilere anında yansıtılmaz ve bu gecikme oyuna olumsuz etki edebilir.
Replication lag'in nedenleri arasında, yüksek trafik, zayıf bağlantılar, sunucunun yavaş veya meşgul olması, ağ problemleri ve hatta yerel bilgisayarın donanımı sayılabilir. Ayrıca oyuncuların konumları arasındaki ağ gecikmesi de bu soruna neden olabilir.
Replication lag, oyuncuların diğer oyuncularla senkronize olmasını zorlaştırır ve son derece sinir bozucu olabilir. Bu nedenle, geliştiriciler mümkün olduğunca yüksek kaliteli sunucular ve güçlü ağ bağlantıları sağlamalıdır. Ayrıca, verilerin mümkün olan en düşük gecikme ile istemcilere aktarılması için optimize edilmiş bir protokol kullanmak da yardımcı olabilir.
Client-Side Prediction Errors
Client-side prediction, as we mentioned before, lets clients process their own input and display their own result instead of waiting for confirmation from the server. However, if the server doesn't confirm the prediction made by the client, errors can occur. This is called Client-Side Prediction Errors.
Client-side prediction errors can manifest in many ways. For example, players may appear to move in strange directions or teleport from one point to another without any apparent cause. These errors occur when the client predicts something that doesn't match up with the server's reality.
Players may also observe that their actions appear delayed or out of sync with those of other players. This is often caused by issues with latency or network congestion. When too much information must be sent across a limited internet connection, the process slows down, resulting in delays and sync issues.
One way to prevent client-side prediction errors is to design the game in such a way that the client's predictions are more likely to match up with the server's reality. This can be accomplished by reducing the amount of latency between the client and server, using a more stable network connection, or by designing the game so that the client's predictions are more conservative.
If you encounter client-side prediction errors in your game, it's important to address them quickly. These errors can ruin an otherwise excellent gaming experience, and they may drive players away if left unchecked. With proper management and a well-designed game, however, these issues can be quickly resolved.