Nez 中的 UI 在摄像头位置发生了更改后,判定出现问题的解决方法
Nez 中的 UI 在摄像头位置发生了更改后,判定出现问题的解决方法
一、背景
我们有一个这样的场景,其中左上角有一个按钮,我们发现我们摄像头的移动并不能影响UI的变化,但是判定的位置发生了变化,会感到明显的歪了。

代码如下:
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
}
这样判定就不会有问题了。

浙公网安备 33010602011771号