public void Awake() { // Register the interactable object events CActorInteractable IO = GetComponent <CActorInteractable>(); IO.EventHover += HandlePlayerHover; }
void OnEventInput(CUserInput.EInput _eInput, bool _bDown) { if (m_cTargetActorObject != null) { CActorInteractable cActorInteractable = m_cTargetActorObject.GetComponent <CActorInteractable>(); switch (_eInput) { case CUserInput.EInput.Primary: cActorInteractable.OnInteractionInput(EInputInteractionType.Primary, gameObject, m_cTargetRaycastHit, _bDown); if (EventPrimary != null) { EventPrimary(EInputInteractionType.Primary, m_cTargetActorObject, m_cTargetRaycastHit, _bDown); } break; case CUserInput.EInput.Secondary: cActorInteractable.OnInteractionInput(EInputInteractionType.Secondary, gameObject, m_cTargetRaycastHit, _bDown); if (EventSecondary != null) { EventSecondary(EInputInteractionType.Secondary, m_cTargetActorObject, m_cTargetRaycastHit, _bDown); } break; case CUserInput.EInput.Use: cActorInteractable.OnInteractionInput(EInputInteractionType.Use, gameObject, m_cTargetRaycastHit, _bDown); if (EventUse != null) { EventUse(EInputInteractionType.Use, m_cTargetActorObject, m_cTargetRaycastHit, _bDown); } break; default: Debug.LogError("Unknown input: " + _eInput); break; } } }
// Member Properties // Member Methods void Start() { CActorInteractable ai = GetComponent <CActorInteractable>(); ai.EventUse += OnPlayerUse; }
void UpdateTarget() { GameObject cPlayerCamera = CGameCameras.PlayersHeadCamera; Ray cCameraRay = new Ray(cPlayerCamera.transform.position, cPlayerCamera.transform.forward); GameObject cNewTargetActorObject = null; RaycastHit cTargetRaycastHit = new RaycastHit(); // Do the raycast against all objects in path RaycastHit[] cRaycastHits = Physics.RaycastAll(cCameraRay, k_fRayRange).OrderBy(_cRay => _cRay.distance).ToArray(); // Check each one for an interactable objectg foreach (RaycastHit cRaycastHit in cRaycastHits) { // Iteractable objects must be non-trigger if (!cRaycastHit.collider.isTrigger) { // Get the game object which owns this mesh GameObject cHitObject = cRaycastHit.collider.gameObject; // Check the object itself for the interactable script CActorInteractable cActorInteractable = cHitObject.GetComponent <CActorInteractable>(); // Check the parents until we find the one that has CActorInteractable on it if (cActorInteractable == null) { cActorInteractable = CUtility.FindInParents <CActorInteractable>(cHitObject); } // If found an interactable select it if (cActorInteractable != null) { cNewTargetActorObject = cActorInteractable.gameObject; cTargetRaycastHit = cRaycastHit; } // Break out - if the first propper collider wasn't interactable this is intentional break; } } if (cNewTargetActorObject != m_cTargetActorObject) { s_cSerializeStream.Write((byte)ENetworkAction.UpdateTarget); if (cNewTargetActorObject == null) { s_cSerializeStream.Write((CNetworkViewId)null); } else { s_cSerializeStream.Write(cNewTargetActorObject.GetComponent <CNetworkView>().ViewId); } m_cOldTargetActorObject = m_cTargetActorObject; m_cTargetActorObject = cNewTargetActorObject; // Notify old target about loosing hover if (m_cOldTargetActorObject != null) { m_cOldTargetActorObject.GetComponent <CActorInteractable>().OnInteractionHover(gameObject, new RaycastHit(), false); } // Notify new target about hover if (m_cTargetActorObject != null) { m_cTargetActorObject.GetComponent <CActorInteractable>().OnInteractionHover(gameObject, m_cTargetRaycastHit, true); } // Notify observers about target change if (EventTargetChange != null) { EventTargetChange(m_cOldTargetActorObject, m_cTargetActorObject, m_cTargetRaycastHit); } } if (m_cTargetActorObject != null) { m_cTargetRaycastHit = cTargetRaycastHit; } }