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 artberry · Sep 10, 2015 at 06:16 PM · networkingrtsstructsynchronize

RTS game. UNet. How to synchronize structs or classes (unit orders)?

Hi! I am trying to make simplest RTS game.

The question is: how to send the orders (classes or structures) to the server from a client and then back to all clients?

As it's known, many of RTS games use so called command (order) based approach. Every unit has it's own "order queue", and we just put any given order for unit to it's order queue and it starts to execute the orders in the queue.

In multiplayer game, I would like to send (synchronize) only the orders for units between server and players (instead of unit positions, health, etc). So a player sends an order to server and then server sends given order to other players and back to sender also. And then units start to execute given order on all clients simultaneously.

In my case an order is a class:

 public class Order
 {
     public int orderType;
     public Unit orderUnit;
     // etc...
 }

Notice please, orderUnit is a Unit class which derives from MonoBehavior and it represents the target unit in order. For example the unit that will be attacked.

Could you give some tips on how to send to the server complex data which include "pointers" to gameObjects which are instances of MonoBehavior class?

Or in general, how to implement this approach? In simple words, how can server say to a client: "Hey! Take unit "A", and give him order "O", and say him to cast a spell to unit "B". How it could be implemented in UNet? Any common or practical tips will be very welcome :)

Thanks a lot.

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

1 Reply

· Add your reply
  • Sort: 
avatar image
1

Answer by AndreasLAN · Sep 14, 2015 at 10:37 AM

I'm making a similar system using UNET and the best way I found so far, is to send the players' input to the server by using [Command] calls and by using [ClientRpc] to broadcast the order from the server to all the clients.

 public void AttackFollowClick(Unit target){
     if (isServer) {
         RpcAttackFollow(target.transform.name);
     } 
     else {
         CmdAttackFollow (target.transform.name);
     }
 }
 
 [ClientRpc]
 void RpcAttackFollow(string UnitID){
     GameObject target = GameObject.Find (UnitID);
     AttackFollowTarget(target);
 }

 [Command]
 void CmdAttackFollow(string UnitID){
     GameObject target = GameObject.Find (UnitID);
     AttackFollowTarget(target);
     RpcAttackFollow(UnitID);
 }


You will still have the problem that the orders will arrive at unpredictable intervals at the client side, to compensate for this I also implemented a way to correct the units' positions according to the [SyncVar] unit position at the server end.

Regarding the pointers, you need to synchronise uniqueID's for all units and only send the unitID over the command call. The server then finds the actual game object. I used the gameObject's name to store the uniqueID in this case but it could also be a different dictionary type datastructure connecting the ID's to the game objects on the server side.

Comment
Add comment · Share
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

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

3 People are following this question.

avatar image avatar image avatar image

Related Questions

how to sync a struct of numbers 0 Answers

RTS enemy tracking using triggers 1 Answer

Networking sync enabled state? 1 Answer

photon variable script does not work :( 2 Answers

UNET Networking, syncronizing lists question 1 Answer


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