<<

Building an educational game with .NET Core and Johnny Hooyberghs

@djohnnieke 1 [email protected] Who am I

• Johnny Hooyberghs • @djohnnieke • .com/Djohnnie

www.involved-it.be 2 What and Why

3 Why did I make this game?

• Gamification to teach # knowledge in school • Learn the Unity • Play with the Platform () • 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, Daemons or docker containers

• The Microsoft Compiler platform for C# compilation and 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 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