C# 在Unity中运行时更新着色器

C# 在Unity中运行时更新着色器,c#,unity3d,compute-shader,C#,Unity3d,Compute Shader,我有一个具有漫反射着色器的对象,在运行时,我希望着色器切换为“漫反射始终可见”,但只有当单位位于名为“障碍物”的层中的特定对象后面时,才会触发此操作 首先,我尝试用以下代码切换对象着色器,着色器在inspector中更改,但在游戏中没有更改。我尝试从参考资料中放置并调用着色器,还创建了seprate材质,但它不起作用 下面是我在C中使用的代码# 至于其余的,我正在考虑使用光线投射,但不知道如何处理 提前谢谢 我现在只需要另一个概念,如果一个单位在一个对象后面,着色器就会改变 对于触发器,如何处理

我有一个具有漫反射着色器的对象,在运行时,我希望着色器切换为“漫反射始终可见”,但只有当单位位于名为“障碍物”的层中的特定对象后面时,才会触发此操作

首先,我尝试用以下代码切换对象着色器,着色器在inspector中更改,但在游戏中没有更改。我尝试从参考资料中放置并调用着色器,还创建了seprate材质,但它不起作用

下面是我在C中使用的代码#

至于其余的,我正在考虑使用光线投射,但不知道如何处理

提前谢谢

我现在只需要另一个概念,如果一个单位在一个对象后面,着色器就会改变

对于触发器,如何处理它将在很大程度上取决于您的相机如何移动

要查看3D游戏,光线投射应该可以工作。因为某个东西是否“在”另一个东西后面取决于相机的视角,我个人会尝试这样的开始:

  • 用于确定对象在屏幕上的位置
  • 用于将其转换为将通过物理引擎发送的光线
  • 使用并检查被击中的物体。如果它没有击中有问题的物体,它前面就有东西
  • 根据您的目标,您可能需要检查不同的点。如果您只是检查某个对象是否覆盖了一半以上,则在其中心执行单个光线投射可能就足够了。如果你想看看它是否被遮挡,你可以试着找到物体的四个近似角,然后对它们进行光线投射


    如果是2D游戏或相机始终处于固定角度(例如,在侧滚中),问题可能会简单得多。将碰撞器添加到对象,并使用或(以及相应的退出函数)。只有当最小的重叠点触发效果时,这种方法才有效,只有在深度并不重要的情况下(例如在2D游戏中)这种方法才有效因此,您的碰撞器将实际相交。

    修复了着色器的问题,其中子对象也需要以代码为目标:p我现在只需要另一个概念,如果一个单元位于对象后面,着色器将发生更改!可以考虑从资源文件夹中引用着色器吗?
    Unit.renderer.material.shader = Shader.Find("Diffuse - Always visible");