This is the case with most objects, but not with Animations. Animations played locally on the client will replicate. That’s why when you see other players walking ingame their movement seems so smooth and quick; it is being replicated to other clients.
Now to answer the OP, I think you are trying to replicate the animation only to the particular client, without it replicating? I’m not entirely sure how you might do this, since any animation track created on the client will replicate.
Here are my ideas:
have the server destroy the animation, and then the client recreate it? This might not work, but hey might as well try it.
load the animation into an AnimationController that is created locally? Haven’t tested this, so it may cause errors.
Try parenting an animation to the client’s PlayerGui? this is one way to replicate things from server > one particular client. Also haven’t tested this.
Alternatively, if you could somehow recreate the animation with Lerp or TweenService, that is a surefire way to not replicate.
Not sure where you guys are getting this information from. Animations don’t replicate, the transformations on the Motor6Ds in the character replicate because the character is network owned by the client.
Just have the tool owner play the animation and leave it at that. Make sure the animation instance is in the DataModel at compile time (don’t create it at run time), otherwise that animation won’t replicate. Exception goes for if the server creates the animation and doesn’t parent it to a server-only container.
If you’re looking for client-only animations and to void replication, I don’t think you can. The client will overwrite the changes another client attempts to apply and the client itself will automatically replicate the movements of the character.
So basically, if I make the animation instance during run time (using a local script), they will not replicate to the other clients? If so, that would solve my problem, and I can keep working on my current animation framework implementation (for my game).
No, they don’t. Animations are objects that hold ContentIds from an asset. Animation objects follow the same replication pattern that any other instance does.
Animation replication =/= Physics replication
Yes they are wrong. Animations and the physics applied to characters (by extension, the setting of Transform properties on Motor6Ds, which is controlled by the physics engine) are completely different.
I believe they’ll still replicate. You can set up a quick repro in Studio and use a Local Test Server of 2 players to test this out. Player1 should play an animation created by them through a LocalScript. If Player2 can see it, then the movements are replicating. If not, then they aren’t (which would then be the solution to your problem).
AnimationTracks** I get the two mixed up sometimes. AnimationTracks do cross the client/server boundary, as you can find the playing animations on the server
AnimationTracks don’t replicate either, because they are also instances. AnimationTrack is an object that controls the playback of animations. It can only be “created” from LoadAnimation of a Humanoid or an AnimationController, but that doesn’t mean it still doesn’t follow standard replication patterns.
The only thing that replicates is the movement applied from the AnimationTrack to any relevant Motor6Ds. The client network owns their character and thus the movements they apply replicate. This isn’t an exception for animations, since animations are movements of CFrames.
I am going to test this idea in roblox studio… I’ll be back
Here is some code I was testing:
wait(1)
local player = game.Players.LocalPlayer
local char = player.Character
local h = char.Humanoid
local animation = Instance.new("Animation")
animation.Parent = h
animation.AnimationId = "http://www.roblox.com/asset/?id=507771019"
local current = h:LoadAnimation(animation)
current.Priority = Enum.AnimationPriority.Action
current:Play(0.5,1,3)
print("running")
(The code above is pretty bad, it just provides a rough example of the general idea)
Testing it:
put the code in a local script
put the local script inside a screen GUI within the starter GUI
When I ran it on client mode, the animation played, but when I tested it on a test server w/ 2 players, none of their animations played…
I’m not too sure about the other Motor6D properties since there’s no statements saying that the properties aren’t replicated across the client/server boundary, but animations only manipulate the Transform CFrame. Setting Transform from a script doesn’t replicate, though animations can set it and it will replicate.
Here’s a thread regarding Transform that may be able to explain:
tl;dr
Transform was an internal property used by animations
Setting Transform from scripts doesn’t replicate
Animations can still internally overwrite Transform (which explains its behaviour)
A couple of us were discussing it on the New Member Discord, I think we’ve reached an interesting discussion about it so far?
Despite my lack of understanding of replication, if player 2 decides to animate player 1 from their own local environment, will it affect player 1 (in the perspective of player 1)?
Funny you asked! I was trying out a model similar to this and you happened to post a question just as I was typing up a response to your previous post. I’m not too sure what I’m doing either, but I seem to have cracked the case on this one. Check below.
Ouch, yeah I see what happened. I threw this code unedited into my game; the client was dancing fine, but on the server and the other client, they weren’t (I changed the AnimationId to the dance one). However, all is not lost; I seem to have figured something out.
Instead of having the script create the animation, I stored the Animation in the DataModel (specifically in ReplicatedStorage, so the object would be there at compile time instead of being created at run time). I then had one of the clients call the dancing animation on the other player; it seems to have gotten the results you were seeking.
Player2 (the client on the right side) was dancing from a LocalScript in PlayerScripts containing the repro code you supplied - that part you can ignore. On the Player2 client, I called the above code and Player1 started dancing on Player2’s screen. Player1’s screen did not show that they were dancing and neither did the server.
ADDITION: One issue. Once Player1 starts moving or playing it’s own animations, the animation that Player2 called will get overwritten. Forgot to test for this, just did so now. Moving Player1 cancelled the local animation on Player2.
Wouldn’t call this a reliable solution, or one at all. It certainly seems to have done what you were looking for, but it becomes moot once Player1 moves around or plays an animation itself.
Would it be possible to get a copy of your testing place for this? I can’t get the animations to run
my local script code:
local player = game.Players.LocalPlayer
local char = player.Character
local h = char.Humanoid
local animation = game.ReplicatedStorage.Animation
animation.AnimationId = "http://www.roblox.com/asset/?id=2097675014"
h:LoadAnimation(animation):Play()
It works when I test it in solo / client local mode
I just want to clarify for safety’s sake, which of these two scenarios are you trying to achieve?
Player1 plays animation on Player1. Player2 will not see Player1 animating.
Player1 plays animation on Player2. Player2 will not see themselves animating.
If it’s the first one, you can create the Animation object on the client and run it. I think I may have mentioned that already. As for the second one, well, that’s where the issue is occurring as per my previous post.
I was thinking of throwing together a hack where a pseudomodel would animate and then Transform of the target character would be set every frame to the pseudomodel’s movements, but that may be a little much.
I’m a bit late to this thread but there is a general solution to disabling replication of Animations that isn’t too difficult to achieve.
To animate a player character locally only you can replace the Animator object under the Humanoid with a new copy in a LocalScript. This will disable animation replication from that client.
For non player characters a local AnimationController should be used.