/// <summary> /// set options for fragment rigid bodies and layer /// </summary> public void SetFragmentPhysicsOptions(Exploder2DObject.FragmentOption options) { if (pool != null) { foreach (var fragment in pool) { if (fragment) { fragment.SetFragmentPhysicsOptions(options); } } } }
public void SetFragmentPhysicsOptions(Exploder2DObject.FragmentOption opt) { if (gameObject) { gameObject.layer = LayerMask.NameToLayer(opt.Layer); // if (spriteRenderer) // { // spriteRenderer.sortingLayerName = opt.SortingLayer; // spriteRenderer.sortingOrder = opt.OrderInLayer; // } DisableColliders(opt.DisableColliders); } }
/// <summary> /// apply physical explosion to fragment piece (2D case) /// </summary> public void ApplyExplosion2D(Transform meshTransform, Vector2 centroid, Vector2 mainCentroid, Exploder2DObject.FragmentOption fragmentOption, bool useForceVector, Vector2 ForceVector, float force, GameObject original, int targetFragments) { var rigid = rigid2D; // apply fragment mass and velocity properties var parentVelocity = Vector2.zero; var parentAngularVelocity = 0.0f; var mass = fragmentOption.Mass; var gravityScale = fragmentOption.GravityScale; // inherit velocity and mass from original object if (fragmentOption.InheritParentPhysicsProperty) { if (original && original.GetComponent <Rigidbody2D>()) { var parentRigid = original.GetComponent <Rigidbody2D>(); parentVelocity = parentRigid.velocity; parentAngularVelocity = parentRigid.angularVelocity; mass = parentRigid.mass / targetFragments; gravityScale = parentRigid.gravityScale; } } var centroidTransformed = meshTransform.TransformPoint(centroid); Vector2 forceVector = (new Vector2(centroidTransformed.x, centroidTransformed.y) - mainCentroid).normalized; float angularVelocity = fragmentOption.AngularVelocity * (fragmentOption.RandomAngularVelocityVector ? Random.insideUnitCircle.x : fragmentOption.AngularVelocityVector.y); if (useForceVector) { forceVector = ForceVector; } rigid.velocity = forceVector * force + parentVelocity; rigid.angularVelocity = angularVelocity + parentAngularVelocity; rigid.mass = mass; maxVelocity = fragmentOption.MaxVelocity; rigid.gravityScale = gravityScale; }