Exemple #1
0
    /// <summary>[Update]</summary>
    void Update()
    {
        //フラグ計算に使用
        bool isOldStay = isStay;

        isOtherObjectHit = false;

        if (!isEnabledRaycast)
        {
            //フラグ計算に使用
            isStay = false;

            //isEnter Frame?
            if ((isStay ^ isOldStay) & isStay)
            {
                isEnter = true;
                isExit  = false;
            }
            //isExit Frame?
            else if ((isStay ^ isOldStay) & isOldStay)
            {
                isEnter = false;
                isExit  = true;
            }

            if (!isStay & !isEnter & !isExit)
            {
                rayCastResult = null;
            }

            //debug only
#if UNITY_EDITOR
            //表示用変数更新
            m_dIsStayNow  = isStay;
            m_dIsEnterNow = isEnter;
            m_dIsExitNow  = isExit;
            m_dIsEnabled  = isEnabledRaycast;
#endif

            return;
        }

        //呼び出しコスト削減
        Transform  myTransform = transform;
        Quaternion rotation    = myTransform.rotation;
        Vector3    lossyScale  = myTransform.lossyScale;
        Vector3    position    = myTransform.position;

        //RaycastHit
        RaycastHit raycastHit = new RaycastHit();

        //center
#if UNITY_EDITOR
        centerPosition = position + myTransform.right * m_center.x + myTransform.up * m_center.y + myTransform.forward * m_center.z;
#else
        if (m_target != null)
        {
            centerPosition = position + myTransform.right * m_center.x + myTransform.up * m_center.y + myTransform.forward * m_center.z;
        }
#endif
        //direction
        Vector3 direction = GetRaycastDirection(centerPosition);
        if (m_isDirectionLock && rayCastResult != null)
        {
            direction = rayCastResult.direction;
        }

        //Raycast
        isStay = Physics.Raycast(centerPosition, direction, out raycastHit, m_distance, m_raycastLayerMask);

        //Hit!
        if (isStay && m_raycastTargetLayerMask.EqualBitsForGameObject(raycastHit.transform.gameObject))
        {
            //result代入
            rayCastResult = new RaycastResult(raycastHit.transform, raycastHit.point, raycastHit.normal, direction,
                                              1 << raycastHit.transform.gameObject.layer, raycastHit.distance);
        }
        else if (isStay)
        {
            isStay           = false;
            isOtherObjectHit = true;
            //result代入
            rayCastResult = new RaycastResult(raycastHit.transform, raycastHit.point, raycastHit.normal, direction,
                                              1 << raycastHit.transform.gameObject.layer, raycastHit.distance);
        }
        else
        {
            rayCastResult = null;
        }

        //isEnter Frame?
        if ((isStay ^ isOldStay) & isStay)
        {
            isEnter = true;
            isExit  = false;
        }
        //isExit Frame?
        else if ((isStay ^ isOldStay) & isOldStay)
        {
            isEnter = false;
            isExit  = true;
        }
        //isStay Frame
        else
        {
            isEnter = false;
            isExit  = false;
        }


        if (((m_isOldDirectionLock ^ isDirectionLock) & isDirectionLock)
            | !isDirectionLock)
        {
            lockDirection = direction;
        }

        //debug only
#if UNITY_EDITOR
        //表示用変数更新
        m_dIsStayNow  = isStay;
        m_dIsEnterNow = isEnter;
        m_dIsExitNow  = isExit;
        m_dIsEnabled  = isEnabledRaycast;
#endif
    }