XRoom_Unity/Assets/Photon/FusionAddons/Physics/NetworkRigidbody/NetworkRigidbody2D.cs
2025-05-31 10:20:20 +03:30

136 lines
4.6 KiB
C#

using UnityEngine;
namespace Fusion.Addons.Physics {
/// <summary>
/// Fusion synchronization component for Unity Rigidbody2D.
/// </summary>
[DisallowMultipleComponent]
[RequireComponent(typeof(Rigidbody2D))]
[NetworkBehaviourWeaved(NetworkRBData.WORDS)]
public class NetworkRigidbody2D : NetworkRigidbody<Rigidbody2D, RunnerSimulatePhysics2D> {
/// <inheritdoc/>
public override Vector3 RBPosition {
get => _rigidbody.position;
set => _rigidbody.position = value;
}
/// <inheritdoc/>
public override Quaternion RBRotation {
get => Quaternion.Euler(0, 0, _rigidbody.rotation);
set => _rigidbody.rotation = value.eulerAngles.z;
}
/// <inheritdoc/>
public override bool RBIsKinematic {
get => _rigidbody.isKinematic;
set => _rigidbody.isKinematic = value;
}
/// <inheritdoc/>
protected override void Awake() {
base.Awake();
AutoSimulateIsEnabled = Physics2D.simulationMode != SimulationMode2D.Script;
}
/// <inheritdoc/>
protected override bool GetRBIsKinematic(Rigidbody2D rb) {
return rb.isKinematic;
}
/// <inheritdoc/>
protected override void SetRBIsKinematic(Rigidbody2D rb, bool kinematic) {
if (rb.isKinematic != kinematic) {
rb.isKinematic = kinematic;
}
}
/// <inheritdoc/>
protected override void CaptureRBPositionRotation(Rigidbody2D rb, ref NetworkRBData data) {
data.TRSPData.Position = rb.position;
if (UsePreciseRotation) {
data.FullPrecisionRotation = Quaternion.Euler(0, 0, rb.rotation);
} else {
data.TRSPData.Rotation = Quaternion.Euler(0, 0, rb.rotation);
}
}
/// <inheritdoc/>
protected override void ApplyRBPositionRotation(Rigidbody2D rb, Vector3 pos, Quaternion rot) {
rb.position = pos;
rb.rotation = rot.eulerAngles.z;
}
/// <inheritdoc/>
protected override NetworkRigidbodyFlags GetRBFlags(Rigidbody2D rb) {
var flags = default(NetworkRigidbodyFlags);
if (rb.isKinematic) { flags |= NetworkRigidbodyFlags.IsKinematic; }
if (rb.IsSleeping()) { flags |= NetworkRigidbodyFlags.IsSleeping; }
return flags;
}
/// <inheritdoc/>
protected override int GetRBConstraints(Rigidbody2D rb) {
return (int)rb.constraints;
}
/// <inheritdoc/>
protected override void SetRBConstraints(Rigidbody2D rb, int constraints) {
rb.constraints = (RigidbodyConstraints2D)constraints;
}
/// <inheritdoc/>
protected override void CaptureExtras(Rigidbody2D rb, ref NetworkRBData data) {
data.Mass = rb.mass;
data.Drag = rb.linearDamping;
data.AngularDrag = rb.angularDamping;
data.LinearVelocity = rb.linearVelocity;
data.AngularVelocity2D = rb.angularVelocity;
data.GravityScale2D = rb.gravityScale;
}
/// <inheritdoc/>
protected override void ApplyExtras(Rigidbody2D rb, ref NetworkRBData data) {
rb.mass = data.Mass;
rb.linearDamping = data.Drag;
rb.angularDamping = data.AngularDrag;
rb.linearVelocity = data.LinearVelocity;
rb.angularVelocity = data.AngularVelocity.Z;
rb.gravityScale = data.GravityScale2D;
}
/// <inheritdoc/>
public override void ResetRigidbody() {
base.ResetRigidbody();
var rb = _rigidbody;
rb.linearVelocity = default;
rb.angularVelocity = default;
}
/// <inheritdoc/>
protected override bool IsRBSleeping(Rigidbody2D rb) => rb.IsSleeping();
/// <inheritdoc/>
protected override void ForceRBSleep(Rigidbody2D rb) => rb.Sleep();
/// <inheritdoc/>
protected override void ForceRBWake( Rigidbody2D rb) => rb.WakeUp();
/// <inheritdoc/>
protected override bool IsRigidbodyBelowSleepingThresholds(Rigidbody2D rb) {
// Linear threshold
if (rb.linearVelocity.sqrMagnitude > Physics2D.linearSleepTolerance * Physics2D.linearSleepTolerance) {
return false;
}
// Angular threshold
var angularVel = rb.angularVelocity;
return angularVel * angularVel <= Physics2D.angularSleepTolerance * Physics2D.angularSleepTolerance;
}
/// <inheritdoc/>
protected override bool IsStateBelowSleepingThresholds(NetworkRBData data) {
// Linear threshold
if (((Vector2)data.LinearVelocity).sqrMagnitude > Physics2D.linearSleepTolerance * Physics2D.linearSleepTolerance) {
return false;
}
// Angular threshold
var angularVel = data.AngularVelocity2D;
return angularVel * angularVel <= Physics2D.angularSleepTolerance * Physics2D.angularSleepTolerance;
}
}
}