Search Issue Tracker
WorldToScreenPoint transforms offsetted screen position when display is scaled above 100% on Windows 10
How to reproduce:
1. Open the attached '1220751.zip' project
2. Open 'SampleScene' Scene
3. Select 'GameObject' GameObject in the Hierarchy and observe its position in the Scene View
4. Open Display Settings and change Scale and layout section's scaling to 150% on Windows
5. Back to the Editor and select 'GameObject' GameObject in the Hierarchy
Expected result: GameObject's position is drawn at the object origin
Actual result: GameObject's position is offsetted
Reproducible with: 2018.2.0a6, 2018.4.18f1, 2019.3.4f1, 2020.1.a25, 2020.2.0a1
Not reproducible: 2018.2.0a5
Could not test with: 2017.4.37f1 because Presets namespace is not introduced
Notes: Video and project of reproduction attached in Edit
All about bugs
View bugs we have successfully reproduced, and vote for the bugs you want to see fixed most urgently.
- [HDRP] Decal Projector with layer mask "nothing" doesn't affect transparent objects when Decal Layers are disabled in frame settings
- "MonoBehaviour.OnApplicationQuit" is still called when quitting is canceled by “Application.wantsToQuit“ returning false
- [2D SG/VFX] Surface options are not shown in Output Inspector when 2D Sprite SG is assigned to VFX
- Collisions are incorrectly registered when setting a joint motor every frame causes
- Terrain shadows flicker while moving the Camera in the Player when Terrain contains GPU instanced materials
Resolution Note (2020.1.X):
The code is working as expected.
According to https://docs.unity3d.com/ScriptReference/Camera.WorldToScreenPoint.html WorldToScreenPoint defines ScreenSpace in pixels.
Most modern displays are resolution independent. Their logical area is not the same as their pixel resolution. In order to get the correct resolution for placement on the screen, you have to transform the coordinates from pixels to screen coordinates by dividing by EditorGUIUtility.pixelsPerPoint (https://docs.unity3d.com/ScriptReference/EditorGUIUtility-pixelsPerPoint.html)
In addition, the Y axis is inverted for GUI space, with (0,0) being the top left corner instead of the bottom left corner (See https://docs.unity3d.com/ScriptReference/Rect.html for an example). You will have to convert camera hight from pixels to points using EditorGUIUtility.pixelsPerPoint and then subtract your offset.
Note that EditorGUIUtility.pixelsPerPoint is not constant. It is the most up to date value possible and my even be different on different connected displays.