Files
Robii Aragon fd87a6ffd5 add ckg
plantilla base para movimiento básico
2026-02-05 05:07:55 -08:00

986 lines
26 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public class grabPhysicalObjectSystem : MonoBehaviour
{
[Header ("Main Settings")]
[Space]
public bool grabObjectPhysically = true;
public string objectName;
public LayerMask layerForUsers;
public Vector3 colliderScale;
public Vector3 colliderOffset;
public string tagForObjectWhenActive;
public string tagForObjectWhenInactive;
public bool carryObjectOutOfPlayerBody;
public bool disableObjectColliderWhileGrabbed;
[Space]
public bool ignoreToGrabPhysicallyIfPickedWithAimingMode;
[Space]
[Header ("Physics Settings")]
[Space]
public bool setRigidbodyMassValue;
public float rigidbodyMassValue = 1;
public bool setCustomLayerOnCollidersOnGrab;
public string customLayerOnCollidersOnGrab;
public bool useCustomRigidbodiesParent;
public Transform customRigidbodiesParent;
[Space]
[Header ("Grab Object Animation Settings")]
[Space]
public bool changeAnimationSpeed;
[Range (0, 1)] public float animationSpeed = 1;
public bool setNewMovementTreeID;
public int newMovementTreeID;
public bool applyAnimatorVelocityWithoutMoving;
public bool disableJumpOnGrabbedObject;
public bool disableRunOnGrabbedObject;
public bool disableCrouchOnGrabbedObjet;
[Space]
[Header ("Grab Object Settings")]
[Space]
public bool checkViewToGrabObject;
public bool canBeGrabbedOnFirstPerson = true;
public bool canBeGrabbedOnThirdPerson = true;
[Space]
[Header ("Transform Reference Settings")]
[Space]
public Transform referencePosition;
public bool useReferencePositionForEveryView;
public Transform referencePositionThirdPerson;
public Transform referencePositionFirstPerson;
public Transform referencePositionFBA;
public Transform referencePositionToKeepObject;
[Space]
[Header ("Mount Point Settings")]
[Space]
public bool useBoneToKeepObject;
public HumanBodyBones boneToKeepObject;
public bool useMountPointToKeepObject;
public string mountPointTokeepObjectName;
[Space]
[Header ("Generic Mode Settings")]
[Space]
public bool canBeGrabbedOnGenericMode;
public string mountPointNameToCarryOnGenericMode = "Mouth";
public bool setCustomObjectScaleOnGenericMode;
public Vector3 customObjectScaleOnGenericMode;
[Space]
[Header ("IK Settings")]
[Space]
public bool IKSystemEnabled = true;
public bool useRightHand = true;
public bool useLeftHand = true;
public Transform rightHandPosition;
public Transform lefHandPosition;
public bool useRightElbow;
public bool useLeftElbow;
public Transform rightElbowPosition;
public Transform lefElbowPosition;
[Space]
[Header ("Hands Settings")]
[Space]
public bool useAnimationGrabbingHand;
public int rightGrabbingHandID;
public int leftGrabbingHandID;
[Space]
[Header ("Grab Object Parent Settings")]
[Space]
public bool useRightHandForObjectParent = true;
[Space]
[Header ("Kinematic List Settings")]
[Space]
public bool setExtraListKinematic;
public List<Rigidbody> extraListKinematic = new List<Rigidbody> ();
[Space]
[Header ("Melee Weapons Settings")]
[Space]
public bool useMeleeAttackSystem;
public grabPhysicalObjectMeleeAttackSystem mainGrabPhysicalObjectMeleeAttackSystem;
[Space]
[Header ("Other Settings")]
[Space]
public bool enableTransparencyOnFBA;
[Space]
public bool useThrowAnimationOnCharacterEnabled;
public string throwAnimationOneHand = "Throw Physical Object One Hand";
public string throwAnimationTwoHands = "Throw Physical Object Two Hands";
public bool useDelayToThrowObjectDuringAnimation;
public float delayToThrowObjectDuringAnimation;
public bool ignoreShowObjectNameOnGrabObjectsSystem;
[Space]
[Header ("Extra Collider Settings")]
[Space]
public bool objectUsesExtraColliderList;
public List<Collider> extraColliderList = new List<Collider> ();
public bool checkExtraCollidersInParent;
public Transform extraCollidersParent;
[Space]
[Header ("Debug")]
[Space]
public bool objectGrabed;
public bool objectIsCharacter;
public GameObject character;
public Transform characterBody;
public bool keepGrabbedObjectState;
public List<grabObjects> grabObjectsList = new List<grabObjects> ();
public Transform currentObjectParent;
[Space]
[Header ("Events Settings")]
[Space]
public bool useEventsOnGrabDrop;
public UnityEvent eventOnGrab;
public UnityEvent eventOnDrop;
[Space]
[Header ("Remote Event Settings")]
[Space]
public bool useRemoteEventOnObjectsFound;
public List<string> remoteEventNameListOnStart = new List<string> ();
public List<string> remoteEventNameListOnEnd = new List<string> ();
[Space]
[Header ("Grab Object Type Settings")]
[Space]
public bool objectMeshInsideMainParent;
public Transform objectMeshMainParent;
public bool useMeshCollider;
public bool useBoxCollider;
[Space]
[Header ("Gizmo Settings")]
[Space]
public bool showGizmo;
public Color gizmoColor = Color.red;
[Space]
[Header ("Components")]
[Space]
public GameObject objectToGrabParent;
public Collider grabObjectTrigger;
public Collider mainCollider;
public Rigidbody mainRigidbody;
grabObjects grabObjectsManager;
GameObject currentUser;
grabObjects currentGrabObjectDetected;
List<Rigidbody> rigidbodyList = new List<Rigidbody> ();
List<float> rigidbodyMassList = new List<float> ();
List<int> layerMaskList = new List<int> ();
Vector3 lastPositionBeforeGrabbed;
Quaternion lastRotationBeforeGrabbed;
Vector3 lastPositionBeforeDropped;
Quaternion lastRotationBeforeDropped;
Vector3 originalScale = -Vector3.one;
void Start ()
{
assignObjectToGrabParentIfNull ();
}
public void assignObjectToGrabParentIfNull ()
{
if (objectToGrabParent == null) {
objectToGrabParent = gameObject;
}
}
public void setRigidbodyList ()
{
if (rigidbodyList.Count == 0) {
assignObjectToGrabParentIfNull ();
Transform currentRigidbodiesParent = objectToGrabParent.transform;
if (useCustomRigidbodiesParent) {
currentRigidbodiesParent = customRigidbodiesParent;
}
Component [] components = currentRigidbodiesParent.GetComponentsInChildren (typeof (Rigidbody));
foreach (Rigidbody child in components) {
rigidbodyMassList.Add (child.mass);
rigidbodyList.Add (child);
layerMaskList.Add (child.gameObject.layer);
}
}
}
public void grabObject (GameObject currentPlayer)
{
if (objectGrabed) {
return;
}
//print ("grab object");
objectGrabed = true;
grabObjectsManager = currentPlayer.GetComponent<grabObjects> ();
setGrabObjectTriggerState (false);
assignObjectToGrabParentIfNull ();
lastPositionBeforeGrabbed = objectToGrabParent.transform.position;
lastRotationBeforeGrabbed = objectToGrabParent.transform.rotation;
grabPhysicalObjectInfo newGrabPhysicalObjectInfo = new grabPhysicalObjectInfo ();
newGrabPhysicalObjectInfo.objectToGrab = objectToGrabParent;
newGrabPhysicalObjectInfo.IKSystemEnabled = IKSystemEnabled;
newGrabPhysicalObjectInfo.changeAnimationSpeed = changeAnimationSpeed;
newGrabPhysicalObjectInfo.animationSpeed = animationSpeed;
newGrabPhysicalObjectInfo.setNewMovementTreeID = setNewMovementTreeID;
newGrabPhysicalObjectInfo.newMovementTreeID = newMovementTreeID;
newGrabPhysicalObjectInfo.applyAnimatorVelocityWithoutMoving = applyAnimatorVelocityWithoutMoving;
newGrabPhysicalObjectInfo.disableJumpOnGrabbedObject = disableJumpOnGrabbedObject;
newGrabPhysicalObjectInfo.disableRunOnGrabbedObject = disableRunOnGrabbedObject;
newGrabPhysicalObjectInfo.disableCrouchOnGrabbedObjet = disableCrouchOnGrabbedObjet;
newGrabPhysicalObjectInfo.rightHandPosition = rightHandPosition;
newGrabPhysicalObjectInfo.lefHandPosition = lefHandPosition;
newGrabPhysicalObjectInfo.useRightHand = useRightHand;
newGrabPhysicalObjectInfo.useLeftHand = useLeftHand;
newGrabPhysicalObjectInfo.useRightElbow = useRightElbow;
newGrabPhysicalObjectInfo.useLeftElbow = useLeftElbow;
newGrabPhysicalObjectInfo.rightElbowPosition = rightElbowPosition;
newGrabPhysicalObjectInfo.lefElbowPosition = lefElbowPosition;
newGrabPhysicalObjectInfo.useAnimationGrabbingHand = useAnimationGrabbingHand;
newGrabPhysicalObjectInfo.rightGrabbingHandID = rightGrabbingHandID;
newGrabPhysicalObjectInfo.leftGrabbingHandID = leftGrabbingHandID;
newGrabPhysicalObjectInfo.useRightHandForObjectParent = useRightHandForObjectParent;
grabObjectsManager.grabPhysicalObject (newGrabPhysicalObjectInfo);
for (int i = 0; i < grabObjectsList.Count; i++) {
if (grabObjectsList [i] != grabObjectsManager) {
grabObjectsList [i].removeCurrentPhysicalObjectToGrabFound (objectToGrabParent);
}
}
if (setRigidbodyMassValue || setCustomLayerOnCollidersOnGrab) {
setRigidbodyList ();
string customLayerName = "Ignore Raycast";
if (setCustomLayerOnCollidersOnGrab) {
customLayerName = customLayerOnCollidersOnGrab;
}
int ignoreRaycastLayerIndex = LayerMask.NameToLayer (customLayerName);
for (int i = 0; i < rigidbodyList.Count; i++) {
if (rigidbodyMassValue >= 0) {
rigidbodyList [i].mass = rigidbodyMassValue;
}
rigidbodyList [i].gameObject.layer = ignoreRaycastLayerIndex;
}
}
if (setExtraListKinematic) {
for (int i = 0; i < extraListKinematic.Count; i++) {
if (extraListKinematic [i] != null) {
extraListKinematic [i].isKinematic = true;
}
}
}
if (objectIsCharacter) {
if (character != null) {
ragdollActivator currentRagdollActivator = character.GetComponent<ragdollActivator> ();
if (currentRagdollActivator != null) {
currentRagdollActivator.setCheckGetUpPausedState (true);
}
}
}
checkEventsOnGrabDrop (true);
checkRemoteEvents (true);
if (disableObjectColliderWhileGrabbed) {
setMainColliderEnabledState (false);
}
}
public void dropObject ()
{
//print ("drop object");
objectGrabed = false;
lastPositionBeforeDropped = objectToGrabParent.transform.position;
lastRotationBeforeDropped = objectToGrabParent.transform.rotation;
if (grabObjectsManager != null) {
grabObjectsManager.dropPhysicalObject ();
}
grabObjectsManager = null;
setGrabObjectTriggerState (true);
if (setExtraListKinematic) {
for (int i = 0; i < extraListKinematic.Count; i++) {
if (extraListKinematic [i] != null) {
extraListKinematic [i].isKinematic = false;
}
}
}
if (setRigidbodyMassValue || setCustomLayerOnCollidersOnGrab) {
for (int i = 0; i < rigidbodyList.Count; i++) {
rigidbodyList [i].mass = rigidbodyMassList [i];
rigidbodyList [i].gameObject.layer = layerMaskList [i];
}
}
if (objectIsCharacter) {
assignObjectToGrabParentIfNull ();
if (character != null) {
ragdollActivator currentRagdollActivator = character.GetComponent<ragdollActivator> ();
if (currentRagdollActivator != null) {
currentRagdollActivator.setCheckGetUpPausedState (false);
if (characterBody == null) {
characterBody = currentRagdollActivator.characterBody.transform;
}
}
}
if (characterBody != null) {
characterBody.transform.position = objectToGrabParent.transform.position;
}
objectToGrabParent.transform.SetParent (characterBody);
}
checkEventsOnGrabDrop (false);
checkRemoteEvents (false);
if (disableObjectColliderWhileGrabbed) {
setMainColliderEnabledState (true);
}
keepGrabbedObjectState = false;
currentObjectParent = null;
}
public void checkParentAssignedState ()
{
checkNewParentAssignedState (objectToGrabParent.transform.parent);
}
public void checkNewParentAssignedState (Transform newParent)
{
}
public bool isUseReferencePositionForEveryViewActive ()
{
return useReferencePositionForEveryView;
}
public Transform getReferencePositionThirdPerson ()
{
return referencePositionThirdPerson;
}
public Transform getReferencePositionFirstPerson ()
{
return referencePositionFirstPerson;
}
public Transform getReferencePositionFBA ()
{
return referencePositionFBA;
}
public Transform getReferencePosition ()
{
return referencePosition;
}
public string getObjectName ()
{
if (objectName == "") {
objectName = gameObject.name;
}
return objectName;
}
public bool isIgnoreShowObjectNameOnGrabObjectsSystemActive ()
{
return ignoreShowObjectNameOnGrabObjectsSystem;
}
public bool isCanBeGrabbedOnGenericModeEnabled ()
{
return canBeGrabbedOnGenericMode;
}
public bool isIgnoreToGrabPhysicallyIfPickedWithAimingModeActive ()
{
return ignoreToGrabPhysicallyIfPickedWithAimingMode;
}
void OnTriggerEnter (Collider col)
{
checkTriggerInfo (col, true);
}
void OnTriggerExit (Collider col)
{
checkTriggerInfo (col, false);
}
public void checkTriggerInfo (Collider col, bool isEnter)
{
if (objectGrabed) {
return;
}
if ((1 << col.gameObject.layer & layerForUsers.value) == 1 << col.gameObject.layer) {
//if the player is entering in the trigger
currentGrabObjectDetected = col.gameObject.GetComponent<grabObjects> ();
if (currentGrabObjectDetected != null) {
assignObjectToGrabParentIfNull ();
if (isEnter) {
if (!currentGrabObjectDetected.isGrabObjectsPhysicallyEnabled ()) {
return;
}
currentUser = col.gameObject;
if (grabObjectPhysically) {
if (objectIsCharacter) {
if (character == currentUser) {
return;
}
}
grabObjectsList.Add (currentGrabObjectDetected);
currentGrabObjectDetected.addCurrentPhysicalObjectToGrabFound (objectToGrabParent);
}
} else {
if (objectToGrabParent != null) {
currentGrabObjectDetected.removeCurrentPhysicalObjectToGrabFound (objectToGrabParent);
}
grabObjectsList.Remove (currentGrabObjectDetected);
}
}
}
}
public void removeAllGrabObjectsFound ()
{
assignObjectToGrabParentIfNull ();
for (int i = grabObjectsList.Count - 1; i >= 0; i--) {
if (grabObjectsList [i].isCarryingPhysicalObject () && grabObjectsList [i].getCurrentPhysicalObjectGrabbed () != null &&
grabObjectsList [i].getCurrentPhysicalObjectGrabbed () == objectToGrabParent) {
grabObjectsList [i].dropObject ();
}
grabObjectsList [i].removeCurrentPhysicalObjectToGrabFound (objectToGrabParent);
grabObjectsList.RemoveAt (i);
}
}
public void setCurrentPlayer (GameObject newPlayer)
{
checkTriggerInfo (newPlayer.GetComponent<Collider> (), true);
}
public bool isGrabObjectPhysicallyEnabled ()
{
return grabObjectPhysically;
}
public bool isCanBeGrabbedOnFirstPersonEnabled ()
{
return canBeGrabbedOnFirstPerson;
}
public bool isCanBeGrabbedOnThirdPersonEnabled ()
{
return canBeGrabbedOnThirdPerson;
}
public void disableGrabPhysicalObject ()
{
grabObjectPhysically = false;
if (currentUser != null) {
assignObjectToGrabParentIfNull ();
currentUser.GetComponent<grabObjects> ().removeCurrentPhysicalObjectToGrabFound (objectToGrabParent);
}
}
public void setGrabObjectPhysicallyEnabledState (bool state)
{
grabObjectPhysically = state;
}
public void setGrabObjectPhysicallyEnabledStateFromEditor (bool state)
{
setGrabObjectPhysicallyEnabledState (state);
updateComponent ();
}
public void setMainColliderEnabledState (bool state)
{
if (mainCollider != null) {
mainCollider.enabled = state;
}
}
public void setGrabObjectTriggerState (bool state)
{
if (grabObjectTrigger != null) {
grabObjectTrigger.enabled = state;
}
}
public void setGrabObjectTriggerStateFromEditor (bool state)
{
setGrabObjectTriggerState (state);
updateComponent ();
}
public void setCharacterBody (Transform newCharacterBody)
{
characterBody = newCharacterBody;
updateComponent ();
}
public void setCharacter (GameObject newCharacter)
{
character = newCharacter;
updateComponent ();
}
public void setObjectToGrabParent (GameObject newObjectToGrabParent)
{
objectToGrabParent = newObjectToGrabParent;
updateComponent ();
}
public void setActiveOrInactiveObjectState (bool state)
{
if (state) {
if (tagForObjectWhenActive == "") {
tagForObjectWhenActive = "box";
}
objectToGrabParent.tag = tagForObjectWhenActive;
} else {
if (tagForObjectWhenInactive == "") {
tagForObjectWhenInactive = "Untagged";
}
objectToGrabParent.tag = tagForObjectWhenInactive;
}
}
public void checkEventsOnGrabDrop (bool state)
{
if (useEventsOnGrabDrop) {
if (state) {
eventOnGrab.Invoke ();
} else {
eventOnDrop.Invoke ();
}
}
}
public void disableGrabPhysicalObjectComponent ()
{
removeAllGrabObjectsFound ();
setGrabObjectTriggerState (false);
setActiveOrInactiveObjectState (false);
}
public bool isUseRightHandActive ()
{
return useRightHand;
}
public bool isUseLeftHandActive ()
{
return useLeftHand;
}
public bool hasObjectMeleeAttackSystem ()
{
return useMeleeAttackSystem;
}
public grabPhysicalObjectMeleeAttackSystem getMainGrabPhysicalObjectMeleeAttackSystem ()
{
return mainGrabPhysicalObjectMeleeAttackSystem;
}
public void activateReturnProjectilesOnContact ()
{
if (grabObjectsManager != null) {
grabObjectsManager.activateReturnProjectilesOnContact ();
}
}
public void checkRemoteEvents (bool state)
{
if (state) {
checkRemoteEventOnStart ();
} else {
checkRemoteEventOnEnd ();
}
}
public void checkRemoteEventOnStart ()
{
if (useRemoteEventOnObjectsFound) {
if (currentUser != null) {
remoteEventSystem currentRemoteEventSystem = currentUser.GetComponent<remoteEventSystem> ();
if (currentRemoteEventSystem != null) {
for (int i = 0; i < remoteEventNameListOnStart.Count; i++) {
currentRemoteEventSystem.callRemoteEvent (remoteEventNameListOnStart [i]);
}
}
}
}
}
public void checkRemoteEventOnEnd ()
{
if (useRemoteEventOnObjectsFound) {
if (currentUser != null) {
remoteEventSystem currentRemoteEventSystem = currentUser.GetComponent<remoteEventSystem> ();
if (currentRemoteEventSystem != null) {
for (int i = 0; i < remoteEventNameListOnEnd.Count; i++) {
currentRemoteEventSystem.callRemoteEvent (remoteEventNameListOnEnd [i]);
}
}
}
}
}
public void setKeepOrCarryGrabbebObjectState (bool state)
{
if (objectGrabed) {
keepGrabbedObjectState = state;
if (useMeleeAttackSystem) {
mainGrabPhysicalObjectMeleeAttackSystem.setKeepOrCarryGrabbebObjectState (state);
}
}
}
public void assignObjectParent (Transform newParent)
{
currentObjectParent = newParent;
}
public Transform getCurrentObjectParent ()
{
return currentObjectParent;
}
public Vector3 getLastPositionBeforeGrabbed ()
{
return lastPositionBeforeGrabbed;
}
public Quaternion getLastRotationBeforeGrabbed ()
{
return lastRotationBeforeGrabbed;
}
public Vector3 getLastPositionBeforeDropped ()
{
return lastPositionBeforeDropped;
}
public Quaternion getLastRotationBeforeDropped ()
{
return lastRotationBeforeDropped;
}
Transform lastParentAssigned;
public void setLastParentAssigned (Transform newParent)
{
lastParentAssigned = newParent;
}
public Transform getLastParentAssigned ()
{
return lastParentAssigned;
}
public void grabPhysicalObjectExternally (GameObject currentPlayer)
{
if (currentPlayer == null) {
return;
}
GKC_Utils.grabPhysicalObjectExternally (currentPlayer, gameObject);
}
public Rigidbody getMainRigidbody ()
{
if (mainRigidbody == null) {
return objectToGrabParent.GetComponent<Rigidbody> ();
}
return mainRigidbody;
}
public void setCustomScale (Vector3 newValue)
{
if (originalScale == -Vector3.one) {
originalScale = transform.localScale;
}
transform.localScale = newValue;
}
public void setOriginalScale ()
{
if (originalScale != -Vector3.one) {
setCustomScale (originalScale);
}
}
public List<Collider> getExtraColliderList ()
{
if (objectUsesExtraColliderList) {
List<Collider> newColliderList = new List<Collider> ();
if (extraColliderList.Count > 0) {
newColliderList.AddRange (extraColliderList);
}
if (checkExtraCollidersInParent) {
Component [] components = extraCollidersParent.GetComponentsInChildren (typeof (Collider));
int componentsLength = components.Length;
for (int i = 0; i < componentsLength; i++) {
Collider currentChildCollider = components [i] as Collider;
if (!currentChildCollider.isTrigger) {
newColliderList.Add (currentChildCollider);
}
}
}
if (newColliderList.Count > 0) {
return newColliderList;
}
}
return null;
}
public bool getObjectUsesExtraColliderListState ()
{
return objectUsesExtraColliderList;
}
//EDITOR FUNCTIONS
void updateComponent ()
{
GKC_Utils.updateComponent (this);
}
#if UNITY_EDITOR
void OnDrawGizmos ()
{
if (!showGizmo) {
return;
}
if (GKC_Utils.isCurrentSelectionActiveGameObject (gameObject)) {
DrawGizmos ();
}
}
void OnDrawGizmosSelected ()
{
DrawGizmos ();
}
void DrawGizmos ()
{
if (showGizmo) {
GKC_Utils.drawRectangleGizmo (transform.position, transform.rotation, colliderOffset, colliderScale, gizmoColor);
if (rightHandPosition) {
Gizmos.DrawSphere (rightHandPosition.position, 0.2f);
}
if (lefHandPosition) {
Gizmos.DrawSphere (lefHandPosition.position, 0.2f);
}
}
}
#endif
[System.Serializable]
public class grabPhysicalObjectInfo
{
public GameObject objectToGrab;
public bool IKSystemEnabled;
public bool changeAnimationSpeed;
public float animationSpeed;
public bool setNewMovementTreeID;
public int newMovementTreeID;
public bool applyAnimatorVelocityWithoutMoving;
public bool disableJumpOnGrabbedObject;
public bool disableRunOnGrabbedObject;
public bool disableCrouchOnGrabbedObjet;
public Transform rightHandPosition;
public Transform lefHandPosition;
public bool useRightHand;
public bool useLeftHand;
public bool useRightElbow;
public bool useLeftElbow;
public Transform rightElbowPosition;
public Transform lefElbowPosition;
public bool useRightHandForObjectParent;
public bool useAnimationGrabbingHand;
public int rightGrabbingHandID;
public int leftGrabbingHandID;
}
}