Unity项目使用静态图片做背景

转自:https://segmentfault.com/a/1190000008505014

此方法可以解决UGUI使模型显示在背景UI之前的问题。

问题

Unity中常见的背景设置为固定颜色或者天空盒,如下图所示:

 

天空盒可以设置背景材质,但是背景跟跟随摄像机镜头的变化而运动,不能做到固定下来

思路

使用两个摄像机,一个固定观察指定的图片,另一个观察三维场景,通过分图层来把两个摄像机的内容叠加显示在Game视图中

解决方案

新建摄像机

新建一个摄像机,命名为BackgroundCamera

新建Ui图片

新建一个Canvas,命名为BackgroundCavas,其下再新建一个UI Image,命名为BackgroundImage

新建图层

先任意选中一个对象,新建一个Layer,

命名为Background,

 

并且把刚才新建的相机,Canvas和Image都放到这个Layer中

设置相机属性

先设置背景相机(BackgroundCamera),

再设置主相机,在Culling Mask中去掉Background图层

设置背景图片和背景相机的关系

选中BackgroundCanvas,设置其属性

注意Render Mode选择 Sceen Space - Camera, 然后Render Camera选择BackgroundCamera

设置背景图片

把图片类型设置为平铺,并且把图片的长宽设置为足够大(超出屏幕分辨率范围即可)

方法二:

建一个背景canvas,设置好背景,canvas的RenderMode调成ScreenSpace-Camera,然后把主摄像机赋值到RenderCamera即可。

注意此方法在多场景叠加下需要修改一下,在叠加的场景上得到这个背景canvas,然后再叠加场景中某脚本start方法中加入以下代码:

    private Canvas BGcanvas;
	// Use this for initialization
	void Start () {
        //得到主场景的背景canvas
        BGcanvas = GameObject.Find("BGCanvas").GetComponent<Canvas>();
        BGcanvas.worldCamera = Camera.main;
	}
	

 

要在Unity中实现固定位置播放视频,可以按照以下步骤操作。这种方法确保视频在指定的三维世界位置播放,并且不受摄像机移动的影响。以下是详细的指南: ### 实现思路概述: 1. **确定视频显示载体**:可以选择使用UI元素(如`RawImage`)或3D模型(如平面`Plane`)作为视频的显示媒介。 2. **载和播放视频**:利用Unity提供的`VideoPlayer`组件来处理视频文件的载和播放。 3. **保持视频位置不变**:通过设置正确的空间锚点及坐标系统,使视频始终停留在期望的位置。 ### 步骤详解: #### 一、创建固定位置的视频显示载体 ##### 方法A:使用World Space UI (`RawImage`) 适用于希望视频像普通游戏界面一样融入场景的情况。 - 新建一个空的游戏对象,命名为 `FixedVideoScreen` - 给它挂载一个Canvas组件,将Render Mode设置为“World Space”;同时调整Canvas的位置使其出现在你想放置视频的地方 - 在此Canvas下添一个Image控件(如Panel),再在其内部嵌套一个带有`RawImage`组件的对象,用来渲染视频帧 ##### 方法B:使用3D模型 (如`Plane`) + Shader/Texture 更接近真实世界的屏幕效果。 - 拖入或创建一个平面(Plane)、立方体(Cube)等几何形状代表物理显示器 - 设置适当的材质(Material)给这个物体,如果需要透明背景的话则选用支持alpha通道的着色器(shader) - 准备好用于接收视频纹理的目标Material槽位 #### 二、集成并配置 VideoPlayer 组件 无论选择上述哪种方法,接下来都需要引入`VideoPlayer`组件进行视频管理: - 确保项目已包含所需的依赖包(`com.unity.videoplayer`) - 分别向每个负责显示视频的画面层 GameObject 上附 `VideoPlayer` 组件 - 配置其基本选项: - Source Type: 设定为「From Clip」、「URL」或「Streaming Assets」依据实际情况选取 - Play on Awake: 开启此项可以让视频随着场景启动自动开始播放 - Loop: 根据需求开启循环播放功能 对于 Method A (UI路径),还需额外连接 `Target Texture` 到对应的 `RawImage` 的 Material texture slot 中去。 #### 三、验证与优化 完成以上配置后运行程序检查结果是否符合预期: - 移动主摄像机会发现视频依然停驻在原始设定好的位置上 - 对于可能出现的问题,例如性能消耗过大导致掉帧等问题,可以从压缩编码格式、分辨率适配等方面着手改进 --- ### 示例代码片段 假设你选择了Method B并通过脚本控制,则可以在 C# 脚本中编写类似下面这样的初始化逻辑: ```csharp using UnityEngine; using UnityEngine.Video; public class FixedPositionVideo : MonoBehaviour { public string videoPath; // 视频路径,如果是本地资源填写相对路径;若是网络地址则完整URL private VideoPlayer _videoPlayer; void Start(){ InitializeVideo(); } private void InitializeVideo(){ _videoPlayer = gameObject.AddComponent<VideoPlayer>(); // 关联当前Game Object关联的一个Renderer所使用的材质的第一个贴图槽 var rend = GetComponent<Renderer>().material.mainTexture; _videoPlayer.renderMode = VideoRenderMode.MaterialOverride; _videoPlayer.targetMaterialProperty = "_MainTex"; //_MainTex是默认diffuse贴图名称,请按需替换 if (!string.IsNullOrEmpty(videoPath)){ _videoPlayer.url = videoPath; _videoPlayer.Prepare(); // 异步准备解码 while (!_videoPlayer.isPrepared){ Debug.Log("Preparing..."); yield return null; //等待准备完毕 } _videoPlayer.Play(); } else{ Debug.LogError("No valid video path provided."); } } } ``` > 注意事项: > >- 如果视频较大可能会造成初始载时间较长,可考虑提前缓存预下载等方式缓解冲击。 >- 当前示例假定只有一个材质属性名"_MainTex", 若有多个请根据具体情况进行匹配。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值