Keeping a rigidbody player on a moving rigidbody surface (top down)

(I have no idea how to word the title right)

I have a player gameobject that has a dynamic rigidbody2d, and I also have a ship sprite that has a kinematic rigidbody2d.
Assuming that the player is always on top of ship, as the ship moves the player should also move along with it, however since there’s no logic connecting the two (they are separate gameobjects, no parenting or anything) the player just slides away into the walls of the ship.

I tried to fix this by, in the player movement script, adding the velocity of the ship to the player, but this did not work since it doesn’t account for the rotation of the ship.

I also tried making the player a child of the ship, however this won’t work as the player is dynamic (the player doesn’t also move with the ship, unless I’m missing something obvious here).
I’m also not too sure if I should be using kinematic for my ship in this scenario.

Here’s how I move the player (basically using rb2d.velocity):

And here’s how I move the ship (using rb2d.velocity and rb2d.angularvelocity):

Here’s how my gameobjects look in the hierarchy:

Here’s the settings for my player and ship rigidbodies respectively:


Any ideas on ways that I can keep the player being able to stand and walk around without sliding everywhere when the boat is moving would be appreciated!

Just start with a few Youtube tutorials on riding moving platforms. There’s no fundamental difference between a moving ship and a moving platform.

Tutorials and example code are great, but keep this in mind to maximize your success and minimize your frustration:

How to do tutorials properly, two (2) simple steps to success:

Step 1. Follow the tutorial and do every single step of the tutorial 100% precisely the way it is shown. Even the slightest deviation (even a single character!) generally ends in disaster. That’s how software engineering works. Every step must be taken, every single letter must be spelled, capitalized, punctuated and spaced (or not spaced) properly, literally NOTHING can be omitted or skipped.
Fortunately this is the easiest part to get right: Be a robot. Don’t make any mistakes.
BE PERFECT IN EVERYTHING YOU DO HERE!!

If you get any errors, learn how to read the error code and fix your error. Google is your friend here. Do NOT continue until you fix your error. Your error will probably be somewhere near the parenthesis numbers (line and character position) in the file. It is almost CERTAINLY your typo causing the error, so look again and fix it.

Step 2. Go back and work through every part of the tutorial again, and this time explain it to your doggie. See how I am doing that in my avatar picture? If you have no dog, explain it to your house plant. If you are unable to explain any part of it, STOP. DO NOT PROCEED. Now go learn how that part works. Read the documentation on the functions involved. Go back to the tutorial and try to figure out WHY they did that. This is the part that takes a LOT of time when you are new. It might take days or weeks to work through a single 5-minute tutorial. Stick with it. You will learn.

Step 2 is the part everybody seems to miss. Without Step 2 you are simply a code-typing monkey and outside of the specific tutorial you did, you will be completely lost. If you want to learn, you MUST do Step 2.

Of course, all this presupposes no errors in the tutorial. For certain tutorial makers (like Unity, Brackeys, Imphenzia, Sebastian Lague) this is usually the case. For some other less-well-known content creators, this is less true. Read the comments on the video: did anyone have issues like you did? If there’s an error, you will NEVER be the first guy to find it.

Beyond that, Step 3, 4, 5 and 6 become easy because you already understand!

Finally, when you have errors, don’t post here… just go fix your errors! Here’s how:

Remember: NOBODY here memorizes error codes. That’s not a thing. The error code is absolutely the least useful part of the error. It serves no purpose at all. Forget the error code. Put it out of your mind.

The complete error message contains everything you need to know to fix the error yourself.

The important parts of the error message are:

  • the description of the error itself (google this; you are NEVER the first one!)
  • the file it occurred in (critical!)
  • the line number and character position (the two numbers in parentheses)
  • also possibly useful is the stack trace (all the lines of text in the lower console window)

Always start with the FIRST error in the console window, as sometimes that error causes or compounds some or all of the subsequent errors. Often the error will be immediately prior to the indicated line, so make sure to check there as well.

Look in the documentation. Every API you attempt to use is probably documented somewhere. Are you using it correctly? Are you spelling it correctly? Are you structuring the syntax correctly? Look for examples!

All of that information is in the actual error message and you must pay attention to it. Learn how to identify it instantly so you don’t have to stop your progress and fiddle around with the forum.

In the future, if you DO have a problem:

How to report your problem productively in the Unity3D forums:

http://plbm.com/?p=220

This is the bare minimum of information to report:

  • what you want
  • what you tried
  • what you expected to happen
  • what actually happened, log output, variable values, and especially any errors you see
    - links to documentation you used to cross-check your work (CRITICAL!!!)

The purpose of YOU providing links is to make our job easier, while simultaneously showing us that you actually put effort into the process. If you haven’t put effort into finding the documentation, why should we bother putting effort into replying?

If you post a code snippet, ALWAYS USE CODE TAGS:

How to use code tags: Using code tags properly

  • Do not TALK about code without posting it.
  • Do NOT post unformatted code.
  • Do NOT retype code. Use copy/paste properly using code tags.
    - Do NOT post screenshots of code.
    - Do NOT post photographs of code.
  • ONLY post the relevant code, and then refer to it in your discussion.

Not only is this long text completely uninformative and assumes I have no idea what I’m doing, it looks like it’s copy and pasted to answer a different question. Every tutorial recommends setting the platform as a parent of the player, which, in the question, I stated does not work.

No, no, they do not. Parenting doesn’t affect Rigidbodies the way you would expect. The ones that do this often only use Rigidbody as kinematic in order to receive collsions, but otherwise drive position themselves (eg, roll their own physics).

Some tutorials actually have some kind of “anchorable” controller that “riders” can attach to, and an API that lets you base your otherwise global object movement to instead be computed in local space.

Others have joints and drive the motors of the joints while you’re riding the platform / boat / whatever.

So now that you have three other possible other ways to do it, let us know how it goes.

ALSO, for future reference:

If you post a code snippet, ALWAYS USE CODE TAGS:

How to use code tags: https://discussions.unity.com/t/481379

  • Do not TALK about code without posting it.
  • Do NOT post unformatted code.
  • Do NOT retype code. Use copy/paste properly using code tags.
  • Do NOT post screenshots of code.
    - Do NOT post photographs of code.
  • ONLY post the relevant code, and then refer to it in your discussion.

And just in general, I find this a useful template for reporting technical issues to complete strangers on a forum:

How to report your problem productively in the Unity3D forums:

http://plbm.com/?p=220

This is the bare minimum of information to report:

  • what you want
  • what you tried
  • what you expected to happen
  • what actually happened, log output, variable values, and especially any errors you see
  • links to documentation you used to cross-check your work (CRITICAL!!!)

The purpose of YOU providing links is to make our job easier, while simultaneously showing us that you actually put effort into the process. If you haven’t put effort into finding the documentation, why should we bother putting effort into replying?

YMMV.

You’ll have to simulate friction imparting movement onto the player yourself in this case.

If any change in velocity happens to the “ship”, you’ll need to apply the same change in velocity to the “player”. This is on top of, not replacing, the player movement.