holopy3/Assets/Plugins/RootMotion/FinalIK/_DEMOS/FBBIK/Scripts/ExplosionDemo.cs

77 lines
2.7 KiB
C#
Raw Normal View History

2020-12-10 14:25:12 +00:00
using UnityEngine;
using System.Collections;
using RootMotion.FinalIK;
namespace RootMotion.Demos {
/// <summary>
/// Demo of exploding a viking using FBBIK
/// </summary>
public class ExplosionDemo : MonoBehaviour {
public SimpleLocomotion character; // Reference to the SimpleLocomotion component
public float forceMlp = 1f; // Explosion force
public float upForce = 1f; // Explosion up forve
public float weightFalloffSpeed = 1f; // The speed of explosion falloff
public AnimationCurve weightFalloff; // Explosion weight falloff
public AnimationCurve explosionForceByDistance; // The force of the explosion relative to character distance to the bomb
public AnimationCurve scale; // Scaling the bomb GameObject with the explosion
private float weight = 0f;
private Vector3 defaultScale = Vector3.one;
private Rigidbody r;
private FullBodyBipedIK ik;
void Start() {
// Storing the default scale of the bomb
defaultScale = transform.localScale;
r = character.GetComponent<Rigidbody>();
ik = character.GetComponent<FullBodyBipedIK>();
}
// Update is called once per frame
void Update () {
weight = Mathf.Clamp(weight - Time.deltaTime * weightFalloffSpeed, 0f, 1f);
// Exploding the bomb
if (Input.GetKeyDown(KeyCode.E) && character.isGrounded) {
// Set FBBIK weight to 1
ik.solver.IKPositionWeight = 1f;
// Set limb effector positions to where they are at the momemt
ik.solver.leftHandEffector.position = ik.solver.leftHandEffector.bone.position;
ik.solver.rightHandEffector.position = ik.solver.rightHandEffector.bone.position;
ik.solver.leftFootEffector.position = ik.solver.leftFootEffector.bone.position;
ik.solver.rightFootEffector.position = ik.solver.rightFootEffector.bone.position;
weight = 1f;
// Add explosion force to the character rigidbody
Vector3 direction = r.position - transform.position;
direction.y = 0f;
float explosionForce = explosionForceByDistance.Evaluate(direction.magnitude);
r.velocity = (direction.normalized + (Vector3.up * upForce)) * explosionForce * forceMlp;
}
if (weight < 0.5f && character.isGrounded) {
weight = Mathf.Clamp(weight - Time.deltaTime * 3f, 0f, 1f);
}
// Set effector weights
SetEffectorWeights(weightFalloff.Evaluate(weight));
// Set bomb scale
transform.localScale = scale.Evaluate(weight) * defaultScale;
}
// Set FBBIK limb end-effector weights to value
private void SetEffectorWeights(float w) {
ik.solver.leftHandEffector.positionWeight = w;
ik.solver.rightHandEffector.positionWeight = w;
ik.solver.leftFootEffector.positionWeight = w;
ik.solver.rightFootEffector.positionWeight = w;
}
}
}