Cool you’re checking out Photon. Sounds like a good project.
By itself, Photon does not leverage or interact with Unity’s scenes or physics. While we work on integrating Photon and Unity seamlessly, running physics on the server can quickly become one of the more costly parts of hosting multiplayer games. In our experience, requirements are differing per game (per genre and even per title), so there’s always a lot of customization going on.
There are several approaches to make the server authoritative.
You can actually run Unity instances on the server. Your Photon Server logic will be written in C#, so it’s easy to start one Unity process per Room and communicate with it as if it was another client. Locally, it doesn’t add lag. However, you need the CPU, Unity licenses and automated workflow to start, stop and cache Unity instances. One per room and scene and you need to keep scenes on the server in sync with those in clients.
I’m not sure if Unity’s physics will be deterministic across platforms. You might run into some updates due to minor differences between server and clients if the engine gives you different results over time.
Currently, our preferred model to make the server authoritative is to use a simplified “physics” engine while exporting level data. It’s a lot of effort, true, but gives best results while keeping runtime costs low.
Often, games just need collision detection: Hitting another unit doesn’t mean you want the bullet/sword to bounce off. You just need to know about the hit. I think that’s what Triggers are for in Unity: Not actual physical entities but meshes that have a callback when they overlap and your code reacts. If your “physics” can be reduced to triggering events, it will save performance.
Depending on the game, it might make sense to not use Unity’s physics. A simplified 2d collision detection engine might be fine. Any C# based engine can be used in Unity and Photon. With that, you could run the same code on both sides.
Many games use a simplified mesh for navigation. Even on the client side. You don’t need to load every single grass leaf of a scene when you just want to know where a player can go. If you have a simplified level, it makes sense to use only that on the server. Some customers are writing exporters from the Editor, so they can use it to setup levels and use the results in the server.
I’m sorry I can only give you high level feedback.
Also keep in mind that you can cut any number of corners when your project is just hobbyist or for prototyping. Unless you get a lot of players, cost and performance per player are irrelevant and you definitely should go ahead and just work on the game 