In this section, you will use SyncProperty to update player's hp.
Why using SyncProperty
SyncProperties are designed for updating states that are not constantly changing.
Only send/receive when the property updates
Reliable
Supports serializable objects
Supports user-defined classes and structs.
Supports conflict resolution
SyncPropertyAgent
Select the Player Prefab. Click the Add Component button and Search "Agent", select Sync Property Agent to attach it to the Player GameObject.
Click the Add Sync Property button to create a SyncProperty for the Player. The Property's name is important and has to be unique in the same SyncPropertyAgent component. Set Name to "hp" and set Type to Int. The Conflict Resolution rule is default to Mine. You can use Mine for this tutorial. For more information on Conflict Resolution, please visit the following page.
publicvoidOnHPReady() {Debug.Log("OnHPPropertyReady"); // Get the current value of the "hp" SyncProperty. currentHP =syncPropertyAgent.GetPropertyWithName("hp").GetIntValue(); // Check if the local player has ownership of the GameObject. // Source GameObject can modify the "hp" SyncProperty. // Remote duplicates should only be able to read the "hp" SyncProperty.if (networkId.IsMine) {int version =syncPropertyAgent.GetPropertyWithName("hp").version;if (version !=0) { // You can check the version of a SyncProperty to see if it has been initialized. // If version is not 0, it means the SyncProperty has been modified before. // Probably the player got disconnected from the game. // Set hpSlider's value to currentHP to restore player's hp.hpSlider.value= currentHP; }else { // If version is 0, you can call the Modify() method on the SyncPropertyAgent to initialize player's hp to maxHp.
syncPropertyAgent.Modify("hp", maxHp);hpSlider.value= maxHp; } }else {hpSlider.value= currentHP; } }
Updating the GotHit() Method
publicvoidGotHit(int damage) { // Only the source GameObject can modify the "hp" SyncProperty.if (networkId.IsMine) { currentHP =syncPropertyAgent.GetPropertyWithName("hp").GetIntValue(); // Check if the player is already dead.if (currentHP ==0) {return; }Debug.Log("Got hit: old currentHP= "+ currentHP);if (currentHP >0) { currentHP = currentHP - damage; // if hp is lower than 0, set it to 0.if (currentHP <0) { currentHP =0; } }Debug.Log("Got hit: new currentHP= "+ currentHP); // Apply damage and modify the "hp" SyncProperty.syncPropertyAgent.Modify("hp", currentHP); } }
Handling the OnChanged SyncProperty Event
publicvoidOnHpChanged() { // Update the hpSlider when player hp changes currentHP =syncPropertyAgent.GetPropertyWithName("hp").GetIntValue();hpSlider.value= currentHP; }
Adding listeners to the "hp" SyncProperty
Make sure you applied the changes to the Player Prefab and disabled the Player GameObject in the Hierarchy.
Play
You can follow the steps in section "Test and Play" to test out the "hp" SyncProperty.