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.
102 lines
3.3 KiB
C#
102 lines
3.3 KiB
C#
using UnityEngine;
|
|
|
|
#if UNITY_EDITOR
|
|
using UnityEditor;
|
|
#endif
|
|
|
|
namespace MalbersAnimations
|
|
{
|
|
public class IsKinematicB : StateMachineBehaviour
|
|
{
|
|
public enum OnEnterOnExit { OnEnter, OnExit, OnEnterOnExit}
|
|
public OnEnterOnExit SetKinematic = OnEnterOnExit.OnEnterOnExit;
|
|
|
|
[Tooltip("Changes the Kinematic property of the RigidBody On Enter/OnExit")]
|
|
[Hide("onenterexit",true,true)]
|
|
public bool isKinematic = true;
|
|
CollisionDetectionMode current;
|
|
|
|
Rigidbody rb;
|
|
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
|
|
{
|
|
if (rb == null) rb = animator.GetComponent<Rigidbody>();
|
|
|
|
if (SetKinematic == OnEnterOnExit.OnEnter)
|
|
{
|
|
if (isKinematic == true)
|
|
{
|
|
current = rb.collisionDetectionMode;
|
|
rb.collisionDetectionMode = CollisionDetectionMode.ContinuousSpeculative;
|
|
}
|
|
|
|
rb.isKinematic = isKinematic;
|
|
}
|
|
else if (SetKinematic == OnEnterOnExit.OnEnterOnExit)
|
|
{
|
|
current = rb.collisionDetectionMode;
|
|
rb.collisionDetectionMode = CollisionDetectionMode.ContinuousSpeculative;
|
|
rb.isKinematic = true;
|
|
}
|
|
}
|
|
|
|
override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
|
|
{
|
|
if (SetKinematic == OnEnterOnExit.OnExit)
|
|
{
|
|
if (isKinematic == true)
|
|
{
|
|
current = rb.collisionDetectionMode;
|
|
rb.collisionDetectionMode = CollisionDetectionMode.ContinuousSpeculative;
|
|
}
|
|
else
|
|
{
|
|
rb.collisionDetectionMode = current;
|
|
}
|
|
|
|
rb.isKinematic = isKinematic;
|
|
}
|
|
else if (SetKinematic == OnEnterOnExit.OnEnterOnExit)
|
|
{
|
|
rb.isKinematic = false;
|
|
rb.collisionDetectionMode = current;
|
|
}
|
|
}
|
|
|
|
[HideInInspector] public bool onenterexit;
|
|
private void OnValidate()
|
|
{
|
|
onenterexit = SetKinematic == OnEnterOnExit.OnEnterOnExit;
|
|
}
|
|
}
|
|
|
|
#if UNITY_EDITOR
|
|
[CustomEditor(typeof(IsKinematicB))]
|
|
public class IsKinematicBED : Editor
|
|
{
|
|
SerializedProperty SetKinematic, isKinematic;
|
|
void OnEnable()
|
|
{
|
|
|
|
SetKinematic = serializedObject.FindProperty("SetKinematic");
|
|
isKinematic = serializedObject.FindProperty("isKinematic");
|
|
}
|
|
|
|
public override void OnInspectorGUI()
|
|
{
|
|
serializedObject.Update();
|
|
EditorGUILayout.BeginHorizontal();
|
|
EditorGUIUtility.labelWidth = 50;
|
|
EditorGUILayout.PropertyField(SetKinematic, new GUIContent("Set: "));
|
|
|
|
if (SetKinematic.intValue != 2)
|
|
{
|
|
EditorGUIUtility.labelWidth = 70;
|
|
EditorGUILayout.PropertyField(isKinematic, new GUIContent("Kinematic:"), GUILayout.Width(100));
|
|
}
|
|
EditorGUIUtility.labelWidth = 0;
|
|
EditorGUILayout.EndHorizontal();
|
|
serializedObject.ApplyModifiedProperties();
|
|
}
|
|
}
|
|
#endif
|
|
} |