예제 #1
0
    public void Awake()
    {
        // Register the interactable object events
        CActorInteractable IO = GetComponent <CActorInteractable>();

        IO.EventHover += HandlePlayerHover;
    }
예제 #2
0
    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;
            }
        }
    }
예제 #3
0
    // Member Properties


    // Member Methods


    void Start()
    {
        CActorInteractable ai = GetComponent <CActorInteractable>();

        ai.EventUse += OnPlayerUse;
    }
예제 #4
0
    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;
        }
    }