using UnityEngine;
using Fusion.Analyzer;
namespace Fusion.Addons.Physics {
using Physics = UnityEngine.Physics;
///
/// Fusion component for handling Physics.Simulate(). When added to a GameObject, this will automatically disable
///
[DisallowMultipleComponent]
public class RunnerSimulatePhysics3D : RunnerSimulatePhysicsBase {
// Unity 2022.3 made changes to PhysX (Physics3D) which made it similar to Box2d (Physics2D)
// This changed from a basic Physics.AutoSimulate to Simulations options for FixedUpdate, Update or Script(the equivalent of auto-simulate disabled).
#if !UNITY_2022_3_OR_NEWER
///
protected override PhysicsTimings UnityPhysicsMode => Physics.autoSimulation ? PhysicsTimings.FixedUpdate : PhysicsTimings.Script;
///
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 = Physics.autoSimulation ? PhysicsTimings.FixedUpdate : PhysicsTimings.Script;
Physics.autoSimulation = set;
}
///
protected override void RestoreAutoSimulate() {
Physics.autoSimulation = _physicsAutoSimRestore == PhysicsTimings.FixedUpdate ? true : false;
}
#else
///
protected override PhysicsTimings UnityPhysicsMode => (PhysicsTimings)Physics.simulationMode;
///
protected override void OverrideAutoSimulate(bool set) {
_physicsAutoSimRestore = (PhysicsTimings)Physics.simulationMode;
if (set) {
Physics.simulationMode = (SimulationMode)_physicsTiming;
} else {
Physics.simulationMode = SimulationMode.Script;
}
}
///
protected override void RestoreAutoSimulate() {
Physics.simulationMode = (SimulationMode)_physicsAutoSimRestore;
}
#endif
[StaticField(StaticFieldResetMode.None)]
static bool? _physicsAutoSyncRestore;
///
protected override bool AutoSyncTransforms {
get => Physics.autoSyncTransforms;
set => Physics.autoSyncTransforms = value;
}
///
protected override void SimulatePrimaryScene(float deltaTime) {
if (Runner.SceneManager.TryGetPhysicsScene3D(out var physicsScene)) {
if (physicsScene.IsValid()) {
physicsScene.Simulate(deltaTime);
} else {
Physics.Simulate(deltaTime);
}
}
}
///
protected override void SimulateAdditionalScenes(float deltaTime, bool isForward) {
if (_additionalScenes == null || _additionalScenes.Count == 0) {
return;
}
var defaultPhysicsScene = Physics.defaultPhysicsScene;
foreach (var scene in _additionalScenes) {
if (!scene.ForwardOnly || isForward) {
#if UNITY_2022_3_OR_NEWER
if (scene.PhysicsScene != defaultPhysicsScene || Physics.simulationMode == SimulationMode.Script) {
#else
if (scene.PhysicsScene != defaultPhysicsScene || Physics.autoSimulation == false) {
#endif
scene.PhysicsScene.Simulate(deltaTime);
}
}
}
}
}
}