コード例 #1
0
    public CollisionLocation Constrain3DObject(Transform objectTransform, bool collisionInfoOnly = false)
    {
        yMidPoint = new Vector3(FrustumCorners[3].x, objectTransform.position.y, FrustumCorners[3].z);
        xMidPoint = FrustumCorners[3] - (FrustumCorners[3] - FrustumCorners[1]).normalized * Vector3.Distance(objectTransform.position, yMidPoint);

        float hDist   = Vector3.Distance(yMidPoint, objectTransform.position);
        float vDist   = Vector3.Distance(xMidPoint, objectTransform.position);
        float hDirDot = Vector3.Dot((yMidPoint - objectTransform.position).normalized, objectTransform.right);
        float vDirDot = Vector3.Dot((xMidPoint - objectTransform.position).normalized, objectTransform.up);

        hDist *= hDirDot < 0f ? -1f : 1f;
        vDist *= vDirDot < 0f ? -1f : 1f;
        CollisionLocation location = CollisionLocation.None;

        if (hDist <= 0f)
        {
            if (!collisionInfoOnly)
            {
                objectTransform.position = new Vector3(yMidPoint.x, objectTransform.position.y, yMidPoint.z);
            }
            location ^= CollisionLocation.Right;
        }

        if (hDist >= HorizontalDistance)
        {
            if (!collisionInfoOnly)
            {
                objectTransform.position = new Vector3(FrustumCorners[0].x, objectTransform.position.y, FrustumCorners[0].z);
            }
            location ^= CollisionLocation.Left;
        }

        if (vDist <= 0f)
        {
            if (!collisionInfoOnly)
            {
                objectTransform.position = new Vector3(objectTransform.position.x, xMidPoint.y, objectTransform.position.z);
            }
            location ^= CollisionLocation.Top;
        }

        if (vDist >= VerticalDistance)
        {
            if (!collisionInfoOnly)
            {
                objectTransform.position = new Vector3(objectTransform.position.x, FrustumCorners[0].y, objectTransform.position.z);
            }
            location ^= CollisionLocation.Bottom;
        }

        return(location);
    }
コード例 #2
0
    public static CollisionLocation RestrictToScreenBoundary(Camera camera, Transform transform, bool collisionDataOnly = false)
    {
        if (!camera)
        {
            return(CollisionLocation.None);
        }
        CollisionLocation col = CollisionLocation.None;

        Vector3 viewportPos = camera.WorldToViewportPoint(transform.position);

        if (viewportPos.x <= 0f)
        {
            viewportPos.x = 0f;
            col          ^= CollisionLocation.Left;
        }

        if (viewportPos.x >= 1f)
        {
            viewportPos.x = 1f;
            col          ^= CollisionLocation.Right;
        }

        if (viewportPos.y <= 0f)
        {
            viewportPos.y = 0f;
            col          ^= CollisionLocation.Bottom;
        }

        if (viewportPos.y >= 1f)
        {
            viewportPos.y = 1f;
            col          ^= CollisionLocation.Top;
        }

        if (!collisionDataOnly)
        {
            transform.position = camera.ViewportToWorldPoint(viewportPos);
        }
        return(col);
    }