在Unity中运行时更新着色器

时间:2015-02-12 21:58:26

标签: c# unity3d compute-shader

我有一个具有漫反射着色器的对象,并且在运行时我希望着色器切换到漫反射始终可见,但只有当单元位于名为障碍的图层中的特定对象后面时才会触发。

首先,我尝试使用以下代码切换对象着色器,​​并在检查器中更改着色器,但在播放期间不在游戏中。我尝试从资源中放置并调用着色器,并创建了单独的材质,但它不起作用。

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

Unit.renderer.material.shader = Shader.Find("Diffuse - Always visible");

至于其余部分,我正在考虑使用光线投影,但不知道如何处理。

提前致谢

1 个答案:

答案 0 :(得分:0)

  

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

对于触发器,如何处理它将取决于相机的移动方式。

要签入3D游戏,光线投射应该有效。因为某事是否落后于#34;其他东西取决于相机的观点,我个人会尝试这样的事情开始:

  1. 使用Camera.WorldToScreenPoint确定对象在屏幕上的位置。
  2. 使用Camera.ScreenPointToRay将其转换为您将通过物理引擎发送的光线。
  3. 使用Physics.Raycast并检查被点击的内容。如果它没有碰到有问题的物体,就会有一些东西出现在它前面。
  4. 根据您的目标,您可能需要检查不同的观点。如果您只是检查某个物体是否超过物体覆盖的一半,则在其中心进行单个光线投射可能就足够了。如果你想看看它是否完全闭塞,你可以尝试找到对象的四个近似角点并对它们进行光线投射。

    如果它是2D游戏或者相机始终处于固定角度(例如,在侧边滚动条中),则问题可能很多简单。将碰撞器添加到对象,并使用OnTriggerEnterOnTriggerEnter2D(以及相应的Exit函数)。只有当最小的重叠部分触发效果时才有效,并且仅当深度不真正重要时(例如在2D游戏中)才有效,因此你的对手实际上会相交。