多层Unity3D物体模型穿透问题处理

这篇具有很好参考价值的文章主要介绍了多层Unity3D物体模型穿透问题处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文针对在一个界面中展示多层3D物体时遇到的模型穿透问题提出一些解决方案

如图,当我们想要在同一个界面中展示两层或以上3D物体时,有时会因为第一层物体材质上的 shader 渲染深度被破坏或其它原因导致第一层的物体穿透到第二层界面上来了。

在 Scene 视图中这三个橙色球体原本是在第二层黄色背景之下的:

unity可操作物体如何避免穿模,# Unity游戏开发笔记,unity,3d,游戏程序

但是在 Game 视图中我们发现那三个橙色球体居然跑到第二层黄色背景之上来了,这就出现了模型穿透问题:

unity可操作物体如何避免穿模,# Unity游戏开发笔记,unity,3d,游戏程序

由于以上两层3D物体的展示是在同一个界面上的,所以无法通过设置每个界面独立的 SortingLayer 来解决问题。此时可以通过设置第一层物体材质上的 shader 渲染深度解决问题:

首先在所有3D物体的 shader 文件中的 Properties 及 SubShader 中加入以下代码,其中的默认值可以根据实际需要进行更改:

Properties 中:
		_Stencil("Stencil ID", Float) = 2
		_StencilComp("StencilComp", int) = 6
		_StencilPass("StencilPass", int) = 0

SubShader 的 Pass 中:
			Stencil
			{
				Ref[_Stencil]
				Comp[_StencilComp]
				Pass[_StencilPass]
			}

加完部分效果如下图:

unity可操作物体如何避免穿模,# Unity游戏开发笔记,unity,3d,游戏程序

加完之后可以根据这三个枚举值,设置3D物体的渲染深度。具体用法与规则可以参考下这篇文章:Stencil 在 Unity 中的使用

具体解决思路是:首先在第二层界面上使用一个遮罩挡住第一层界面上的3D物体。这个遮罩使用的 shader 需要设置成大于第一层3D物体并同时小于第二层3D物体的渲染深度。比如说,假如第一层3D物体设置的 Stencil ID 、StencilComp、StencilPass (这个枚举值在有的地方也叫 Stencil Operation ) 三个枚举值分别为2、6、0,此时遮罩就可以设置成2、8、2,这样就可以在挡住第一层的3D物体的同时,不影响第二层的3D物体。具体效果如下:

第一层3D物体的 shader 渲染深度枚举值:

unity可操作物体如何避免穿模,# Unity游戏开发笔记,unity,3d,游戏程序

用于挡住第一层3D物体的遮罩 shader 渲染深度枚举值,其中 Always 表示 8 ,Replace 表示 2 :

unity可操作物体如何避免穿模,# Unity游戏开发笔记,unity,3d,游戏程序

第三层3D物体的 shader 渲染深度枚举值:

unity可操作物体如何避免穿模,# Unity游戏开发笔记,unity,3d,游戏程序

加载3D物体时设置当前实例 shader 渲染深度枚举值方法如下:(这种方式只会修改当前加载的物体,而不会对其它同样使用这个 shader 文件的对象产生影响)

	local skinnedMeshArray = go.transform:GetComponentsInChildren(typeof(UnityEngine.Renderer))
    if skinnedMeshArray.Length <= 0 then
        return
    end
    for i = 0, skinnedMeshArray.Length - 1 do
        local skinnedMesh = skinnedMeshArray[i]
        for j = 0, skinnedMesh.materials.Length - 1 do
            skinnedMesh.materials[j]:SetInt("_Stencil", 2)
            skinnedMesh.materials[j]:SetInt("_StencilComp", 6)
            skinnedMesh.materials[j]:SetInt("_StencilPass", 0)
        end
    end

如此一来,就可以实现分层管理3D物体,从而不出现模型穿透现象了。希望本文能够对你有所帮助,以上。文章来源地址https://www.toymoban.com/news/detail-782620.html

到了这里,关于多层Unity3D物体模型穿透问题处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • unity3d---物体加点击事件

    目录 1.给需要点击点物体加collider 2.层级面板加EventSystem 3. 相机加Physics Raycaster 4.物体单独响应点击事件 5.控制脚本实现各物体的点击事件 6.点击ui时屏蔽 物体点击事件 1.给需要点击点物体加collider   2.层级面板加EventSystem   3. 相机加Physics Raycaster 2d 3d按需添加   4.物体单独响

    2024年02月09日
    浏览(124)
  • Unity3D-场景中3D物体添加点击事件

    Unity3D - 场景中3D物体添加鼠标点击事件 鼠标点击3D物体触发,Unity从本质上来说有两种:一种是通过事件(event)触发,一种是通过射线(ray)判断穿过的物体触发。这两种触发的原理是不同的,不论哪种触发都必须满足触发的要求才可以,既然原理不同,触发的要求也不一样

    2024年02月08日
    浏览(86)
  • Unity3D实现给3D物体添加文本标签

    本教程将向您展示如何通过编写脚本来实现在Unity3D中给3D物体添加文本标签的通用方法。了解如何创建文本标签预制体,并通过编写脚本将其添加到3D物体上,以提供更多信息或标识物体。

    2024年02月04日
    浏览(178)
  • Unity3D相机围绕物体自由旋转

    写了一个相机围绕物体360°自由旋转的脚本,比较实用,分享出来给大家使用,配置如下: Hierarchy界面  LookPovit:为物体Auto Aircraft的中心空对象; AroundPovit:用于相机的空对象,作为父类,主要作用是为了保持与被观察物体的位置一致,可防止Auto Aircraft出现抖动而影响相机

    2024年02月11日
    浏览(66)
  • 【解决】FBX模型导入Unity3D贴图丢失问题

    1、选择“Materials” 2、Location选择“Use External Materials(Legacy)” 3、最后点击“Apply”  

    2024年02月15日
    浏览(59)
  • Unity3D 控制物体移动且自动旋转

    直接上代码(改脚本挂载到游戏物体上) 第三人称摄像机移动

    2024年02月15日
    浏览(83)
  • Unity3D_物体抛物线运动

    参考:Unity 贝塞尔曲线实现抛物线运动,投掷功能实现  用到了DOTween插件, 回想起之前不知道这个插件还在用协程和SmoothDamp做运动控制的自己仿佛是个哈批 路径绘制使用的LineRenderer

    2024年02月13日
    浏览(68)
  • Unity3D物体自动躲避障碍物

            2017.4.4f1         物体向前发射一个射线,检测到碰撞后,根据碰撞信息选择新的方向。最终结果如下。 通过发射虚拟胶囊体来检测碰撞api bool Physics.CapsuleCast (Vector3 point1, Vector3 point2, float radius, Vector3 direction, out RaycastHit hit, float maxDistance)  points参数如图所示,

    2023年04月24日
    浏览(67)
  • unity3D 鼠标滚轮实现物体的大小缩放

    鼠标滚轮响应函数是Input.GetAxis(\\\"Mouse ScrollWheel\\\"),函数返回值类型是float,向前滚是返回正数,向后滚是返回负数,且鼠标滚轮滑动单次函数返回值为0.1 利用返回值修改模型transform.localscale,实现模型缩放 鼠标滚轮一直向后滚,会看见模型逐渐变小,当变到很小到消失的时候,

    2024年02月08日
    浏览(81)
  • Unity3d 物体不动,碰撞触发不了的情况

    问题: 有一种情况,主角带刚体,主角站着不动。玩家站在陷阱上,陷阱的碰撞体 Toggle 之后, OnCollisionEnter 触发不了。 解决:盲猜玩家组件上才有刚体,而碰撞检测是刚体运动的时候,才进行检测的。

    2024年02月06日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包