User Tools

Site Tools


global:netcode

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
global:netcode [2018/10/10 14:16]
Mistermind [Converting to 2.0]
global:netcode [2024/12/10 16:17] (current)
Mistermind
Line 2: Line 2:
  
 **UFE Netcode** is the second iteration of the network system for UFE. It allows the game to run online matches in a smooth lag-free environment thanks to its native //rollback mechanics// and //deterministic physics//. The netcode also uses raw //manual tracking// to its own core variables, optimizing CPU usage (even mobiles).\\ **UFE Netcode** is the second iteration of the network system for UFE. It allows the game to run online matches in a smooth lag-free environment thanks to its native //rollback mechanics// and //deterministic physics//. The netcode also uses raw //manual tracking// to its own core variables, optimizing CPU usage (even mobiles).\\
-The new network options also comes with its own client/server structure (using Photon Network, UNet, Steam among others) allowing direct player connection without the use of IP. +The new network options also comes with its own client/server structure (powered by Photon Network) allowing direct player connection without the use of IP.
- +
-[[http://www.ufe3d.com/demo/ufe2/pc/UFE2.zip|PC]] | [[http://www.ufe3d.com/demo/ufe2/webgl/|WebGL]] | [[http://www.ufe3d.com/demo/ufe2/android/UFE2.apk|Android]] +
- +
-  * Hit Online to search for a match (US Server) +
-  * All builds are **cross-platform**+
  
  
Line 19: Line 14:
   * **What is Rollback?**   * **What is Rollback?**
 Rollback (name might change depending on game or developer) is a technique in which a game is able to return to a previous frame, change the outcome of an event (say, an input), and return to the current frame, all in a span of a single frame of animation. This allows a game to //catch up// with whatever concurrent event instead of [[global:network|waiting]] for both clients to sync up. When done right this can create an experience nearly identical to local play.\\ Rollback (name might change depending on game or developer) is a technique in which a game is able to return to a previous frame, change the outcome of an event (say, an input), and return to the current frame, all in a span of a single frame of animation. This allows a game to //catch up// with whatever concurrent event instead of [[global:network|waiting]] for both clients to sync up. When done right this can create an experience nearly identical to local play.\\
-The subject can be extensive and have been topic of several games for years (often referred as [[https://en.wikipedia.org/wiki/GGPO|GGPO]]). You can read more about it on this great article by //@mauvecow//[[http://mauve.mizuumi.net/2012/07/05/understanding-fighting-game-networking/]]+The subject can be extensive and have been topic of several games for years (often referred as [[https://en.wikipedia.org/wiki/GGPO|GGPO]]). If you'd like to know more about the subject, there is a great video from Core-A Gaming on youtubehttps://www.youtube.com/watch?v=0NLe4IpdS1w
  
   * **If Rollback is so good, why use Frame Delay at all?**   * **If Rollback is so good, why use Frame Delay at all?**
Line 28: Line 23:
 ---- ----
 ===== Converting to 2.0 ===== ===== Converting to 2.0 =====
 +//This tutorial is meant for conversion between UFE 1 and 2. If you are starting from UFE 2 you can skip this step.//
 +
 UFE 2.0 was developed with backwards compatibility in mind. Several processes were created specifically to deal with converting large amounts of data at once. A prototype of your project with the new netcode can be created in less then an hour if you know what you are doing. The whole process can be divided in 4 easy steps: UFE 2.0 was developed with backwards compatibility in mind. Several processes were created specifically to deal with converting large amounts of data at once. A prototype of your project with the new netcode can be created in less then an hour if you know what you are doing. The whole process can be divided in 4 easy steps:
  
Line 33: Line 30:
  
 {{ :global:netcode_upgrade.jpg?direct&100|}} {{ :global:netcode_upgrade.jpg?direct&100|}}
-One of the key changes made to the code is the use of ''Fixed Point'' (Fix64), a format that replaces all uses of //float// throughout the code. This update copies all serialized Floats and Vectors to a new similar declaration.\\+One of the key changes made to the code is the use of ''Fixed Point'' (Fix64), a format that replaces all uses of //float// throughout the code. If you are running UFE 1.x and wish to update your files without having to redo them, use this system to update all serialized Floats and Vectors to a new declaration.\\
 To run the auto update, right click on one of your UFE files ([[global:introduction|Global]] , [[character:introduction|Character]] or [[move:introduction|Move]]) from the project tab and select "UFE 2.0 -> Update All Definitions". This will automatically assign all the new variables (including nested files).\\ To run the auto update, right click on one of your UFE files ([[global:introduction|Global]] , [[character:introduction|Character]] or [[move:introduction|Move]]) from the project tab and select "UFE 2.0 -> Update All Definitions". This will automatically assign all the new variables (including nested files).\\
 \\ \\
  
-  * **Step 2: Record Character Maps (PRO/Source)** +  * **Step 2: Update Character File**
-Now that we have our asset files converted to //Fix64// we can move to the next step to ensure synchronization: Map the character animations. This is a fairly simple process, but can be a bit time consuming depending on how many characters you have or how often you change your animation files.\\ +
-First, open the scene ''Scenes\MapRecorder.unity'' and under the hierarchy click on the Main Camera. Notice the script attached to it: Animation Recorder.  +
-{{ :global:netcode_animationrecorder.png?nolink |}} +
- +
-Drag one of your characters into the //Character Info// field and hit **Play**. If you have your hitbox setup correctly you should see something like this: +
-{{ :global:netcode_maprecorder.png?nolink |}} +
-Select the Move Set and click //Record Basic Moves// to start recording all animations listed under your basic moves into //Fix64// position maps. Once completed, do the same for //Special Moves// then hit **Stop**. Replace the character info file with the next character and repeat the process.\\ +
-\\ +
- +
-  * **Step 3: Update Character File**+
 Next up is the HitBoxes' radius, rectangles and offsets. Because these values are recorded under the prefab itself we need to do this from the Character Editor. Open the Character under Hit Box Setup and hit "Restore Legacy Values": Next up is the HitBoxes' radius, rectangles and offsets. Because these values are recorded under the prefab itself we need to do this from the Character Editor. Open the Character under Hit Box Setup and hit "Restore Legacy Values":
 {{ :global:netcode_legacyvalues.png?nolink |}} {{ :global:netcode_legacyvalues.png?nolink |}}
Line 55: Line 42:
 \\ \\
  
-  * **Step 4: Photon Setup (PRO/Source)**+---- 
 +===== Photon Setup ===== 
 In order to have the client-server accessibility you need to download [[https://assetstore.unity.com/packages/tools/network/photon-unity-networking-free-1786|Photon Unity Networking]] and create your own Photon Account. Sign up for free: [[https://www.photonengine.com/en/PUN]]\\ In order to have the client-server accessibility you need to download [[https://assetstore.unity.com/packages/tools/network/photon-unity-networking-free-1786|Photon Unity Networking]] and create your own Photon Account. Sign up for free: [[https://www.photonengine.com/en/PUN]]\\
 Once you have an account go your Public Cloud -> Applications and copy your App ID as displayed here: Once you have an account go your Public Cloud -> Applications and copy your App ID as displayed here:
Line 76: Line 65:
 ===== Map Recorder ===== ===== Map Recorder =====
  
-One of the key elements that makes UFE easy to prototype is the guided transform hitbox system, meaning you only need to tell it where the joints are and UFE will take care of the rest. Unfortunately this means that we are tracking position information directly from the animation itself, and that value can only be read in //float// format (non-deterministic).\\ +One of the key elements that makes UFE easy to prototype is the guided transform hitbox system, meaning you only need to tell it where the joints are and UFE will take care of the rest. This means that we are tracking position information directly from the animation itself, and that value can only be read in //float// format (non-deterministic). 
-To solve this, Map Recorder runs and stores the //position maps// (and delta displacements) of all identified hitbox on every frame of animation throughout the character's moveset, saving them in //Fix64// format (deterministic). UFE Engine will then play these maps synchronously to the animation during gameplay.\\+ 
 +{{ :global:netcode_maprecorder.png?nolink |}} 
 + 
 +To solve this, Map Recorder runs and stores the //position maps// (and delta displacements) of all identified hitbox on every frame of animation throughout the character's moveset, saving them in //Fix64// format (deterministic). The Engine will then play these maps synchronously to the animation during gameplay.\\
 \\ \\
-Map Recorder is located at ''UFE\Scenes\MapRecorder.unity''. Run it whenever you have to add new moves or change one of the character's animation files.+Map Recorder is located at ''UFE\Engine\MapRecorder.unity''. Run it whenever you have to add new moves or change one of the character's animation files. 
 + 
 +{{ :global:netcode_animationrecorder.png?nolink |}} 
  
  
Line 139: Line 134:
  [RecordVar] public bool isBroken;  [RecordVar] public bool isBroken;
  
- void UFEFixedUpdate() {+ public override void UFEFixedUpdate() {
  if (position.y > .1f) BreakMe();  if (position.y > .1f) BreakMe();
  }  }
Line 152: Line 147:
 </code> </code>
  
-Notice we only use the //[RecordVar]// attribute to track the variables that can change during gameplay. Weight doesn't need to be tracked because it's assumed that value is persistent.\\+Notice we only use the //[RecordVar]// attribute to track the variables that can change during gameplay. Weight doesn't need to be tracked because it's assumed that value is persistent. //[RecordVar]// variables must be public.\\
 Also, notice we are using //UFEFixedUpdate// instead of //FixedUpdate// and //UFEBehaviour// instead of //MonoBehaviour//. This is so we can have those events deterministic.\\ Also, notice we are using //UFEFixedUpdate// instead of //FixedUpdate// and //UFEBehaviour// instead of //MonoBehaviour//. This is so we can have those events deterministic.\\
 An example of the auto-tracking system can be found under the projectile script: ''UFE\Scripts\ProjectileScripts.cs'' An example of the auto-tracking system can be found under the projectile script: ''UFE\Scripts\ProjectileScripts.cs''
Line 170: Line 165:
 ---- ----
 ===== Network 2.0 Options ===== ===== Network 2.0 Options =====
 +For a detailed explanation on each option [[global:network|click here]].
  
-{{ :global:global_netcode.png?nolink |}}+{{ :global:global_networkoptions.png |}}
  
-For a detailed explanation on each option [[global:network|click here]].+---- 
 +====== Video Tutorials ====== 
 +{{youtube>OSovR17apP0?large}} 
 +{{youtube>-dmVAf_cyN8?large}} 
 +{{youtube>j3B-lhd8JBw?large}}
  
  
global/netcode.1539195401.txt.gz · Last modified: 2018/10/10 14:16 by Mistermind