Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 12 Next capture
2021 2022 2023
1 capture
12 Jun 22 - 12 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by e64g · Nov 29, 2016 at 08:16 AM · networkingsynchronizationcommandsauthoritative server

Emulating authoritative-client behavior (like NetworkTransform) for SyncVars

As we all know, SyncVar values can only be set on the server, even by components with local authority. When developing an application where the player object controls particular SyncVars, the typical solution is to set their values using Commands. The following code does this with a Color variable:

 using UnityEngine;
 using System.Collections;
 using UnityEngine.Networking;
 
 public class Player : NetworkBehaviour {
     [SyncVar(hook="MyColorChanged")] Color myColor;
     void MyColorChanged(Color next) {
         myColor = next;
         GetComponent<Renderer>().material.color = next;
     }
 
     [ClientCallback]
     void Start () {
         transform.position = new Vector3 (5, 0, 0);
     }
 
     [ClientCallback]
     void Update () {
         if (isLocalPlayer) {
             transform.RotateAround (Vector3.zero, Vector3.up, Time.deltaTime * 100);
             Color next = Color.Lerp (Color.red, Color.blue, Time.time / 2.0f % 1.0f);
             myColor = next; // Does nothing unless we're the host
             CmdSetColor (next);
         }
     }
 
     [Command]
     void CmdSetColor (Color next) {
         myColor = next;
     }
 }

The problem with this approach is that the client player has to wait until the server has received the new SyncVar value and sent an update back before its local value becomes authoritative. This is especially problematic when the value is updated on every frame.

For example, when I run a host and a client with the above Player component, the host's color interpolates smoothly from red to blue, while the client's color stutters irregularly. If I call the SyncVar hook directly (e.g. MyColorChanged(next); in Update) the client's color changes more smoothly, but still occasionally flickers when it receives a server update.

However, the NetworkTransform on my player prefab does respect local player authority, and always moves smoothly on the client. My question comes down to this:

Is there any way to emulate the NetworkTransform's syncing behavior on ordinary SyncVars?

I'd appreciate any help I can get on the matter. I've tried a few solutions, and haven't had much luck. In particular, I'm really hoping to get this behavior without introducing too much extra complexity; I know I could do everything with non-SyncVars and some elaborate system of Commands and ClientRPCs, but it seems like overkill for such a simple problem.

Thanks a bunch!

Comment
Add comment
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

0 Replies

· Add your reply
  • Sort: 

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

4 People are following this question.

avatar image avatar image avatar image avatar image

Related Questions

Networking Sync SetActive Not Working 0 Answers

Animating online users sprite 0 Answers

Syncing large amounts of colliders in UNET/Photon? 1 Answer

Unity Editor Crash !!! 0 Answers

Unity Photon Transform Issues 0 Answers


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges