Nez 中的 UI 在摄像头位置发生了更改后,判定出现问题的解决方法

Nez 中的 UI 在摄像头位置发生了更改后,判定出现问题的解决方法

一、背景

我们有一个这样的场景,其中左上角有一个按钮,我们发现我们摄像头的移动并不能影响UI的变化,但是判定的位置发生了变化,会感到明显的歪了。

image

代码如下:

    public class TestScene : Scene
    {
        public override void Initialize()
        {
            base.Initialize();

            var ui = CreateEntity("ui");
            var uiCanvas = ui.AddComponent<UICanvas>();
            uiCanvas.Stage.AddElement(new Button(ButtonStyle.Create(Color.White, Color.White, Color.Yellow))).SetSize(100, 100);

            Camera.Position = new Vector2(50, 50);
        }
    }

二、解决方法

我参考的 Nez 的 Sample 中的一些源码,你可以将你的 Scene 改造成这个样子:

   public class TestScene : Scene, IFinalRenderDelegate
   {
       public const int ScreenSpaceRenderLayer = 999;
       private ScreenSpaceRenderer _screenSpaceRenderer;

       public TestScene()
       {
           _screenSpaceRenderer = new ScreenSpaceRenderer(100, ScreenSpaceRenderLayer);
           FinalRenderDelegate = this;
       }

       public override void Initialize()
       {
           base.Initialize();

           var ui = CreateEntity("ui");
           var uiCanvas = ui.AddComponent<UICanvas>();
           uiCanvas.Stage.AddElement(new Button(ButtonStyle.Create(Color.White, Color.White, Color.Yellow))).SetSize(100, 100);
           uiCanvas.RenderLayer = 999;

           Camera.Position = new Vector2(50, 50);
       }

       #region IFinalRenderDelegate impls
       private Scene _scene;
       public void HandleFinalRender(RenderTarget2D finalRenderTarget, Color letterboxColor, RenderTarget2D source,
                                     Rectangle finalRenderDestinationRect, SamplerState samplerState)
       {
           Nez.Core.GraphicsDevice.SetRenderTarget(null);
           Nez.Core.GraphicsDevice.Clear(letterboxColor);
           Graphics.Instance.Batcher.Begin(BlendState.Opaque, samplerState, DepthStencilState.None, RasterizerState.CullNone, null);
           Graphics.Instance.Batcher.Draw(source, finalRenderDestinationRect, Color.White);
           Graphics.Instance.Batcher.End();

           _screenSpaceRenderer.Render(_scene);
       }

       public void OnAddedToScene(Scene scene)
       {
           _scene = scene;
       }

       public void OnSceneBackBufferSizeChanged(int newWidth, int newHeight)
       {
           _screenSpaceRenderer.OnSceneBackBufferSizeChanged(newWidth, newHeight);
       }

       #endregion
   }

这样判定就不会有问题了。

posted @ 2025-08-01 21:49  fanbal  阅读(9)  评论(0)    收藏  举报