You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

134 lines
4.3 KiB
C#

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
namespace RootMotion.Dynamics {
/// <summary>
/// All the required information when a muscle collides with something.
/// </summary>
public struct MuscleCollision {
/// <summary>
/// The index of the colliding muscle in the PuppetMaster.muscles array.
/// </summary>
public int muscleIndex;
/// <summary>
/// The collision from OnCollisionEnter/Stay/Exit.
/// </summary>
public Collision collision;
public bool isStay;
public MuscleCollision(int muscleIndex, Collision collision, bool isStay = false) {
this.muscleIndex = muscleIndex;
this.collision = collision;
this.isStay = isStay;
}
}
/// <summary>
/// Hitting muscles via code, usually by raycasting.
/// </summary>
public struct MuscleHit {
/// <summary>
/// The index of the colliding muscle in the PuppetMaster.muscles array.
/// </summary>
public int muscleIndex;
/// <summary>
/// How much should the muscle be unpinned by the hit?
/// </summary>
public float unPin;
/// <summary>
/// The force to add to the muscle's Rigidbody.
/// </summary>
public Vector3 force;
/// <summary>
/// The world space hit point.
/// </summary>
public Vector3 position;
public MuscleHit(int muscleIndex, float unPin, Vector3 force, Vector3 position) {
this.muscleIndex = muscleIndex;
this.unPin = unPin;
this.force = force;
this.position = position;
}
}
/// <summary>
/// Filters and broadcasts collisions with the Muscles to the Puppet Behaviours.
/// </summary>
[AddComponentMenu("Scripts/RootMotion.Dynamics/PuppetMaster/Muscle Collision Broadcaster")]
public class MuscleCollisionBroadcaster : MonoBehaviour {
/// <summary>
/// The PuppetMaster that this muscle belongs to.
/// </summary>
[HideInInspector] public PuppetMaster puppetMaster;
/// <summary>
/// The index of this muscle in the PuppetMaster.muscles array.
/// </summary>
[HideInInspector] public int muscleIndex;
private const string onMuscleHit = "OnMuscleHit";
private const string onMuscleCollision = "OnMuscleCollision";
private const string onMuscleCollisionExit = "OnMuscleCollisionExit";
private MuscleCollisionBroadcaster otherBroadcaster;
public void Hit(float unPin, Vector3 force, Vector3 position) {
if (!enabled) return;
foreach (BehaviourBase behaviour in puppetMaster.behaviours) {
behaviour.OnMuscleHit(new MuscleHit(muscleIndex, unPin, force, position));
}
}
// Prevents processing internal collisions.
private bool IsSelf(Collider c)
{
//return c.transform.root == transform.root; // Might be faster, but make sure characters are not stacked to the same root!
return c.transform.IsChildOf(puppetMaster.transform); // Use this if you need all your puppets to be parented to a single container gameobject.
}
void OnCollisionEnter(Collision collision) {
if (!enabled) return;
if (puppetMaster == null) return;
if (IsSelf(collision.collider)) return;
if (puppetMaster.muscles[muscleIndex].state.isDisconnected) return;
foreach (BehaviourBase behaviour in puppetMaster.behaviours) {
behaviour.OnMuscleCollision(new MuscleCollision(muscleIndex, collision));
}
}
void OnCollisionStay(Collision collision) {
if (!enabled) return;
if (puppetMaster == null) return;
if (PuppetMasterSettings.instance != null && !PuppetMasterSettings.instance.collisionStayMessages) return;
if (IsSelf(collision.collider)) return;
if (puppetMaster.muscles[muscleIndex].state.isDisconnected) return;
foreach (BehaviourBase behaviour in puppetMaster.behaviours) {
behaviour.OnMuscleCollision(new MuscleCollision(muscleIndex, collision, true));
}
}
void OnCollisionExit(Collision collision) {
if (!enabled) return;
if (puppetMaster == null) return;
if (PuppetMasterSettings.instance != null && !PuppetMasterSettings.instance.collisionExitMessages) return;
if (IsSelf(collision.collider)) return;
if (puppetMaster.muscles[muscleIndex].state.isDisconnected) return;
foreach (BehaviourBase behaviour in puppetMaster.behaviours) {
behaviour.OnMuscleCollisionExit(new MuscleCollision(muscleIndex, collision));
}
}
}
}