示例#1
0
    private void CastLaser()
    {
        if (GameController.m_GameFinished)
        {
            return;
        }
        if (!l_RayActive)
        {
            return;
        }

        Vector3    l_EndRaycastPosition = Vector3.forward * m_MaxDistance;
        RaycastHit l_RaycastHit;

        if (Physics.Raycast(new Ray(m_LineRenderer.transform.position, m_LineRenderer.transform.forward), out l_RaycastHit, m_MaxDistance, m_CollisionLayerMask.value))
        {
            l_EndRaycastPosition = Vector3.forward * l_RaycastHit.distance;
            try
            {
                if (l_RaycastHit.collider.gameObject.GetComponent <RefractionCube>() != null)
                {
                    l_RaycastHit.collider.GetComponent <RefractionCube>().CreateRefraction();
                }
                else if (l_RaycastHit.collider.gameObject.GetComponent <LaserPortal>() != null)
                {
                    l_RaycastHit.collider.GetComponent <LaserPortal>().Collide(l_RaycastHit.point, this.gameObject.transform.forward);
                }
                else if (l_RaycastHit.collider.gameObject.GetComponent <ButtonInteractable>() != null)
                {
                    m_LastButtonHit = l_RaycastHit.collider.gameObject.GetComponent <ButtonInteractable>();
                    m_LastButtonHit.Interact();
                }
                else if (l_RaycastHit.collider.gameObject.GetComponent <PlayerController>() != null)
                {
                    l_RaycastHit.collider.gameObject.GetComponent <IDamageable>().DealDamage(999, l_RaycastHit.collider);
                }
                else if (m_LastButtonHit != null)
                {
                    m_LastButtonHit.ForceStop();
                    m_LastButtonHit = null;
                }
            }
            catch { }
        }
        m_LineRenderer.SetPosition(1, l_EndRaycastPosition);
    }
示例#2
0
    public void CreateRefraction(Vector3 l_Position, Vector3 l_Direction) //This is a mess and took me 4+ hours.
    {
        if (m_CubeRefracted)
        {
            return;
        }

        this.m_CreateRefraction     = true;
        this.m_CubeRefracted        = true;
        this.m_LineRenderer.enabled = true;

        #region Vector3 Declarations
        Vector3 l_EndRayCastPosition;
        Vector3 l_CollisionPointOnLocal;
        Vector3 l_CollisionPointOnWorld;
        Vector3 l_DirectionOnWorld;
        #endregion

        l_CollisionPointOnLocal = m_AttachedPortal.m_MirrorPortal.transform.InverseTransformPoint(l_Position);
        l_CollisionPointOnLocal = new Vector3(-l_CollisionPointOnLocal.x, l_CollisionPointOnLocal.y, -l_CollisionPointOnLocal.z);

        m_LineRenderer.SetPosition(0, l_CollisionPointOnLocal);

        //Setting the starting position!
        l_EndRayCastPosition = l_CollisionPointOnLocal + l_Direction * m_MaxDistance;

        //Changing a lot!
        l_CollisionPointOnWorld = m_AttachedPortal.transform.TransformPoint(l_CollisionPointOnLocal);
        l_DirectionOnWorld      = m_AttachedPortal.m_MirrorPortal.transform.InverseTransformDirection(l_Direction);
        l_DirectionOnWorld      = this.m_AttachedPortal.transform.TransformDirection(l_DirectionOnWorld);
        l_DirectionOnWorld      = new Vector3(-l_DirectionOnWorld.x, l_DirectionOnWorld.y, -l_DirectionOnWorld.z);
        //Moving from Local to World! For the raycast!

        //Time for a Raycast!
        Ray        l_WorldRay = new Ray(l_CollisionPointOnWorld + (l_DirectionOnWorld * 0.1f), l_DirectionOnWorld);
        RaycastHit l_RayCastHit;
        if (Physics.Raycast(l_WorldRay, out l_RayCastHit, m_MaxDistance, m_CollisionLayerMask))
        {
            l_EndRayCastPosition = this.gameObject.transform.InverseTransformPoint(l_RayCastHit.point); //The hit in raycast is WORLD, we need it in LOCAL for the LineRenderer!
            try
            {
                if (l_RayCastHit.collider.gameObject.GetComponent <RefractionCube>() != null)
                {
                    l_RayCastHit.collider.gameObject.GetComponent <RefractionCube>().CreateRefraction();
                }
                if (l_RayCastHit.collider.gameObject.GetComponent <ButtonInteractable>() != null)
                {
                    m_LastButtonHit = l_RayCastHit.collider.gameObject.GetComponent <ButtonInteractable>();
                    m_LastButtonHit.Interact();
                }
                else if (m_LastButtonHit != null)
                {
                    m_LastButtonHit.ForceStop();
                    m_LastButtonHit = null;
                }
                else if (l_RayCastHit.collider.gameObject.GetComponent <IDamageable>() != null)
                {
                    l_RayCastHit.collider.gameObject.GetComponent <IDamageable>().DealDamage(999, l_RayCastHit.collider);
                }
            }
            catch
            {
                //Fail! But it has to!
            }
        }
        //End raycast!
        m_LineRenderer.SetPosition(1, l_EndRayCastPosition);
    }