Unity Camera 使用场景

本文介绍Unity中实现UI与3D物体正确渲染的方法,包括利用DepthOnly清除技术及RenderTexture来确保UI能准确遮挡3D内容,并讨论如何在两个UI层间正确显示3D特效。

ClearFlags:清除信息
Skybox:用天空盒清除一遍再画图
Solid Color:用固定颜色清除
Depth Only:清除深度信息
Don‘t Clear:不清除

Culling Mask:渲染层

Target Texture:将相机看到的内容渲染到一个rt上

这里记录下相机上常用的几个设置,以及使用场景

  1. Depth Only 双相机照射UI 和 3D物体
    UI相机的Culling Mask 设置为UI
    3D相机的Culling Mask 设置为除了UI意外的层级

    第一步:3D相机正常绘制 【相机depth值越大越后渲染】
    第二步:UI相机使用Depth Only 清除3D相机残留的深度缓存,但是不清除颜色缓存
    第三步:UI相机绘制UI信息,由于上一步清除了深度信息,所以UI相机绘制的内容会遮挡3D相机的内容

  2. 如何将3D物体(特效)设置在两个UI之间

    第一步:创建一个RenderTexutre 并把这个Rendertexture 给3D相机的Target Texture
    第二步:3D相机设置Culling Mask 为3D
    第三步:创建一个RawImage 并放到Canvas下并设置同一个RenderTexture
    原理:3Dcamera 看到的东西会渲染到RT上,RawImage保存RT上的内容并放到UI上渲染这里写图片描述

### Unity 中 `SendMessage` 方法的使用场景 #### 场景一:对象间解耦 当多个游戏对象需要相互通信时,可以利用 `SendMessage` 实现松散耦合的设计模式。这种方式允许开发者无需显式引用目标对象即可完成操作[^1]。 ```csharp using UnityEngine; public class Sender : MonoBehaviour { public GameObject targetObject; private void Start() { // 向目标对象发送名为 "ReceiveMessage" 的消息 targetObject.SendMessage("ReceiveMessage", "Hello from Sender!"); } } ``` 接收端代码如下: ```csharp using UnityEngine; public class Receiver : MonoBehaviour { public void ReceiveMessage(string message) { Debug.Log($"Received: {message}"); } } ``` 此示例展示了如何通过 `SendMessage` 将字符串数据传递给另一个对象的方法。 --- #### 场景二:动态事件触发 在某些情况下,可能无法提前预知哪个对象会响应某个事件。此时可以通过广播机制实现多对象监听同一事件的功能。例如,在玩家拾取物品时通知所有相关脚本更新状态。 ```csharp private void OnTriggerEnter(Collider other) { if (other.CompareTag("Item")) { // 广播消息至当前对象上的所有组件以及子对象 SendMessageUpwards("OnItemPicked"); } } ``` 上述代码片段中,`SendMessageUpwards` 是一种变体形式,它不仅作用于指定的目标对象本身,还会沿父级链路逐层传播直至根节点。 --- #### 场景三:跨平台交互支持 除了内部逻辑处理外,`SendMessage` 还可用于外部系统的集成工作,比如安卓原生插件与Unity引擎之间的通讯过程。Android 层可通过调用 `UnityPlayer.UnitySendMessage` 函数来触发生命周期内的任意公共函数[^2]。 假设有一个简单的例子——从Java侧传入一条日志信息到C#环境里打印出来,则对应的配置应如下所示: **Java部分** ```java import com.unity3d.player.UnityPlayer; ... String logContent = "This is a test."; UnityPlayer.UnitySendMessage("MainCamera", "LogFromAndroid", logContent); ``` **Unity部分** ```csharp void LogFromAndroid(string content){ Debug.Log(content); } ``` 这里需要注意的是,第一个参数代表接受者的名字(通常是挂载该脚本的游戏物件),第二个则是具体要执行的动作名称,最后一个是可选的数据负载项。 --- #### 性能考量与局限性分析 尽管如此便利,但在实际开发过程中也需注意性能开销问题。因为每次调用都会遍历整个继承树寻找匹配方法名的操作可能会带来额外负担,特别是在大规模复杂项目环境下尤为明显。因此建议仅限必要场合下采用此类技术手段,并考虑替代方案如观察者模式或者事件总线架构等更高效的方式解决同类需求。 --- ### 注意事项 - 如果找不到对应的方法则不会抛出异常而是静默失败。 - 只有标记为 `public` 或声明成无访问修饰符(默认即公开级别)才能被正常寻址成功。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值