using UnityEngine;
using System.Collections;
namespace RootMotion.Dynamics {
///
/// A point in the character's bone hierarchy for connecting props to.
///
[HelpURL("http://root-motion.com/puppetmasterdox/html/page6.html")]
[AddComponentMenu("Scripts/RootMotion.Dynamics/PuppetMaster/Prop Root")]
public class PropRoot : MonoBehaviour {
// Open the User Manual URL
[ContextMenu("User Manual")]
void OpenUserManual() {
Application.OpenURL("http://root-motion.com/puppetmasterdox/html/page6.html");
}
// Open the Script Reference URL
[ContextMenu("Scrpt Reference")]
void OpenScriptReference() {
Application.OpenURL("http://root-motion.com/puppetmasterdox/html/class_root_motion_1_1_dynamics_1_1_prop_root.html");
}
[Tooltip("Reference to the PuppetMaster component.")]
///
/// Reference to the PuppetMaster component.
///
public PuppetMaster puppetMaster;
[Tooltip("If a prop is connected, what will its joint be connected to?")]
///
/// If a prop is connected, what will its joint be connected to?
///
public Rigidbody connectTo;
[Tooltip("Is there a Prop connected to this PropRoot? Simply assign this value to connect, replace or drop props.")]
///
/// Is there a Prop connected to this PropRoot? Simply assign this value to connect, replace or drop props.
///
public Prop currentProp;
///
/// Dropping/Picking up normally works in the fixed update cycle where joints can be properly connected. Use this to drop a prop immediatelly.
///
public void DropImmediate() {
if (lastProp == null) return;
puppetMaster.RemoveMuscleRecursive(lastProp.muscle, true, false, MuscleRemoveMode.Sever);
lastProp.Drop();
currentProp = null;
lastProp = null;
}
private Prop lastProp;
private bool fixedUpdateCalled;
void Awake() {
Debug.LogWarning("PropRoot and Prop system is deprecated. Please see the 'Prop' demo to learn about the new easier and much more performance-efficient PropMuscle and PuppetMasterProp system.", transform);
// If currentProp has been assigned, it will be picked up AS IS, presuming it is already linked with the joints and held in the right position.
// To pick up the prop from ground, assign it after Awake, for example in Start.
if (currentProp != null) currentProp.StartPickedUp(this);
}
void Update() {
if (!fixedUpdateCalled) return;
// If dropped by another script or PuppetMaster behaviour
if (currentProp != null && lastProp == currentProp && currentProp.muscle.connectedBody == null) {
currentProp.Drop();
currentProp = null;
lastProp = null;
}
}
void FixedUpdate() {
fixedUpdateCalled = true;
if (currentProp == lastProp) return;
if (currentProp != null && !currentProp.initiated) return;
// Dropping current prop
if (currentProp == null) {
puppetMaster.RemoveMuscleRecursive(lastProp.muscle, true, false, MuscleRemoveMode.Sever);
lastProp.Drop();
}
// Picking up to an empty slot
if (lastProp == null) {
AttachProp(currentProp);
}
// Switching props
if (lastProp != null && currentProp != null) {
puppetMaster.RemoveMuscleRecursive(lastProp.muscle, true, false, MuscleRemoveMode.Sever);
AttachProp(currentProp);
}
lastProp = currentProp;
}
private void AttachProp(Prop prop) {
prop.transform.position = transform.position;
prop.transform.rotation = transform.rotation;
prop.PickUp(this);
/*
prop.muscleProps.internalCollisionIgnores.muscles = new ConfigurableJoint[prop.internalCollisionIgnores.Length];
for (int i = 0; i < prop.internalCollisionIgnores.Length; i++)
{
prop.muscleProps.internalCollisionIgnores.muscles[i] = puppetMaster.GetMuscle(puppetMaster.targetAnimator.GetBoneTransform(prop.internalCollisionIgnores[i])).joint;
}
*/
puppetMaster.AddMuscle(prop.muscle, prop.transform, connectTo, transform, prop.muscleProps, false, prop.forceLayers);
if (prop.additionalPin != null && prop.additionalPinTarget != null) {
puppetMaster.AddMuscle(prop.additionalPin, prop.additionalPinTarget, prop.muscle.GetComponent(), prop.transform, new Muscle.Props(prop.additionalPinWeight, 0f, 0f, 0f, Muscle.Group.Prop), true, prop.forceLayers);
}
}
}
}