Skip to content

NCanvas

NCanvas是用于渲染UI元素的核心组件。它提供了一个用于显示所有UI元素(如按钮、文本、图片等)的容器。在引擎中,所有的UI元素必须是Canvas的子元素,UI元素通过Canvas 进行渲染和显示。Canvas 组件的工作方式与渲染目标、坐标系、分辨率等密切相关,理解其工作原理对于开发高效的UI至关重要。

NCanvas是渲染UI的根组件,它负责管理UI元素的渲染顺序以及UI元素与屏幕空间的映射。每个Canvas 都有一个与之关联的渲染模式,可以决定 UI 元素的渲染方式和所处的空间。所有的UI元素都会根据其父Canvas 的设置来决定如何被绘制。

渲染模式:

  • Screen Space-Overlay:当渲染模式设置为 Screen Space - Overlay 时,Canvas 会将所有 UI 元素绘制在屏幕的最上面,通常用于显示 HUD、菜单等不与游戏世界交互的 UI 元素。这种渲染方式的特点是,UI 元素始终位于屏幕空间,与摄像机的视角无关。

    • 优点:简单且性能较好,适用于大部分UI。
    • 缺点:不能与3D世界中的物体交互。
  • Screen Space-Camera:当渲染模式设置为 Screen Space - Camera 时,Canvas 会根据一个指定的摄像机来渲染UI元素。UI会在摄像机的视图中渲染,因此它们会受到摄像机视角、距离和裁剪平面的影响。这通常用于渲染需要与3D世界交互的 UI(如游戏中的 3D 菜单)。

    • 优点:可以与 3D 场景交互,适合场景中动态生成的 UI。
    • 缺点:如果相机位置和 UI 元素位置不匹配,可能会导致 UI 元素被裁剪或显示异常。
  • World Space:在 World Space模式下,UI元素被作为3D对象渲染,具有世界空间中的位置、旋转和缩放属性。UI元素可以在3D场景中自由放置,并与其他 3D 对象进行交互。这种模式适用于创建3D UI、地图界面、虚拟按钮等。

    • 优点:能够与 3D 世界交互,适合虚拟现实(VR)和增强现实(AR)应用。
    • 缺点:UI 元素可能会被 3D 场景中的物体遮挡。
接口名称返回值接口含义
SetRenderModevoid设置渲染模式
GetRenderModeECanvasRenderMode获取渲染模式
SetScaleModevoid设置缩放模式(只有overlay和camera模式生效)
GetScaleModeEScaleMode获取缩放模式
SetScreenMatchModevoid设置屏幕缩放参照模式(只有overlay和camera渲染模式,并且缩放模式为ScaleMode::SMSCREENSIZE时设置生效)
GetScreenMatchModeEScreenMatchMode获取屏幕缩放参照模式
SetDesignResolutionvoid设置设计分辨率(只有屏幕缩放模式是ScaleMode::SMSCREENSIZE,此接口才生效)
GetDesignResolutionVector2获取设计分辨率
SetScaleFactorvoid设置缩放比例
GetScaleFactorfloat获取缩放比例
SetPlaneDistancevoid设置Canvas平面距离(只有camera模式生效)
GetPlaneDistancefloat获取平面距离
SetSortOrdervoid设置渲染顺序
GetSortOrderint获取渲染顺序
SetRenderCameravoid设置渲染相机(只有camera和world space渲染模式生效)
GetRenderCameraNCameraPtr获取渲染相机
SetNeedRayCastHitAllChildvoid设置是否拾取所有UI,如果多个UI叠加,拾取回调函数会返回所有被拾取到的UI列表
IsNeedCastRayHitAllChildbool获取是否拾取所有UI

设置和获取渲染模式

接口:
void SetRenderMode(ECanvasRenderMode renderMode);
ECanvasRenderMode GetRenderMode();

参数:
renderMode渲染模式枚举,包括RMOverlay,RMCamera,RMWorldSpace三种模式

描述:
通过上面接口可以指定canvas下UI子控件的渲染方式,有三种渲染模式可以指定,当渲染模式设置为 RMOverlay 时,NCanvas 会将所有UI元素绘制在屏幕的最上面,当渲染模式设置为 Screen Space - Camera 时,NCanvas 会根据一个指定的摄像机来渲染UI元素。当渲染模式设置为 RMWorldSpace 时,UI元素被作为3D对象渲染,具有世界空间中的位置、旋转和缩放属性。UI元素可以在3D场景中自由放置,并与其他 3D 对象进行交互。

代码示例:

cpp
void NCanvasTest::Start()
{
    auto canvasAct=GetNActor();
    auto canvasComp=canvasAct->GetComponent<NCanvas>();
    canvasComp->SetRenderMode(ECanvasRenderMode::RMWorldSpace);
    auto rendermode = canvasComp->GetRenderMode();
}

设置和获取自适应缩放属性

接口: void SetScaleMode(EScaleMode mode);
EScaleMode GetScaleMode();
void SetScreenMatchMode(EScreenMatchMode mode);
EScreenMatchMode GetScreenMatchMode();
void SetDesignResolution(Vector2& resolution);
Vector2 GetDesignResolution();
void SetScaleFactor(float factor);
float GetScaleFactor();

参数:

参数说明
EScaleMode缩放模式,按照SMPIXELSIZE像素大小,按照SMSCREENSIZE屏幕大小
EScreenMatchMode按照屏幕大小缩放的参照,SCREENWIDTH宽不变,高进行缩放,SCREENHEIGHT高不变,宽进行缩放
resolution按照屏幕大小缩放指定的屏幕参照分辨率
factor缩放比例因子

描述:
通过上述接口,可以灵活的修改canvas自适应属性得到想要的效果。

代码示例:

cpp
void NCanvasTest::Start()
{
    auto canvasAct=GetNActor();
    auto canvasComp=canvasAct->GetComponent<NCanvas>();
    canvasComp->SetRenderMode(ECanvasRenderMode::RMCamera);
    canvasComp->SetScaleMode(EScaleMode::SMSCREENSIZE);
    auto scalemode = canvasComp->GetScaleMode();
    canvasComp->SetScreenMatchMode(EScreenMatchMode::SCREENWIDTH);
    auto matchmode=canvasComp->GetScreenMatchMode();
    canvasComp->SetDesignResolution({1280,720});
    auto resolution = canvasComp->GetDesignResolution();
}

设置和获取平面距离

接口:
void SetPlaneDistance(float distance);
float GetPlaneDistance();

参数:
distance:设置Canvas平面距离

描述:
上面接口只有在camera渲染模式下,设置才生效,通过上面接口可是设置Canvas平面距离相机的距离。

代码示例:

cpp
void NCanvasTest::Start()
{
    auto canvasAct=GetNActor();
    auto canvasComp=canvasAct->GetComponent\<NCanvas>();
    canvasComp->SetRenderMode(ECanvasRenderMode::RMCamera);
    canvasComp->SetPlaneDistance(10);
    auto planedis = canvasComp->GetPlaneDistance();
}

设置和获取渲染顺序

void SetSortOrder(int order);
int GetSortOrder();

参数:
order:设置canvas渲染顺序,值越大渲染越靠后

描述:
world space和Camera渲染模式的canvas是放在一起排序的,Overlay渲染模式的canvas进行单独排序。 例如CanvasA是world space渲染模式,CanvasB是Camera渲染模式,CanvasA的sortOrder为1,CanvasB的sortOrder为0,那么CanvasB先渲染,CanavsA后渲染。 CanvasC和CanvasD都是Overlay渲染模式,CanvasC的sortOrder为0,CanvasD的sortOrder为1,那么CanvasC先渲染CanvasD后渲染,由于UI是不做深度比较的,类似半透明物体,所以后渲染的会挡住先渲染的UI。

代码示例:

cpp
void NCanvasTest::Start()
{
    auto canvasAct=GetNActor();
    auto canvasComp=canvasAct->GetComponent<NCanvas>();
    canvasComp->SetRenderMode(ECanvasRenderMode::RMCamera);
    canvasComp->SetSortOrder(10);
    auto sort = canvasComp->GetSortOrder();
}

设置和获取Canvas的渲染相机

接口: void SetRenderCamera(NCameraPtr camera);
NCameraPtr GetRenderCamera();

参数:
camera:设置渲染相机

描述:
通过上面接口可以设置Canvas渲染相机,设置渲染相机的接口只对Camera和World Space渲染模式生效,Overlay渲染模式底层有一个全局的正交相机作为其渲染相机。如果Camera和World Space渲染模式的Canvas不指定渲染相机,模式在编辑器下是编辑器相机进行渲染,在运行时是主相机进行渲染。

代码示例:

cpp
void NCanvasTest::Start()
{
    auto canvasAct=GetNActor();
    auto canvasComp=canvasAct->GetComponent<NCanvas>();
    canvasComp->SetRenderMode(ECanvasRenderMode::RMCamera);
    auto camera=NCamera::MainCamera();
    canvasComp->SetRenderCamera(camera);
    auto rendercamera=canvasComp->GetRenderCamera();
}

UI拾取调试接口

接口: void SetNeedRayCastHitAllChild(bool isNeed);
bool IsNeedCastRayHitAllChild();

参数:
isNeed:设置是否开启拾取所有能拾取到的UI

描述:
设置是否需要开启射线检测所有子控件,事件回调会返回所有选中控件列表,这个性能有影响,建议调试时使用。

代码示例:

cpp
void NCanvasTest::Start()
{
    auto canvasAct=GetNActor();
    auto canvasComp=canvasAct->GetComponent<NCanvas>();
    canvasComp->SetRenderMode(ECanvasRenderMode::RMCamera);
    canvasComp->SetNeedRayCastHitAllChild(true);
    auto isneed=canvasComp->IsNeedCastRayHitAllChild();
}