使用渲染纹理将另一个场景的内容显示为纹理
验证环境
- 窗户
-
- 视窗 11
- 统一编辑器
-
- 2021.3.3f1
- 输入系统包
-
- 1.3.0
此提示的先决条件
作为此提示描述的前提,已预先进行了以下设置。
起先
渲染纹理允许您将绘图写入纹理而不是屏幕。 这允许您在游戏执行期间自由生成纹理,而无需提前准备纹理图像。
您还可以写入每帧动态更改的渲染纹理,例如,将主摄像机的不同图像投影到游戏中存在的显示器上。
准备映像
使用渲染纹理时,不需要准备图像,但可以将其准备为示例,以使绘制结果更易于理解。
创建渲染纹理
从项目创建资产。 从“创建”中,选择“渲染纹理”。
名称可以是任意的。 由于此时未直接从外部指定 NewRenderTexture
名称,因此保留为 。
选择渲染纹理并从检查器中指定其大小。 由于渲染纹理是绘图区域,因此必须指定大小。 这次,我想写一个单独创建的场景,所以我将纵横比设置为 16:9。
设置渲染纹理目标
从最初创建的场景的层次结构中选择“UI”>“原始图像”。 显示此对象中渲染纹理的内容。 它是UI的一个对象,但你需要的是一个“原始图像”组件,可以将其设置为另一个对象。
原始图像已被放置。 因为它是 UI 对象,所以它被放置在画布中。 我还没有设置任何东西,所以我只得到一个白色矩形。
我们希望比例彼此相等,因此我们将 RawImage 对象的大小设置为与渲染纹理相同。 如果保持纵横比不变,即使更改大小也只会缩放绘制结果,但如果更改纵横比,则绘制结果将垂直或水平压碎。
RawImage 对象的原始图像组件具有“纹理”,因此请在此处设置刚刚创建的渲染纹理。 渲染纹理的内容仍然是空的,因此它们在视图中是透明的。
创建渲染纹理绘图内容的场景
接下来,创建一个新场景以创建要在渲染纹理中绘制的内容。 从菜单中选择文件,然后选择新建场景。
由于此示例是 2D,因此您还将选择 2D 场景。
在场景文件夹中创建它。 SampleSceneTexture
将名称保留为 。
创建场景后,适当地放置对象。 您所要做的就是确保您知道渲染纹理的内容。 为了确认没有绘制任何突出在相机外部的东西,还会在相机框架附近放置一个精灵。
如果对象重叠,则对象的上下文将是不确定的,因此如果您有背景,请降低背景图层的顺序。
选择“主相机”后,在“目标纹理”中设置渲染纹理。 这会导致在渲染纹理中绘制绘图。
删除设置为“主摄像机”的“音频侦听器”组件。 渲染纹理所需的只是绘图,因此不需要音频侦听器。 如果在运行时有多个“音频侦听器”,将显示警告。
顺便说一下,如果在此状态下运行渲染纹理的场景,屏幕上不会显示任何内容。 这是因为您是在渲染纹理上绘制的。 如果要在屏幕上检查它,请删除“目标纹理”,然后执行它。
图层设置
在此示例中,您必须同时移动两个场景,但如果按原样移动它们,则要在渲染纹理中绘制的内容也将显示在主屏幕上,因此不会单独绘制图层。
首先,从编辑器右上角的图层中选择“编辑图层”。
名称和位置是任意的,但在这里我们将添加一个名为 RenderTarget
.
添加图层后,打开渲染纹理的场景,选择要绘制的所有对象,然后将图层值更改为刚刚创建的 RenderTarget
图层值。
SampleSceneTexture
这将结束场景的编辑,因此请保存它。
显示渲染纹理
SampleScene
打开场景后,通过拖放场景将其添加到层次结构 SampleSceneTexture
中。
然后,层次结构中应该有两个场景,并且场景的内容应该显示在 SampleSceneTexture
屏幕上。
SampleSceneTexture
场景的内容令人不安,因此请单击层次结构中场景 SampleSceneTexture
的眼睛图标。
SampleSceneTexture
这将隐藏场景中的对象,并且仅显示场景 SampleScene
的内容。
顺便说一下,由于所有渲染纹理设置都已完成,SampleScene
因此渲染纹理的内容应显示在场景中放置的原始图像中。
但是,眼睛图标隐藏只是一个设置,使其在编辑器上不可见,因此如果您按原样运行SampleSceneTexture
游戏,场景的内容也会显示在屏幕上。
SampleScene
然后选择场景Main Camera
并取消选中RenderTarget
检查器中的Camera
剔除蒙版。
这可以防止在游戏运行时显示RenderTarget
图层中的对象。
尝试运行游戏。 它应该按预期显示。
尝试移动渲染纹理
但是,在这种状态下,很难知道它是否真的用作渲染纹理或只是将图像显示为裁剪,因此让我们移动它。
内容可以是任何东西,但在这里我们将设置移动以自动旋转精灵。 创建一个 SelfRotate
脚本并将其创建为 .
在这里,我们将包括一个一点一点地旋转自己的简单过程。
using UnityEngine;
public class SelfRotate : MonoBehaviour
{
// 更新はフレームごとに 1 回呼び出されます
void Update()
{
transform.Rotate(0, 0, 0.1f);
}
}
创建脚本后,将越来越多的内容附加到要旋转的对象。
然后运行游戏,看看它是否旋转。 我想你可以看到对象在渲染纹理中移动。
如何同时移动多个场景
在这里,我们创建了一个简单的例子,以便我们从一开始就运行两个场景,但在真正的游戏中,在许多情况下,您必须从单个场景开始。 在这种情况下,我认为您必须在场景开始时动态添加场景以使其成为多个场景。
有关如何添加场景的说明,请参阅“添加场景”。
基本上, SceneManager.LoadScene("<シーン名>", LoadSceneMode.Additive);
呼叫应该可以解决大部分问题。
如何在不使用图层的情况下防止渲染纹理的内容显示在主屏幕上
渲染纹理的内容显示在主屏幕上,因为主场景和渲染纹理场景位于同一位置。 因此,如果将渲染纹理的内容移动到主场景中从未显示的位置,则它将不会显示在主屏幕上。 例如,可以将渲染纹理对象或摄像机移动到 (-10000, -10000) 位置。 这样,图层设置就没有必要了。
当您想要在一个场景中完成渲染纹理的内容而不将其划分为不同的场景时
这是使用与没有层的先前方法相同的技术完成的。 您可以将渲染纹理显示的内容移动到主摄像机上永远不会显示的内容。 与分离场景的方法不同的是,您需要放置两个摄像机,但除此之外,您将基本上具有与分离场景的方法相同的设置。
如果要将 3D 游戏中从不同角度捕获的内容捕获为渲染纹理
这个技巧没有过多地谈论3D,因为它专注于2D,但方法基本相同。 由于您是从多个视角投影单个 3D 空间,因此不需要有两个以上的场景。 您所要做的就是根据需要放置任意数量的摄像机,将绘制目标设置为渲染纹理,并设置显示渲染纹理的位置。