Unity Canvas的三种模式

news2024/9/25 7:13:51

一、简介:

Canvas的Render Mode一共有三种模式:Screen Space -OverLay、Screen Space-Camera、World Space

  1. Screen Space - Overlay(屏幕空间 - 覆盖): 这是最简单的 Canvas 渲染模式。UI 元素在这个模式下将渲染在屏幕上的最顶层,不受场景中其他物体的影响。UI 元素的位置是相对于屏幕的,而不是相对于世界空间的。这意味着即使场景中有相机移动或旋转,UI 元素也会始终保持在屏幕的固定位置。这种模式适用于大多数 2D 游戏和简单的用户界面。

  2. Screen Space - Camera(屏幕空间 - 相机): 在这种模式下,UI 元素仍然是渲染在屏幕上的,但是相对于一个指定的摄像机。UI 元素的位置将受到这个相机的视野和投影的影响。这意味着 UI 元素的位置是相对于摄像机的,而不是固定在屏幕上。这种模式适用于需要在 3D 场景中显示 UI 的情况,例如在游戏中显示玩家血条或交互提示。

  3. World Space(世界空间): 在这种模式下,UI 元素被视为场景中的普通对象,它们的位置是相对于世界空间的。UI 元素可以随着场景中的物体移动、旋转和缩放,并与场景中的其他对象进行交互。这种模式适用于需要将 UI 元素作为游戏中的物体进行交互的情况,例如在游戏世界中显示交互式地图或可拾取的物品。

 二、参数与例子:

1、Screen Space - Overlay(屏幕空间 - 覆盖)

参数:

当 RenderMode 为 Screen Space - Overlay时,Canvas的其它参数包括:

Pixel Perfect:UI元素精确到像素对齐,边缘更清晰,但是在UI调整和适配时会有更大的计算量。

Sort Order:Canvas 的深度。存在多个Canvas时,如果RenderMode 都为 Screen Space - Overlay时,Sort Order 值更大的Canvas会遮盖住 Sort Order 值小的 Canvas。

注:多个 Canvas 深度取值相等时,Hierarchy 视图中后面的 Canvas 显示在下,这一点与 UI 元素(如Image的规则相反)

Canvas 的 Screen Space - Overlay 模式是 Unity 引擎中一种常见的 UI 渲染模式,它将 UI 元素渲染在屏幕空间的最上层。在这种模式下,UI 元素的位置是相对于屏幕的而不是相对于世界空间的。

当你点击屏幕时,如果想要将某个 UI 元素移动到点击的位置。在这种情况下,你可以使用输入系统的 Input.mousePosition 属性来获取点击的屏幕位置。然后,为了将 UI 元素移动到点击的位置,需要将这个屏幕位置转换成 UI 元素的本地坐标系。

在屏幕空间中,屏幕的中心点是 (0, 0),x 轴的范围是从屏幕的左边到右边,y 轴的范围是从屏幕的底部到顶部。但是,UI 元素的坐标是相对于 Canvas 的,Canvas 的中心点也是 (0, 0)。因此,为了将屏幕坐标转换成 Canvas 上的坐标,需要做一些调整。

通常情况下,会将鼠标点击位置的屏幕坐标减去屏幕宽度的一半,以使屏幕的中心对齐到 Canvas 的中心。这样会使屏幕坐标系的原点移动到 Canvas 的中心,使得点击位置的原点为 Canvas 的中心。同样,也需要将屏幕坐标的 y 值减去屏幕高度的一半,以保持坐标系的对称性。
代码示例:

using System;
using UnityEngine;

public class MoveToClickPoint : MonoBehaviour
{
    GUIStyle labelStyle;
    Vector3 screenPosition = new Vector3(Screen.width/2, Screen.height/2, 0);
    private float moveSpeed = 50f; // 主角移动速度
    private Vector3 targetPosition; // 目标位置
    private bool isMoving = false; // 是否正在移动
    void Update()
    {
        
        // 如果点击了屏幕,并且没有正在移动,则设置目标位置为点击点,并开始移动
        if (Input.GetMouseButtonDown(0) && !isMoving)
        {
            SetTargetPosition();
            isMoving = true;
        }

        // 如果正在移动,则朝目标位置移动
        if (isMoving)
        {
            MovePlayer();
        }
    }
    // 设置目标位置为点击点
    void SetTargetPosition()
    {
        // 鼠标左键点击,点击位置是屏幕坐标,坐标起点在左下角,所以UI的实际坐标要分别减去屏幕坐标的高度,和宽度的一半
        targetPosition = Input.mousePosition - screenPosition;
    }
    
    // 主角朝目标位置移动
    void MovePlayer()
    {
        transform.localPosition = Vector3.MoveTowards(transform.localPosition, targetPosition, moveSpeed * Time.deltaTime); // 角色向前移动到点击位置(与clickPosition在同一平面,transform)
        // 如果到达目标位置,则停止移动
        if (transform.localPosition == targetPosition)
        {
            isMoving = false;
        }
    }
    


    private void Awake()
    {
        labelStyle = new GUIStyle();
        labelStyle.fontSize = 50;
    }

    private void OnGUI()
    {
        GUI.Label(new Rect(10, 10, 200, 50), "屏幕坐标:" + Input.mousePosition,labelStyle);
        GUI.Label(new Rect(10, 70, 200, 50), "UI坐标:" + (Input.mousePosition - screenPosition));
    }
}
2、Screen Space - Camera(屏幕空间 - 相机)

Screen Space - Camera:与Screen Space - Overlay相同的是,两种模式都是屏幕空间的渲染模式,不同的是,Screen Space - CameraUI 元素的位置​​​​​虽不直接受到场景中其他物体的影响,但受到指定摄像机的视野和投影的影响。如果场景中的物体移动或旋转,UI 元素相对这些物体的相对位置可能会发生变化,但它们仍然相对于指定摄像机进行渲染,可以说相对相机是不变的,也就是说在屏幕中的位置是不变的,所以适用于3D游戏中的2D的UI。看一个效果:
未完待续...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1542388.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用amd架构的计算机部署其他架构的虚拟机(如:arm)

1 下载quem模拟器 https://qemu.weilnetz.de/w64/2 QEMU UEFI固件文件下载(引导文件) 推荐使用:https://releases.linaro.org/components/kernel/uefi-linaro/latest/release/qemu64/QEMU_EFI.fd3 QEMU 安装 安装完成之后,需要将安装目录添加到环境变…

flutter3_douyin:基于flutter3+dart3短视频直播实例|Flutter3.x仿抖音

flutter3-dylive 跨平台仿抖音短视频直播app实战项目。 全新原创基于flutter3.19.2dart3.3.0getx等技术开发仿抖音app实战项目。实现了类似抖音整屏丝滑式上下滑动视频、左右滑动切换页面模块,直播间进场/礼物动效,聊天等模块。 运用技术 编辑器&#x…

C语言字节对齐关键字#pragma pack(n)的使用

0 前言 在进行嵌入式开发的过程中,我们经常会见到对齐操作。这些对齐操作有些是为了便于实现指针操作,有些是为了加速对内存的访问。因此,学习如何使用对齐关键字是对于嵌入式开发是很有必要的。 1 对齐规则 1.0 什么叫做对齐 众所周知&a…

微服务(基础篇-003-Nacos集群搭建)

目录 Nacos集群搭建 1.集群结构图 2.搭建集群 2.1.初始化数据库 2.2.下载nacos 2.3.配置Nacos 2.4.启动 2.5.nginx反向代理 2.6.优化 视频地址: 06-Nacos配置管理-nacos集群搭建_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1LQ4y127n4?p29&…

操作系统究竟是什么?在计算机体系中扮演什么角色?

操作系统究竟是什么?在计算机体系中扮演什么角色? 一、操作系统概念二、操作系统如何管理软硬件资源2.1 何为管理者2.2 操作系统如何管理硬件 三、系统调用接口作用四、用户操作接口五、广义操作系统和狭义操作系统 一、操作系统概念 下面是来自百度百科…

Springboot做分组校验

目录 分组校验 Insert分组 Upload分组 测试接口 测试结果 添加测试 更新测试 顺序校验GroupSequence 自定义分组校验 自定义分组表单 CustomSequenceProvider 测试接口 测试结果 Type类型为A Type类型为B 总结: 前文提到了做自定义的校验注解&#xff…

React高阶组件(HOC)

高阶组件的基本概念 高阶组件(HOC,Higher-Order Components)不是组件,而是一个函数,它会接收一个组件作为参数并返回一个经过改造的新组件: const EnhancedComponent higherOrderComponent(WrappedCompo…

小游戏-扫雷

扫雷大多人都不陌生,是一个益智类的小游戏,那么我们能否用c语言来编写呢, 我们先来分析一下扫雷的运行逻辑, 首先,用户在进来时需要我们给与一个菜单,以供用户选择, 然后我们来完善一下&#…

解决方案Please use Oracle(R) Java(TM) 11, OpenJDK(TM) 11 to run Neo4j.

文章目录 一、现象二、解决方案 一、现象 当安装好JDK跟neo4j,用neo4j.bat console来启动neo4却报错: 部分报错信息: Starting Neo4j. WARNING! You are using an unsupported Java runtime. Please use Oracle Java™ 11, OpenJDK™ 11 t…

Rust下载安装、卸载、版本切换、创建项目(包含指定版本的)

先声名一下,下面所说的版本号为xxxxx-x86_64-unknown-linux-gnu中xxxxx的部分。 下载安装 下载最新版本的Rust: curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh info: downloading installer重启shell 或者 按照提示 执行命令让环境变…

Day56-LNMP架构扩展为集群模式实战精讲

Day56-LNMP架构扩展为集群模式实战精讲 1. 企业级标准部署知乎产品wecenter1.1 部署知乎软件Wecenter 2. 企业级迁移数据库到独立服务器2.1 为什么要进行数据库的拆分2.2 数据库拆分架构演变过程,如下图所示2.3 数据库拆分环境规划2.4 数据库拆分架构详细步骤2.4 we…

Kafka broker

1. zk中存储的kafka信息 /kafka/brokers/ids存储了在线的broker id。 /kafka/brokers/topics/xxx/partitions/n/state存储了Leader是谁以及isr队列 /kafka/controller辅助Leader选举,每个broker都有一个controller,谁先在zk中注册上,谁就辅助…

第八节:深入讲解SMB中的Http组件

一、概述 Http组作是SMB中的核心组件之一,在第七节中讲解了如何简洁的进行web程序部署和运行,这只是它的功能之一。在本节中,我们将介绍Http组件的重要属性。 二、请求头Request 1、支持方法 支持POST、GET、PUT、DELETE、OPTIONS等方法&a…

二十、软考-系统架构设计师笔记-真题解析-2020年真题

软考-系统架构设计师-2020年上午选择题真题 考试时间 8:30 ~ 11:00 150分钟 1.按照我国著作权法的权利保护期,( )受到永久保护。 A.发表权 B.修改权 C.复制权 D.发行权 解析: 答案: 2.假设某计算机的字长为32位&a…

爬虫入门系列-HTML基础语法

🌈个人主页:会编辑的果子君 💫个人格言:“成为自己未来的主人~” HTML基础语法 bs4解析比较简单,但是呢,首先你需要了解一丢丢的html知识,然后再去使用bs4去提取,逻辑和编写难度就会非常简…

Git的原理和使用(四)

目录 远程操作 理解分布式版本控制系统 远程仓库 新建远程仓库 克隆远程仓库 向远程仓库推送 拉取远程仓库 配置Git 忽略特殊文件 为命令配置别名 标签管理 理解标签 创建标签 操作标签 远程操作 理解分布式版本控制系统 1、每个人的电脑上都是一个完整的版本库…

BUG未解之谜01-指针引用之谜

在leetcode里面刷题出现的问题,当我在sortedArrayToBST里面给root赋予初始值NULL之后,问题得到解决! 理论上root是未初始化的变量,然后我进入insert函数之后,root引用的内容也是未知值,因此无法给原来的二叉…

如何使用半群、群论及格理论研究人机协同

在数学中,半群、群论和格理论都是重要的代数结构和数学分支,它们分别研究了不同类型的代数系统和结构。简单介绍一下它们的基本概念: 1、半群(Semigroup): 半群是一个集合,配备了一个二元运算&a…

Linux:文件增删 文件压缩指令

Linux:文件增删 & 文件压缩指令 文件增删touch指令mkdir指令cp指令rm指令rmdir指令 文件压缩zip & unzip 指令tar指令 文件增删 touch指令 功能:touch命令参数可更改文档或目录的日期时间,包括存取时间和更改时间,或者新…

UG NX二次开发(C#)-通过曲线组生成NURBS曲面

文章目录 1、前言2、UG NX中通过曲线组生成NURBS曲面的操作3、采用NXOpen C#方法的源代码1、前言 在UG NX中,曲线、曲面的操作使用比较多,对于创建NURBS曲面,可以通过曲线组来生成,本文以NXOpen C#的方法实现通过曲线组生成NURBS曲面的功能。对于UG NX二次开发感兴趣或者有…