// Calculating the impulse magnitude from a collision private float GetImpulse(MuscleCollision m) { float i = m.collision.impulse.sqrMagnitude; // Collision threshold if (collisionThreshold > 0f) { float mlp = PuppetMasterSettings.instance != null? (1f + PuppetMasterSettings.instance.currentlyActivePuppets * PuppetMasterSettings.instance.activePuppetCollisionThresholdMlp): 1f; if (i < collisionThreshold * mlp) { return(0f); } } i *= 0.04f; // Coeficient for evening out for pre-0.3 versions // Collision resistance multipliers foreach (CollisionResistanceMultiplier crm in collisionResistanceMultipliers) { if (LayerMaskExtensions.Contains(crm.layers, m.collision.collider.gameObject.layer)) { if (crm.multiplier <= 0f) { i = Mathf.Infinity; } else { i /= crm.multiplier; } break; } } return(i); }
void OnTriggerEnter(Collider collider) { if (prop.isPickedUp) { return; } if (!LayerMaskExtensions.Contains(characterLayers, collider.gameObject.layer)) { return; } characterPuppet = collider.GetComponent <CharacterPuppet>(); if (characterPuppet == null) { return; } if (characterPuppet.puppet.state != BehaviourPuppet.State.Puppet) { return; } if (characterPuppet.propRoot == null) { return; } if (characterPuppet.propRoot.currentProp != null) { return; } characterPuppet.propRoot.currentProp = prop; }
// Calculating the impulse magnitude from a collision private float GetImpulse(MuscleCollision m, ref float layerThreshold) { float i = m.collision.impulse.sqrMagnitude; i /= puppetMaster.muscles [m.muscleIndex].rigidbody.mass; i *= 0.3f; // Coeficient for evening out for pre-0.3 versions // Collision resistance multipliers foreach (CollisionResistanceMultiplier crm in collisionResistanceMultipliers) { if (LayerMaskExtensions.Contains(crm.layers, m.collision.collider.gameObject.layer)) { if (crm.multiplier <= 0f) { i = Mathf.Infinity; } else { i /= crm.multiplier; } layerThreshold = crm.collisionThreshold; break; } } return(i); }
// Calculating the impulse magnitude from a collision private float GetImpulse(MuscleCollision m) { float i = m.collision.impulse.sqrMagnitude; // Collision threshold if (collisionThreshold > 0f) { float mlp = PuppetMasterSettings.instance != null? (1f + PuppetMasterSettings.instance.currentlyActivePuppets * PuppetMasterSettings.instance.activePuppetCollisionThresholdMlp): 1f; if (i < collisionThreshold * mlp) return 0f; } i *= 0.04f; // Coeficient for evening out for pre-0.3 versions // Collision resistance multipliers foreach (CollisionResistanceMultiplier crm in collisionResistanceMultipliers) { if (LayerMaskExtensions.Contains(crm.layers, m.collision.collider.gameObject.layer)) { if (crm.multiplier <= 0f) i = Mathf.Infinity; else i /= crm.multiplier; break; } } /* // MuscleProps collision resistance multipliers BehaviourPuppet.MuscleProps props = GetProps(puppetMaster.muscles[m.muscleIndex].props.group); foreach (CollisionResistanceMultiplier crm in props.collisionResistanceMultipliers) { if (LayerMaskExtensions.Contains(crm.layers, m.collision.collider.gameObject.layer)) { Debug.Log("Here"); if (crm.multiplier <= 0f) i = Mathf.Infinity; else i /= crm.multiplier; break; } } */ return i; }
private void OnPreMuscleCollisionExit(MuscleCollision c) { if (!LayerMaskExtensions.Contains(groundLayers, c.collision.gameObject.layer)) { return; } groundContacts[c.muscleIndex] = false; groundContactPoints[c.muscleIndex] = Vector3.zero; }
private void ProcessCollisionEvent(Collision collision, CollisionEventBroadcaster broadcaster) { if (collision.collider.transform.root == transform) { return; } if (!LayerMaskExtensions.Contains(collisionLayers, collision.collider.gameObject.layer)) { return; } foreach (Group group in groups) { group.TryDamage(collision, broadcaster); } }
private void OnPreMuscleCollision(MuscleCollision c) { if (!LayerMaskExtensions.Contains(groundLayers, c.collision.gameObject.layer)) { return; } if (c.collision.contacts.Length == 0) { return; } lastGroundedTime = Time.time; groundContacts[c.muscleIndex] = true; if (mode == Mode.CenterOfPressure) { groundContactPoints[c.muscleIndex] = GetCollisionCOP(c.collision); } }
// When a muscle collides with something (called by the MuscleCollisionBroadcaster component on the muscle). protected override void OnMuscleCollisionBehaviour(MuscleCollision m) { // All the conditions for ignoring this if (!enabled) return; if (state == State.Unpinned) return; if (collisions > maxCollisions) return; if (!LayerMaskExtensions.Contains(collisionLayers, m.collision.gameObject.layer)) return; if (masterProps.normalMode == NormalMode.Kinematic && !puppetMaster.isActive && !masterProps.activateOnStaticCollisions && m.collision.gameObject.isStatic) return; // Get the collision impulse on the muscle float impulse = GetImpulse(m); if (impulse <= 0f) return; collisions ++; // Try to find out if it collided with another puppet's muscle if (m.collision.collider.attachedRigidbody != null) { broadcaster = m.collision.collider.attachedRigidbody.GetComponent<MuscleCollisionBroadcaster>(); if (broadcaster != null) { if (broadcaster.muscleIndex < broadcaster.puppetMaster.muscles.Length) { // Multiply impulse (if the other muscle has been boosted) impulse *= broadcaster.puppetMaster.muscles[broadcaster.muscleIndex].state.impulseMlp; float stayF = m.isStay? 0.05f: 0.1f; broadcaster.puppetMaster.muscles[broadcaster.muscleIndex].offset -= m.collision.impulse * Time.deltaTime * stayF; /* float velocityF = puppetMaster.muscles[m.muscleIndex].rigidbody.velocity.sqrMagnitude / broadcaster.puppetMaster.muscles[broadcaster.muscleIndex].rigidbody.velocity.sqrMagnitude; velocityF = Mathf.Clamp(velocityF, 0.5f, 2f); //velocityF = 1f + (velocityF - 1f) * 0.5f; impulse /= velocityF; */ } } } // Should we activate the puppet? if (Activate(m.collision, impulse)) puppetMaster.mode = PuppetMaster.Mode.Active; // Let other scripts know about the collision if (OnCollisionImpulse != null) OnCollisionImpulse(m, impulse); // Unpin the muscle (and other muscles) UnPin(m.muscleIndex, impulse); }
private void ProcessCollision(Collision c) { if (!LayerMaskExtensions.Contains(layers, c.gameObject.layer)) { return; } Vector3 collisionCenter = Vector3.zero; for (int i = 0; i < c.contacts.Length; i++) { collisionCenter += c.contacts[i].point; } collisionCenter /= c.contacts.Length; P += collisionCenter; // * pressure // TODO process each collision based on its pressure count++; inContact = true; }
void OnTriggerEnter(Collider collider) { if (prop.isPickedUp) { return; } if (!LayerMaskExtensions.Contains(characterLayers, collider.gameObject.layer)) { return; } PAB = collider.GetComponent <Player_Attack_Behavior>(); if (PAB == null) { return; } //if (PAB.puppet.state != BehaviourPuppet.State.Puppet) return; // don't know what is this for if (PAB.PropRootLeft == null || PAB.PropRootRight == null) { return; // if PropRoot did not assign prop script } if (PAB.PropRootLeft.currentProp != null && PAB.PropRootRight.currentProp != null) { return; // if both hand had been occupied } if (PAB.PropRootRight.currentProp == null) // if right hand is free { PAB.PropRootRight.currentProp = prop; } else if (PAB.PropRootLeft.currentProp == null) // if left hand is free { PAB.PropRootLeft.currentProp = prop; } }
public void RetrieveObjectsInAreaNonAloc(Rect area, LayerMask mask, ref T[] returnedObjects, ref int count) { if (m_depth == 0) { count = 0; } if (rectOverlap(m_bounds, area)) { for (int i = 0; i < m_storedObjects.Count && returnedObjects.Length > count; i++) { if (ContainsRect(m_storedObjects[i].bounds) && LayerMaskExtensions.Contains(mask, m_storedObjects[i].Layer)) { returnedObjects[count++] = m_storedObjects[i]; } } if (cells[0] != null) { for (int i = 0; i < cells.Length && returnedObjects.Length > count; i++) { cells[i].RetrieveObjectsInAreaNonAloc(area, mask, ref returnedObjects, ref count); } } } }
// When a muscle collides with something (called by the MuscleCollisionBroadcaster component on the muscle). protected override void OnMuscleCollisionBehaviour(MuscleCollision m) { if (OnCollision != null) { OnCollision(m); } // All the conditions for ignoring this if (!enabled) { return; } if (state == State.Unpinned) { return; } if (collisions > maxCollisions) { return; } if (!LayerMaskExtensions.Contains(collisionLayers, m.collision.gameObject.layer)) { return; } if (LayerMaskExtensions.Contains(groundLayers, m.collision.gameObject.layer)) { if (state == State.GetUp) { return; // Do not damage if contact with ground layers and in getup state } if (puppetMaster.muscles[m.muscleIndex].props.group == Muscle.Group.Foot) { return; // Do not damage if feet in contact with ground layers } } if (masterProps.normalMode == NormalMode.Kinematic && !puppetMaster.isActive && !masterProps.activateOnStaticCollisions && m.collision.gameObject.isStatic) { return; } // Activate on Kinematic-Kinematic pair if (puppetMaster.muscles[m.muscleIndex].rigidbody.isKinematic && m.collision.collider.attachedRigidbody != null && m.collision.collider.attachedRigidbody.isKinematic) { if (masterProps.normalMode == NormalMode.Kinematic && puppetMaster.mode == PuppetMaster.Mode.Kinematic) { puppetMaster.mode = PuppetMaster.Mode.Active; } } else { // Get the collision impulse on the muscle float cT = collisionThreshold; float impulse = GetImpulse(m, ref cT); float minImpulseMlp = PuppetMasterSettings.instance != null ? (1f + PuppetMasterSettings.instance.currentlyActivePuppets * PuppetMasterSettings.instance.activePuppetCollisionThresholdMlp) : 1f; float minImpulse = cT * minImpulseMlp; if (impulse <= minImpulse) { return; } collisions++; // Try to find out if it collided with another puppet's muscle if (m.collision.collider.attachedRigidbody != null) { broadcaster = m.collision.collider.attachedRigidbody.GetComponent <MuscleCollisionBroadcaster>(); if (broadcaster != null) { if (broadcaster.muscleIndex < broadcaster.puppetMaster.muscles.Length) { // Multiply impulse (if the other muscle has been boosted) impulse *= broadcaster.puppetMaster.muscles[broadcaster.muscleIndex].state.impulseMlp; //float stayF = m.isStay? 0.05f: 0.1f; //broadcaster.puppetMaster.muscles[broadcaster.muscleIndex].offset -= m.collision.impulse * Time.deltaTime * stayF; } } } // DO not move this up, the impulse value will be wrong. // Let other scripts know about the collision (even the ones below collision threshold) if (OnCollisionImpulse != null) { OnCollisionImpulse(m, impulse); } // Should we activate the puppet? if (Activate(m.collision, impulse)) { puppetMaster.mode = PuppetMaster.Mode.Active; } // Unpin the muscle (and other muscles) UnPin(m.muscleIndex, impulse); } }