986 lines
26 KiB
C#
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;
|
|
}
|
|
}
|