2 using System.Collections.Generic;
18 private Physics2D.World world;
20 Dictionary<IBody, GameObject> gameObjectMap;
22 Dictionary<Physics2D.Body, Dictionary<Physics2D.Body,
TSCollision2D>> collisionInfo;
40 public FP LockedTimeStep {
47 ChecksumExtractor.Init(
this);
52 ContactManager.physicsManager =
this;
54 world.BodyRemoved += OnRemovedRigidBody;
55 world.ContactManager.BeginContact += CollisionEnter;
56 world.ContactManager.StayContact += CollisionStay;
57 world.ContactManager.EndContact += CollisionExit;
59 gameObjectMap =
new Dictionary<IBody, GameObject>();
60 collisionInfo =
new Dictionary<Physics2D.Body, Dictionary<Physics2D.Body,
TSCollision2D>>();
70 world.Step(LockedTimeStep);
73 public IWorld GetWorld() {
77 void AddRigidBodies() {
79 List<TSCollider2D> sortedBodies =
new List<TSCollider2D>(bodies);
82 for (
int i = 0; i < sortedBodies.Count; i++) {
83 AddBody(sortedBodies[i]);
87 public void AddBody(ICollider iCollider) {
89 Debug.LogError(
"You have a 3D object but your Physics 3D is disabled.");
93 TSCollider2D tsCollider = (TSCollider2D) iCollider;
95 if (tsCollider._body != null) {
101 gameObjectMap[tsCollider._body] = tsCollider.gameObject;
103 if (tsCollider.gameObject.transform.parent != null && tsCollider.gameObject.transform.parent.GetComponentInParent<TSCollider2D>() != null) {
104 TSCollider2D parentCollider = tsCollider.gameObject.transform.parent.GetComponentInParent<TSCollider2D>();
105 Physics2D.
Body childBody = tsCollider._body;
110 world.ProcessAddedBodies();
113 internal string GetChecksum(
bool plain) {
114 return ChecksumExtractor.GetEncodedChecksum();
117 public void RemoveBody(
IBody iBody) {
118 world.RemoveBody((
TrueSync.Physics2D.Body) iBody);
119 world.ProcessRemovedBodies();
122 public void OnRemoveBody(Action<IBody> OnRemoveBody) {
123 world.BodyRemoved += delegate (
TrueSync.Physics2D.Body body) {
128 private void OnRemovedRigidBody(
TrueSync.Physics2D.Body body) {
129 GameObject go = gameObjectMap[body];
132 GameObject.Destroy(go);
136 private bool CollisionEnter(
TrueSync.Physics2D.Contact contact) {
137 if (contact.FixtureA.IsSensor || contact.FixtureB.IsSensor) {
138 TriggerEnter(contact);
143 CollisionDetected(contact.FixtureA.Body, contact.FixtureB.Body, contact,
"OnSyncedCollisionEnter");
147 private void CollisionStay(
TrueSync.Physics2D.Contact contact) {
148 if (contact.FixtureA.IsSensor || contact.FixtureB.IsSensor) {
149 TriggerStay(contact);
153 CollisionDetected(contact.FixtureA.Body, contact.FixtureB.Body, contact,
"OnSyncedCollisionStay");
156 private void CollisionExit(
TrueSync.Physics2D.Contact contact) {
157 if (contact.FixtureA.IsSensor || contact.FixtureB.IsSensor) {
158 TriggerExit(contact);
162 CollisionDetected(contact.FixtureA.Body, contact.FixtureB.Body, null,
"OnSyncedCollisionExit");
165 private void TriggerEnter(
TrueSync.Physics2D.Contact contact) {
166 CollisionDetected(contact.FixtureA.Body, contact.FixtureB.Body, contact,
"OnSyncedTriggerEnter");
169 private void TriggerStay(
TrueSync.Physics2D.Contact contact) {
170 CollisionDetected(contact.FixtureA.Body, contact.FixtureB.Body, contact,
"OnSyncedTriggerStay");
173 private void TriggerExit(
TrueSync.Physics2D.Contact contact) {
174 CollisionDetected(contact.FixtureA.Body, contact.FixtureB.Body, null,
"OnSyncedTriggerExit");
177 private void CollisionDetected(Physics2D.Body body1, Physics2D.Body body2,
TrueSync.Physics2D.Contact contact,
string callbackName) {
178 if (!gameObjectMap.ContainsKey(body1) || !gameObjectMap.ContainsKey(body2)) {
182 GameObject b1 = gameObjectMap[body1];
183 GameObject b2 = gameObjectMap[body2];
185 if (b1 == null || b2 == null) {
189 b1.SendMessage(callbackName, GetCollisionInfo(body1, body2, contact), SendMessageOptions.DontRequireReceiver);
190 b2.SendMessage(callbackName, GetCollisionInfo(body2, body1, contact), SendMessageOptions.DontRequireReceiver);
195 private TSCollision2D GetCollisionInfo(Physics2D.Body body1, Physics2D.Body body2,
TrueSync.Physics2D.Contact c) {
196 if (!collisionInfo.ContainsKey(body1)) {
197 collisionInfo.Add(body1,
new Dictionary<Physics2D.Body, TSCollision2D>());
200 Dictionary<Physics2D.Body,
TSCollision2D> collisionInfoBody1 = collisionInfo[body1];
204 if (collisionInfoBody1.ContainsKey(body2)) {
205 result = collisionInfoBody1[body2];
208 collisionInfoBody1.Add(body2, result);
211 result.Update(gameObjectMap[body2], c);
216 public GameObject GetGameObject(
IBody body) {
217 if (!gameObjectMap.ContainsKey(body)) {
221 return gameObjectMap[body];
224 public int GetBodyLayer(
IBody body) {
225 GameObject go = GetGameObject(body);
233 public TSRaycastHit2D Raycast(TSVector2 origin, TSVector2 direction, FP distance) {
236 Func<
TrueSync.Physics2D.Fixture, TSVector2, TSVector2, FP, FP> callback = delegate (
TrueSync.Physics2D.Fixture fixture, TSVector2 point, TSVector2 normal, FP fraction) {
241 world.RayCast(callback, origin, origin + direction * distance);
246 public TSRaycastHit2D[] RaycastAll(TSVector2 origin, TSVector2 direction, FP distance) {
247 List<TSRaycastHit2D> result =
new List<TSRaycastHit2D>();
249 Func<
TrueSync.Physics2D.Fixture, TSVector2, TSVector2, FP, FP> callback = delegate (
TrueSync.Physics2D.Fixture fixture, TSVector2 point, TSVector2 normal, FP fraction) {
254 world.RayCast(callback, origin, origin + direction * distance);
256 if (result.Count == 0) {
260 return result.ToArray();
263 public bool IsCollisionEnabled(
IBody rigidBody1,
IBody rigidBody2) {
264 if (gameObjectMap.ContainsKey(rigidBody1) && gameObjectMap.ContainsKey(rigidBody2)) {
271 public IWorldClone GetWorldClone() {
272 return new WorldClone2D();
Manages the collision matrix of physics simulation.
Manages creation of player prefabs and lockstep execution.
Represents information about a contact between two 2D bodies.
static Physics2DWorldManager instance
Public access to a manager instance.
static void UpdateCoroutines()
Update all coroutines created.
void Initialize(Physics2D.World world)
Initializes Shape and RigidBody and sets initial values to position and orientation based on Unity's ...
Provides a few utilities to be used on TrueSync exposed classes.
TSVector Gravity
Property access to simulated gravity.
Information about a 2D cast hit.
static TSBody2DComparer body2DComparer
Instance of a TSBody2DComparer.
static bool CollisionEnabled(int layerA, int layerB)
Returns true if the given layers can collide.
Manages the 2D physics simulation.
bool SpeculativeContacts
Property access to speculative contacts.
TSVector2 ScaledCenter
Returns a version of collider's center scaled by parent's transform.
Abstract collider for 2D shapes.
IBody2D Body
Returns RigidBody associated to this TSRigidBody.
void UpdateStep()
Goes one step further on the physics simulation.
Represents a common interface to 2D and 3D bodies.