Building an educational game with .NET Core and Unity Johnny Hooyberghs
@djohnnieke 1 [email protected] Who am I
• Johnny Hooyberghs • @djohnnieke • github.com/Djohnnie
www.involved-it.be 2 What and Why
3 Why did I make this game?
• Gamification to teach basic C# knowledge in school • Learn the Unity Game Engine • Play with the Microsoft Compiler Platform (Roslyn) • Play with .NET Core 3 • Play with Azure DevOps Pipelines, Docker and Kubernetes • Use Test Driven Development
4 What is CSharpWars?
• Robots on arena (15x15) • Robots take turns (every two seconds, simultaniously) • Robots can move around the grid • Robots can attack other robots • Robots can see part of the arena • A turn is scripted using C# and all scripts will run every two seconds • A robot has a limited amount of health and stamina
5 Let’s play!
• Register as a player • Select a pre-defined script • Create your robot • Watch him struggle!
https://api.djohnnie.be:8802/
6 Architecture
7 What about the architecture?
• The Unity game engine for the arena frontend
• I wanted a full 3D experience
• I don’t need a full game experience, just a visualization of the battle
• I can fetch the game state every two seconds from an HTTP backend
• I can learn Unity!
8 What about the architecture?
• ASP.NET Core for the backend
• An ASP.NET Core WebApi HTTP API for Unity requests
• An ASP.NET Core MVC for the demo website
• An ASP.NET Core gRPC service for the validation service
• I can learn gRPC!
9 What about the architecture?
• .NET Core Worker Service for the processing middleware
• Worker service template for Windows Services, Linux Daemons or docker containers
• The Microsoft Compiler platform for C# compilation and execution at run-time
• I can learn Roslyn!
10 HTTP API Frontend
Database
Processor
WebApp Validator
11 Let’s see some code!
12 What did I learn?
13 Unity!
14 15 16 17 18 What did I learn in Unity?
• Unity = C#
• I can use my current knowledge
• I can use external assemblies and libraries (NuGet, …) but no direct support for NuGet
• Unity uses the Mono runtime, so no .NET Core
• Unity also provides the option to compile to native using IL2CPP
19 What did I learn in Unity?
• Modular workflow based on GameObjects
• I had to get used to the workflow, but I am getting used to it
• Lot’s of flexibility makes it easy and hard at the same time
• Unity has a wide range of support for 3d models (meshes), even Sketchup
• There is community support for dependency injection (ADIC, Extenject, …)
20 What did I learn in Unity?
• Platform independent
• Support for a number of platforms thanks to the Mono runtime
• Support for even more platforms thanks to IL2CPP
21 What did I learn in .NET Core?
• Using .NET Core with Docker containers is extremely easy
• .NET Core is more performant than .NET Framework
22 What did I learn in gRPC?
• For service to service communication, it is perfect and easy to use with support for async streams
• Better performance thanks to smaller payload size (binary)
• Only experimental support for Unity
23 What did I learn in Roslyn?
• Using the Microsoft Compiler Platform is easier than expected • Keeping memory usage low is a bit of a search • Infinite loops are not easy to detect • Running scripts cannot be cancelled • Use the validator service to check the scripts without damaging the processing middleware • Hosting the validator and middleware processor inside a docker container makes it easy to quickly restart
24 Thank You [email protected] @djohnnieke
https://github.com/Djohnnie/CSharpWars