91 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using UnityEngine;
 | |
| using Fusion.Analyzer;
 | |
| 
 | |
| namespace Fusion.Addons.Physics {
 | |
|   /// <summary>
 | |
|   /// Fusion component for handling Physics.Simulate(). When added to a <see cref="NetworkRunner"/> GameObject, this will automatically disable
 | |
|   /// </summary>
 | |
|   [DisallowMultipleComponent]
 | |
|   public class RunnerSimulatePhysics3D : RunnerSimulatePhysicsBase<PhysicsScene> {
 | |
| 
 | |
|     // Unity 2022.3 made changes to PhysX (Physics3D) which made it similar to Box2d (Physics2D)
 | |
|     // This changed from a basic Physics.AutoSimulate to Simulation options for FixedUpdate, Update or Script(the equivalent of auto-simulate disabled).
 | |
| #if !UNITY_2022_3_OR_NEWER
 | |
| 
 | |
|     /// <inheritdoc/>
 | |
|     protected override PhysicsTimings UnityPhysicsMode => UnityEngine.Physics.autoSimulation ? PhysicsTimings.FixedUpdate : PhysicsTimings.Script;
 | |
| 
 | |
|     /// <inheritdoc/>
 | |
|     protected override void OverrideAutoSimulate(bool set) {
 | |
| 
 | |
|       if (set && _physicsTiming == PhysicsTimings.Update) {
 | |
|         Debug.LogWarning($"{GetType().Name}.{nameof(_physicsTiming)} set to {PhysicsTimings.Update}, which is not valid in Unity versions below 2022.3. Changing {_physicsAuthority} to {PhysicsAuthorities.Fusion}");
 | |
|         _physicsAuthority = PhysicsAuthorities.Fusion;
 | |
|         set               = false;
 | |
|       }
 | |
|       _physicsAutoSimRestore = UnityEngine.Physics.autoSimulation ? PhysicsTimings.FixedUpdate : PhysicsTimings.Script;
 | |
|       UnityEngine.Physics.autoSimulation = set;
 | |
|     }
 | |
| 
 | |
|     /// <inheritdoc/>
 | |
|     protected override void RestoreAutoSimulate() {
 | |
|       UnityEngine.Physics.autoSimulation = _physicsAutoSimRestore == PhysicsTimings.FixedUpdate ? true : false;
 | |
|     }
 | |
| #else
 | |
|     /// <inheritdoc/>
 | |
|     protected override PhysicsTimings UnityPhysicsMode => (PhysicsTimings)UnityEngine.Physics.simulationMode;
 | |
| 
 | |
|     /// <inheritdoc/>
 | |
|     protected override void OverrideAutoSimulate(bool set) {
 | |
|       _physicsAutoSimRestore = (PhysicsTimings)UnityEngine.Physics.simulationMode;
 | |
|       if (set) {
 | |
|         UnityEngine.Physics.simulationMode = (SimulationMode)_physicsTiming;
 | |
|       } else {
 | |
|         UnityEngine.Physics.simulationMode = SimulationMode.Script;
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     /// <inheritdoc/>
 | |
|     protected override void RestoreAutoSimulate() {
 | |
|       UnityEngine.Physics.simulationMode = (SimulationMode)_physicsAutoSimRestore;
 | |
|     }
 | |
| #endif
 | |
| 
 | |
|     /// <inheritdoc/>
 | |
|     protected override bool AutoSyncTransforms {
 | |
|       get => UnityEngine.Physics.autoSyncTransforms;
 | |
|       set => UnityEngine.Physics.autoSyncTransforms = value;
 | |
|     }
 | |
| 
 | |
|     /// <inheritdoc/>
 | |
|     protected override void SimulatePrimaryScene(float deltaTime) {
 | |
|       if (Runner.SceneManager.TryGetPhysicsScene3D(out var physicsScene)) {
 | |
|         if (physicsScene.IsValid()) {
 | |
|           physicsScene.Simulate(deltaTime);
 | |
|         } else {
 | |
|           UnityEngine.Physics.Simulate(deltaTime);
 | |
|         }
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     /// <inheritdoc/>
 | |
|     protected override void SimulateAdditionalScenes(float deltaTime, bool checkPhysicsSimulation) {
 | |
|       if (_additionalScenes == null || _additionalScenes.Count == 0) {
 | |
|         return;
 | |
|       }
 | |
|       var defaultPhysicsScene = UnityEngine.Physics.defaultPhysicsScene;
 | |
|       foreach (var scene in _additionalScenes) {
 | |
|         if (!checkPhysicsSimulation || CanSimulatePhysics(scene.ClientPhysicsSimulation)) {
 | |
| #if UNITY_2022_3_OR_NEWER
 | |
|           if (scene.PhysicsScene != defaultPhysicsScene || UnityEngine.Physics.simulationMode == SimulationMode.Script) {
 | |
| #else
 | |
|           if (scene.PhysicsScene != defaultPhysicsScene || UnityEngine.Physics.autoSimulation == false) {
 | |
| #endif
 | |
|             scene.PhysicsScene.Simulate(deltaTime);
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| }
 |