using UnityEngine;
namespace Fusion.Addons.Physics {
///
/// Fusion component for handling Physics2D.Simulate().
///
[DisallowMultipleComponent]
public class RunnerSimulatePhysics2D : RunnerSimulatePhysicsBase {
///
protected override void OverrideAutoSimulate(bool set) {
_physicsAutoSimRestore = (PhysicsTimings)Physics2D.simulationMode;
if (set) {
Physics2D.simulationMode = (SimulationMode2D)_physicsTiming;
} else {
Physics2D.simulationMode = SimulationMode2D.Script;
}
}
///
protected override void RestoreAutoSimulate() {
Physics2D.simulationMode = (SimulationMode2D)_physicsAutoSimRestore;
}
///
protected override bool AutoSyncTransforms {
get => Physics2D.autoSyncTransforms;
set => Physics2D.autoSyncTransforms = value;
}
///
protected override PhysicsTimings UnityPhysicsMode => (PhysicsTimings)Physics2D.simulationMode;
///
protected override void SimulatePrimaryScene(float deltaTime) {
if (Runner.SceneManager.TryGetPhysicsScene2D(out var physicsScene)) {
if (physicsScene.IsValid()) {
physicsScene.Simulate(deltaTime);
} else {
Physics2D.Simulate(deltaTime);
}
}
}
///
protected override void SimulateAdditionalScenes(float deltaTime, bool isForward) {
if (_additionalScenes == null || _additionalScenes.Count == 0) {
return;
}
var defaultPhysicsScene = Physics2D.defaultPhysicsScene;
foreach (var scene in _additionalScenes) {
if (!scene.ForwardOnly || isForward) {
if (scene.PhysicsScene != defaultPhysicsScene || Physics2D.simulationMode == SimulationMode2D.Script) {
scene.PhysicsScene.Simulate(deltaTime);
}
}
}
}
}
}