Terminology, and more specifically labels, are a real problem. The problem is that what they actually mean often becomes distorted over time. I recently read a whole thread on the word “decimate”;

Normally I would simply argue that is the evolution of a word, and to understand someone’s use of a word you need to see the context it is…

The core design decision when using MLAPI is who has the responsibility for updating the data, is it the Server or the Client? For example, in my Xevious game the server is always responsible for creating/spawning an enemy, whereas the client is responsible for creating bullets (although they are started by a server call).

Created by Client or Server

There are a number of MLAPI features that help you achieve your design. Once such feature is called the Network Variable. However, in order to use it you may have to consider the lifetime of your components.

Player Lives as a Network Variable

I decided to store the current lives of…

Today I was following the basic setup tutorial for the Mixed Reality Tool Kit (MRTK). However, I hit a problem, I didn’t see any controllers and the little ‘Hello World’ cube was just stuck on the screen.

Boss with Nested Objects

My Xevious Boss is an object with five child, or nested, objects. To convert this into an MLAPI object I added a NetworkObject to each node, i.e. one for the root Boss and one each for the nested objects. When I instantiate the boss, or in MLAPI terms Spawn the boss, the root object would have a network Id but all the nested objects would just be set to zero. I have seen this before and I have previously worked-around the problem by making the root act as a relay/proxy for the children. …

German Tunic

A typical way of creating a character for your game is to take a 3D model of a person and craft the clothing onto it. That works well. However, it can be a little expensive if you want to create variations. For example, I have a Second World War German soldiers tunic, how can I easily make multiple variants of people wearing that tunic?


In this example I am using Reallusion Character Creator that allows me to import my Tunic as separate stand-alone object. Once imported I have converted it into a Character Creator Accessory. The accessory understands the spatial…

Today I was slapped in the face by MLAPI.

I have been happily testing Xevious using each individual level since essentially the levels contain the different types of enemies I need to make “network-ware”. However when I tried a complete run-through of the game it did NOT work.

Levels & the hierarchy

I have currently set up Xevious to use a level mechanism where all the levels are in the hierarchy, but only one is active. What I did not appreciate is that MLAPI makes optimisations based upon if the objects are active or not.

Inactive in the hierarchy, and not spawned

Therefore whilst my current level objects are all…

Orange Bomb Target

In my previous article I wrote about synchronising the bullets. Xevious has a secondary fire, a bomb that is dropped onto a bomb target. I.e. when you drop a bomb there are two objects created, a target and a bomb. Both of these must be synced between the players. Previously I have used two different mechanisms; a) Only create the objects on the Server and let MLAPI sync the Network Transform and Animations to the clients b) Sync the trigger of the “Drop Bomb” event and let the clients control their own local versions. The game rules for Xevious is…

Who gets the points?

In my previous article I talked about how you can achieve better performance by creating projectiles locally when compared with creating a server instance and keeping them synchronised with the clients. But what happens when the projectile actually hits something, who gets the points associated with killing the enemy?

Projectile Ownership

Whilst there are some subtleties in scoring (e.g. if player 2 hits the big baddy 99/100 times but player 1 has the last shot, how do you score that?) the basic problem is knowing who fired the shot that hit the enemy. In Xevious my projectiles have an IProjectile interface/contract. …

In my previous articles and video I demonstrated how to synchronize the enemy between the co-op players. Essentially it is about the Server using MLAPI Network Object and Network Transform.

Simplified Enemy Network Sequences

This works well for the enemy because the majority of the logic (firing, moving, etc.) is all held within the server and then distributed to the clients. However, player logic is different. The clients receive the player’s input and move the local player. This is then synced back to the server and distributed to the other players.

Recently I was reading a plea for help where someone was getting a, “your file is too large to upload” style error message from Git. That made me question, are we using Git correctly?

What is Git?

Whilst Git came from Linux as a source repository it has now taken on a life of its own. Honestly, I cannot definitively answer this question, but I can offer up some possible overlapping rationales. Note, many of these rationales apply equally well to other source repositories, not just Git.

Version Separation

Paul Marsh

Unity, VR, Enterprise and .Net Developer

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store