In this script, character control runs in FixedUpdate. Before movement begins, if this character wasn't spawned on the server through my own commands, it cannot be controlled.
This prevents the situation where you could control someone else's character, but on the actual screen the character would remain stationary, causing desynchronization.
If a character existed from the start, who owns it?
The answer is: the room owner. Since the room owner created the room, any characters initially placed in the room were also created by the room owner.
What happens if the room owner leaves?
Room ownership transfers to one of the remaining members, and the new room owner gains control.
In any case, by adding these two components and slightly modifying the script, you can immediately see synchronization working through the server.
If you're not satisfied with Photon Transform View and want to implement it yourself using only position and rotation values:
The implementation logic records each value (as shown in the comments) and applies them locally.
That said, I personally think the built-in Photon components are sufficient unless you have a specific reason to do otherwise.
Note: This post wasn't written in great detail because it's primarily for my own records. I plan to create a separate, more thorough tutorial in the future.