using System.Collections; using System.Collections.Generic; using UnityEngine; namespace Autohand{ /// Takes a reference for a disabled grabbable, and grabs that instead [RequireComponent(typeof(Grabbable))] public class GrabbableSubstitute : MonoBehaviour{ [Tooltip("Whether or not to disable this gameobject on grab")] public bool disableOnGrab = true; [Tooltip("If true, the substitute will return to the this local location and turn off and the local grabbable will turn back on")] public bool returnOnRelease = false; public Grabbable grabbableSubstitute; Grabbable localGrabbable; private void Start() { localGrabbable = GetComponent(); localGrabbable.OnGrabEvent += OnGrabOriginal; grabbableSubstitute.OnReleaseEvent += OnReleaseSub; } void OnGrabOriginal(Hand hand, Grabbable grab) { hand.Release(); grabbableSubstitute.gameObject.SetActive(true); hand.CreateGrabConnection(grabbableSubstitute, hand.transform.position, hand.transform.rotation, grab.transform.position, grab.transform.rotation, true); if(disableOnGrab) grab.gameObject.SetActive(false); } void OnReleaseSub(Hand hand, Grabbable grab) { if(returnOnRelease) { grabbableSubstitute.transform.position = localGrabbable.transform.position; grabbableSubstitute.transform.rotation = localGrabbable.transform.rotation; grabbableSubstitute.body.position = localGrabbable.body.position; grabbableSubstitute.body.rotation = localGrabbable.body.rotation; grabbableSubstitute.gameObject.SetActive(false); if(disableOnGrab) grab.gameObject.SetActive(true); } } /// Disables the local grabbale (if enabled), enables the substitute at the local grabbables positoin) public void LocalSubstitute(Hand hand, Grabbable grab) { if(localGrabbable.gameObject.activeInHierarchy) { grabbableSubstitute.gameObject.SetActive(true); grabbableSubstitute.transform.position = localGrabbable.transform.position; grabbableSubstitute.transform.rotation = localGrabbable.transform.rotation; grabbableSubstitute.body.position = localGrabbable.body.position; grabbableSubstitute.body.rotation = localGrabbable.body.rotation; if(disableOnGrab) localGrabbable.gameObject.SetActive(false); } } } }