You should be able to solve this analytically using world positions without resorting to screenspace. If you know your flashlight position and direction in the world then you can solve it in your receiver material.

The basis for this will be a spheremask and we will be computing a cone instead of a sphere by calculating a different radius along the length of the line. Just going to off the cuff this so apologies if there are errors.

I would start by making a “Material Parameter Collection” where you add two Vector Params: FlashLightPosition and FlashLightDirection. In your player BP, set these MPC values using the flashlight position and rotation X vector (assuming it points along the X axis, adjust accordingly).

Next place “Absolute World Position” and “Spheremask” into your material for the receiver. Hook WorldPos into the “A” of the Spheremask.

The B of the spheremask will be more of an expression using a line:

FlashLightPosition + ( dot((WorldPosition - FlashLightPosition), FlashLightDirection) * FlashLightDirection)

That expression returns the closest point along the center of the flashlight beam for any point in the world.

Then radius just needs to be the Tangent of the cone angle times the length along the line.

The tangent can be calculated easily. Say your beam has a half angle of 12.25 meaning a total angle of 22.5. Your tan will be tan(12.25) = 0.1989

The length along the line can be extracted from the previous expression:

length( dot((WorldPosition - FlashLightPosition), FlashLightDirection) * FlashLightDirection )

I will try and test this out soon since there is a chance I messed something up.