Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 13 Next capture
2021 2022 2023
1 capture
13 Jun 22 - 13 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 DarKTower · Jul 09, 2014 at 03:09 AM · 2dmovementphysicsnetworking

Authoritative Networking 2D Movement

Alright, so a little about the game I am working on: It is a completely 2D game, and everything is square. Your player is a square, the environments are squares, and the map is a rectangle (Sue me). You move using Left/Right Arrows, and jump using Space. There is physics, and it is completely handled by the Server (Authoritative).

So all Clients send RPC's of their movement to the server which simulates the movement (Setting the Velocity for Left/Right movement, and using AddForce for jumping). The new position of the player is then sent back to all Clients, which is then updated as their Transform Position. And this is where I am having problems: On the Server, movement looks perfectly fine because it is using Physics and it's smooth. But on the Client, movement is extremely choppy. I have tried Lerping the Client's position between the current position and the new one set by the Server, but this gives a "linear" effect which is not the type of movement I want.

Example: On the Server when you hit Left, you go left instantly and when you let go, your player stops instantly by setting the Velocity to 0. On the Client with Lerp, when you hit Left you slowly accelerate left and when you let go, you decelerate even slower to the position where you should be.

PlayerMovement.js

 function FixedUpdate() {
     if (networkView.isMine) {
         //JUMPING SCRIPT
             if (Input.GetAxis('Horizontal')) { //IF HORIZONTAL (LEFT/RIGHT) INPUT IS DETECTED
                 if (Input.GetAxis('Horizontal') > 0.0) { //IF MOVING RIGHT
                     facingRight = true;
                     if (Network.isServer) {
                         ServerSimulateHorizontalMovement(networkView.viewID, Input.GetAxis('Horizontal')*moveSpeed);
                     } else if (Network.isClient) {
                         networkView.RPC('ServerSimulateHorizontalMovement', RPCMode.Server, networkView.viewID, Input.GetAxis('Horizontal')*moveSpeed);
                     }
                 } else if (Input.GetAxis('Horizontal') < 0.0) { //IF MOVING LEFT
                     facingRight = false;
                     if (Network.isServer) {
                         ServerSimulateHorizontalMovement(networkView.viewID, Input.GetAxis('Horizontal')*moveSpeed);
                     } else if (Network.isClient) {
                         networkView.RPC('ServerSimulateHorizontalMovement', RPCMode.Server, networkView.viewID, Input.GetAxis('Horizontal')*moveSpeed);
                     }
                 }
             } else { //IF NO HORIZONTAL MOVEMENT (LEFT/RIGHT) IS DETECTED
                 rigidbody2D.velocity.x = 0.0; //STOP THE MOVEMENT INSTANTLY
             }
 }

 @RPC
 function ServerSimulateHorizontalMovement(clientViewID:NetworkViewID, input:float) {
     var clientToMove: Transform = NetworkView.Find(clientViewID).transform;
 
     clientToMove.rigidbody2D.velocity.x = input;
     networkView.RPC('SendClientHorizontalMovement', RPCMode.Others, clientViewID, clientToMove.transform.position.x);
 }
 
 var newXPosition: float;
 
 @RPC
 function SendClientHorizontalMovement(playerViewID:NetworkViewID, xPos:float) {
     var playerToMove = NetworkView.Find(playerViewID).transform;
 
     playerToMove.GetComponent(PlayerMovement).newXPosition = xPos;
 }
 
 function Update() {
     if (newXPosition) {
         transform.position.x = newXPosition;
     }
 }

Right now I am focusing on Left/Right movement, as Jumping will be it's own beast to take down. And I assume that once I figure out how Left/Right works, jumping will be pretty similar. I hope.

Any help would be appreciated. I have been working with Networking in Unity for about 2 months now, and I must say... This is a fucking headache.

Thanks, DarKTower

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

21 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Objects stuck dragging across floor 1 Answer

Calculate initial velocity for projectile to reach point at a given angle and calculate angle to reach point at a given velocity. 1 Answer

Which state syncronization technology is better 0 Answers

How to limit the forces applied to an object to just forward, left, and right? 0 Answers

Character movement problem, floats away 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