ISTANBUL TECHNICAL UNIVERSITY FACULTY OF COMPUTER AND INFORMATICS Implementing a Multiplayer 3D Game with AI Capabilities Erdem Emekligil 150110702 Burak Muhammed Göncü 040100961 04.06.2014 Faculty: Computer and Informatics Department: Computer Engineering Supervisor: Assoc. Prof. Dr. Feza Buzluca July 2014
I Özgünlük Bildirisi 1. Bu çalışmada, başka kaynaklardan yapılan tüm alıntıların, ilgili kaynaklar referans gösterilerek açıkça belirtildiğini, 2. Alıntılar dışındaki bölümlerin, özellikle projenin ana konusunu oluşturan teorik çalışmaların ve yazılım/donanımın benim tarafımdan yapıldığını bildiririm. İstanbul, 2014 Erdem Emekligil Burak Göncü
II ÖNSÖZ Bize bu çalışmamız sırasında yol gösteren, danışmanımız Sayın Doç. Dr. Feza BUZLUCA'ya, çalışmamız boyunca bize destek olan ailelerimiz, hocalarımız ve arkadaşlarımıza teşekkürlerimizi sunarız.
III IMPLEMENTING A MULTIPLAYER 3D GAME WITH AI CAPABILITIES (SUMMARY) In this project we tried to implement a 3D multiplayer game which features Real Time Strategy and Space Simulation elements in it. Because the game contains real time strategy features in it, it is necessary to support several player ships and their projectiles in the game. Thus two quality criterias arise which are as follows; Frame Per Second (FPS) Latency (must be below 80-100 milliseconds in multiplayer games) To keep the FPS as high as possible we must create efficient and lightweight algorithms and keep the polygon count of the scene objects as low as possible without sacrificing any quality. For the algorithm part, we tried to implement a lightweight and efficient AI system which is memory and CPU friendly and is also has a highly modular behavior system which enables the behaviors of the ships to be able to change according to the needs of the software. Instead of using AI algorithms such as A* we implemented more efficient algorithms that have a lower complexity than A*. For the multiplayer functionalities we used a authoritative P2P (Peer to Peer) system which uses the server a central communication hub. For the stability of the multiplayer experience we used TCP socket connections because the TCP protocol provides an error tolerant connection. Because of that the multiplayer system will contain fewer errors while interpolating the positions of the ships. At the other hand the socket connection provides a fast way to communicate between the clients (peers) and the server. The clients communicate at the beginning of the game via the RPC (Remote Procedure Call) messages that are also stored in the servers RPC cache (according to their calling order) which are used if the other player arrives after the master player. Also to keep the communication of the objects as low as possible, we sent the positions and the orientations of the ships which the other side receives and vice versa. There are basically two types of ships in the game which are as follows; Ordinary Ships : The ships that each client owns thus are controlled by the player Network Ships: Can be also considered dummy ships that the clients opponents use
IV ÇOKLU OYUNCULU VE YAPAY ZEKAYA SAHİP ÜÇ BOYUTLU OYUN GERÇEKLEMESİ (ÖZET) Son yıllarda oyunların hayatımızdaki yeri giderek artmaktadır. Özellikle mobil platformların gelişmesinden sonra pek çok kişi akıllı telefonlarına oyun yüklemektedirler. Bu gelişmeler sonucunda Türkiyede de oyun endüstrisi gelişmektedir. Bizler bu proje kapsamında üç boyutlu, bilgisayara karşı veya çoklu oyunculu oynanabilen bir oyun geliştirerek oyun endüstrisine katkıda bulunmak istedik. Geliştirilen oyunun senaryosun detayları ise tam belli olmamakla beraber oyun, düşman iki uzay kolonisinin filolarının savaşını konu alır. Oyun bu sebeple tasarımcıların ve harita editörlerinin kolay içerik geliştire bilmesi icin oyun içi öğeler mümkün oldukça dinamik tasarlandı. Oyun Unity3D oyun motoru ile C# dili kullanılarak geliştirilmiştir. Şuanda ki sürüm Windows platformunda çalışmaktadır, fakat Unity nin bize MonoDevelop APIsi araciligi ile sağladığı olanaklar sayesinde ileride mobil platformlardan ios, Windows Phone, Android ve BlackBerry e; masaüstü işletim sistemlerinden Linux ve MacOs a çıkartmak mümkün olacaktır. Proje kapsamında geliştirilen oyunda belirli bazı değerlere önem verilmiştir. Bu etmenler kullanıcının oyundan mümkün olan en yuksek keyifi alabilmesi açısından büyük önem arz eder. Bu etmenler: Saniyede gösterilen kare sayısı (FPS) Gecikme (Latency) Bu değerler oyunun oynanabilir düzeyde olması açısından oldukça önemlidir. Örneğin, FPS in 30 un altına düşmesi durumunda oyun insan gözünün algılayabildiği 24 FPS sınırına yaklaşmasından dolayı oyunun yavaşlamaya başladığı hissini uyandırıp ve oyunu keyif alınamaz hale gelecektir. Çoklu oyunculu modda ise gecikmenin ise 100 milisaniyeyi geçmesi durumunda ise karşı oyuncunun gemilerine ait bilgiler geç iletileceğinden oyunun kalitesi düşecektir. Bu değerlerin kullanıcının kendi yerel bağlantısından da kaynaklanabileceği gibi yazılımın
V yaratabileceği bir gecikme de söz konusu olabilir. Biz bu projede özellikle yazılımdan kaynaklanabilen gecikmeleri önlemeye çalıştık. Bu değerlerin optimal düzeylerde tutulabilmesi için bazı teknolojilerden faydalanılmıştır ve bazı kararlar alınmıştır. Bunlar: FPS i yüksek tutmak adına mermilerin pooling mekanizması kullanılmıştır. Ayrıca, yapay zekanın gerçeklenmesinde kompleks algoritmalardan kaçınılarak her frame de gerçekleşecek iş miktarı azaltılmaya çalışılmıştır. Gecikmeyi düşürmek için ise oyuncuların attığı mermiler dışındaki mermiler doğrudan gönderilmemiştir. İki oyuncu içinde gemiler aynı yerde olacağından, yapay zeka tarafından kontrol edilen taretler kalan mermileri lokalde oluşturacaklardır. Kodların yazımında yazılım tasarım örüntülerinden (software design patterns) faydalanılarak modüler bir kod ortaya çıkartılmıştır. Bu sayede sistem sonradan yapılacak değişikliklerden en az derecede etkilenecektir ve gelecekte yapılacak geliştirmeler daha kolay hale gelecektir. Ayrıca gemilerin ve silahların bazı değerlerinin sürekli kod üzerinden değiştirilmesine gerek kalmamasını sağlamak için XML yapısından faydalanılmıştır. Bu sayede gemiler üzerinde yapılacak değişiklikler için kodun derlenmesi gerekmemektedir. Ek olarak, XML yapısı oyunda ırk sistemini oluşturmada yardımcı olmuştur. Bu sayede birden farklı ırka ait gemilere ait XML ve görüntü (.obj) dosyaları tutularak istenilenler kullanılabilir. Bu özgürlüğün kullanıcılara sağlanması ile kullanıcılarında yeni ırklar ve gemi görselleri ekleyebilmesi sağlanmıştır. Oyundaki haritalarda bu XML yapısından yararlanacak şekilde tasarlanmıştır. Bu sayede harita tasarımcıları hiçbir kod bilgisine sahip olmadan oyundaki haritaları kolaylıkla tasarlayabilmektedirler. Oyunun çoklu oyuncu desteğini sağlamak adına sunucu merkezli bir eşten eşe (Peer to Peer - P2P) mimari kullanarak, sunucunun ana kontrol görevinin üstlenmesi sağlanmıştır. Çoklu oyuncu modunun kararlılığıi için TCP protokolünün kullanıldığı soket bağlantılar kullanılmıştır. Burada TCP protokolünün kullanılmasında ki başlıca sebep, bu protokolün beraberinde getirmiş olduğu hata toleransı ve veri güvenilirliği yüksek bir bağlantı sağlamasıdır. Bu sayede oyundaki gemilerin pozisyonlar arasındaki interpolasyon işlemiden çıkan sonuç gerçeğine büyük ölçüde yakın ve hataları az bir sistem oluşturacaktır. Öte yandan soket bağlantısı merkez sunucu ile istemciler arasında hızlı bir
VI bağlantı kurmamıza olanak sağlar. İstemciler oyunun başında sunucu aracılığı ile RPC (Remote Procedure Call) mesajlarını göndererek oyundaki gemilerinin yerleşimleri ve gemilerinin özelliklerini birbirleri ile paylaşırlar. Bu mesajlar diğer tüm istemcilere gönderilmeden önce sunucunun RPC önbelleğinde tutulur. Bunun sebebi, istemcilerden birinin gecikmesi durumunda (RPC mesajları dagıtıldıktan sonra) bu mesajları sunucunun önbelleğinden gönderilme sırasına göre alabilmektedirler. Bu sayede oyundaki tüm oyuncular aynı konfigürasyona sahip olmaktadırlar. Ayrıca oyun sırasındaki ağ iletişiminin en az seviyede olması için gemilerin pozisyon ve rotasyon bilgileri istemciler arasında paylaşılmaktadır. Mermiler ve bunun gibi objeler gemilerin konumuna bağlı olarak oluştukları için bunların gönderilmesi yönünde bir karar alınarak ağ iletişiminin performansı arttırılmıştır. Bu kapsamda oyundaki iki gemi objesi aşağıdaki gibidir; Sıradan Gemiler : Kullanıcıların ve onların yapay zekalarının direkt olarak kontrol ettikleri gemilerdir. Bu gemiler çoklu oyuncu modunda konum ve rotasyon bilgilerini sunucu aracılığı ile karşıya göndermektedirler. Ağ Gemileri: Bu gemiler birnevi bir kukla görevi görüp, sunucudan gelen rakibin gemilerine ait pozisyon ve rotasyon bilgilerini interpolasyon ile oyun sahnesine yansıtırlar.
VII INDEX IMPLEMENTING A MULTIPLAYER 3D GAME WITH AI CAPABILITIES... III ÇOKLU OYUNCULU VE YAPAY ZEKAYA SAHİP ÜÇ BOYUTLU OYUN GERÇEKLEMESİ... IV 1. INTRODUCTION... 1 2. DEFINITION AND PLAN OF THE PROJECT... 2 2.1. Definition of the Project... 2 2.2. Analysis... 3 2.3. Distribution of Modules... 3 3. THEORETICAL INFORMATION... 5 3.1. Design Patterns... 5 3.1.1. Factory Design Pattern... 5 3.1.2. Strategy Design Pattern... 5 3.1.3. Bridge Design Pattern... 5 3.1.4. Decorator Design Pattern... 5 3.1.5. Singleton Design Pattern... 6 3.1.6. Observer Design Pattern... 6 3.2. Unity3D... 6 3.2.1. GameObject... 6 3.2.2. Transform... 7 3.2.3. Callback Methods... 7 4. ANALYSIS AND MODELING... 10 4.1. UML Diagrams... 10 4.1.1. Weapon... 10 4.1.2. Ship... 10 4.1.3. Factory... 11 4.2. Pooling... 12 4.3. Network Multiplayer... 12 4.4 Multiplayer Matchmaking... 14 5. DESIGN, IMPLEMENTATION AND TEST... 16 5.1. XML Design... 16 5.1.1. Ship Property... 16 5.1.2. Save File... 16 5.1.3. Map... 17
VIII 5.2. Ship AI Logic... 18 5.3. Ship AI States... 19 5.4. Weapon Targeting... 21 5.5. Multiplayer... 22 5.6. Game Creator... 23 5.7. Ammunition Pooling... 24 5.8. Graphical User Interface... 24 6. EXPERIMENTAL RESULTS... 27 6.1. CPU and Memory Utilization... 27 6.1.1. Start of the Game Session... 27 6.1.2. During the Game... 27 6.2. Network... 29 7. CONCLUSION AND PROPOSALS... 30 8. REFERENCES... 31 9. SOURCES... 32