在 Unity 中运行时更新着色器
Update Shader on Runtime in Unity
我有一个具有漫反射着色器的对象,在运行时我希望着色器切换到“漫反射始终可见”,但这应该仅在该单元位于名为障碍物的图层中的特定对象后面时触发。
首先,我尝试使用以下代码切换对象着色器,并且在检查器中更改了着色器,但在游戏过程中没有更改。我尝试从资源中放置和调用着色器,还创建了单独的材质,但它不起作用。
这是我在 C# 中使用的代码
Unit.renderer.material.shader = Shader.Find("Diffuse - Always visible");
至于其余部分,我正在考虑使用光线投射,但不确定如何处理。
提前致谢
I only need the other concept now where the shader changes if a unit is behind an object!
对于触发器,如何处理将在很大程度上取决于您的相机移动方式。
要签入 3D 游戏,光线投射应该可以。因为是否 "behind" 其他东西取决于相机的视角,我个人会尝试这样的开始:
- 使用 Camera.WorldToScreenPoint 找出您的对象在屏幕上的位置。
- 使用 Camera.ScreenPointToRay 将其转换为您将通过物理引擎发送的射线。
- 使用 Physics.Raycast 并检查命中的内容。如果它没有击中相关物体,则说明它前面有东西。
根据您的目标,您可能需要检查不同的要点。如果您只是检查某物是否被物体覆盖了一半以上,那么在其中心进行一次光线投射可能就足够了。如果你想看看它是否完全被遮挡,你可以尝试找到物体的四个近似角并对它们进行光线投射。
如果是 2D 游戏或者镜头始终处于固定角度(例如,在横向卷轴中),问题是潜在 简单多了。向对象添加碰撞器,并使用 OnTriggerEnter or OnTriggerEnter2D(以及相应的 Exit 函数)。这只有在最微小的重叠应该触发效果时才有效,并且只有在深度 真的 无关紧要(例如在 2D 游戏中)时它才有效,所以你的碰撞体实际上会相交。
我有一个具有漫反射着色器的对象,在运行时我希望着色器切换到“漫反射始终可见”,但这应该仅在该单元位于名为障碍物的图层中的特定对象后面时触发。
首先,我尝试使用以下代码切换对象着色器,并且在检查器中更改了着色器,但在游戏过程中没有更改。我尝试从资源中放置和调用着色器,还创建了单独的材质,但它不起作用。
这是我在 C# 中使用的代码
Unit.renderer.material.shader = Shader.Find("Diffuse - Always visible");
至于其余部分,我正在考虑使用光线投射,但不确定如何处理。
提前致谢
I only need the other concept now where the shader changes if a unit is behind an object!
对于触发器,如何处理将在很大程度上取决于您的相机移动方式。
要签入 3D 游戏,光线投射应该可以。因为是否 "behind" 其他东西取决于相机的视角,我个人会尝试这样的开始:
- 使用 Camera.WorldToScreenPoint 找出您的对象在屏幕上的位置。
- 使用 Camera.ScreenPointToRay 将其转换为您将通过物理引擎发送的射线。
- 使用 Physics.Raycast 并检查命中的内容。如果它没有击中相关物体,则说明它前面有东西。
根据您的目标,您可能需要检查不同的要点。如果您只是检查某物是否被物体覆盖了一半以上,那么在其中心进行一次光线投射可能就足够了。如果你想看看它是否完全被遮挡,你可以尝试找到物体的四个近似角并对它们进行光线投射。
如果是 2D 游戏或者镜头始终处于固定角度(例如,在横向卷轴中),问题是潜在 简单多了。向对象添加碰撞器,并使用 OnTriggerEnter or OnTriggerEnter2D(以及相应的 Exit 函数)。这只有在最微小的重叠应该触发效果时才有效,并且只有在深度 真的 无关紧要(例如在 2D 游戏中)时它才有效,所以你的碰撞体实际上会相交。