Seb*_*rty 1 c# unity-game-engine unity3d-shaders
我按照这个视频创建了我的第一个着色器。溶解着色器视频链接
在协程中,我从对象中获取了材质的组件:
PalaceMaterial = palaceInstance.GetComponent <Renderer> () .material;
Run Code Online (Sandbox Code Playgroud)
我将参数设置为0:
PalaceMaterial.SetFloat ("_ CutoffHeight", 0);
Run Code Online (Sandbox Code Playgroud)
为了达到这个效果,我不得不修改参数“CuttoffHeight”,逐渐将其放入Update()中
PalaceMaterial.SetFloat("_CutoffHeight", Mathf.MoveTowards(PalaceMaterial.GetFloat("_CutoffHeight"), CutoffHeight, 100 * Time.deltaTime));
Run Code Online (Sandbox Code Playgroud)
我将其应用于所有对象。每 2 秒我实例化一个“不可见对象”(CutoffHeight 设置为 0),并在 Update() 中逐渐更改值。现在我想将此参数更改为同时使用此着色器的所有对象。我希望我说清楚了。
我的项目视频: 项目,Dissolve_Effect
我想同时更改第一个平台中的所有立方体中的“_CutoffHeight”参数,然后更改第二个平台中的所有立方体,等等。您有什么想法吗?
一般来说,您不应该另外使用GetFloat,而应该在本地存储该值并从那里计算它。
那么如果多个对象通过使用例如共享完全相同的材质,那么这应该可以工作
GetComponent<Renderer>().sharedMaterial.SetFloat(...);
Run Code Online (Sandbox Code Playgroud)
但这仅在渲染器中没有材质的多个实例时才有效。
有一种方法可以为我在此线程中遇到的所有着色器(具有该属性)及其相应实例(=材质)设置属性
要做到这一点,你必须
禁用相应属性的“暴露”。显然它只适用于未在检查器中公开的属性。
使用您可以在着色器资源本身的检查器中找到的生成的着色器属性 ID。
您还可以使用以下方式检索它Shader.PropertyToID
您还可以更改它以匹配您的实际参数名称。
使用着色器的全局设置方法,例如Shader.SetGlobalXY
例如为了设置Spec Brightness你会做的
Shader.SetGlobalFloat("Vector1_DD757871", value);
Run Code Online (Sandbox Code Playgroud)
因此,在您的情况下,您可能可以让一个控制器执行类似的操作
// Need this only if you have to get the initial value once
[SerializeField] private Material PalaceMaterial;
private float currentValue;
private string propertyId;
private void Awake()
{
propertyId = Shader.PropertyToID("_CutoffHeight");
currentValue = PalaceMaterial.GetFloat("_CutoffHeight");
}
private void Update()
{
currentValue = Maths.MoveTowards(currentValue, CutoffHeight, 100 * Time.deltaTime);
Shader.SetGlobalFloat(propertyId, currentValue);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8070 次 |
| 最近记录: |