家人们,图中画圈的两个材质是同一个mat,在unity里是怎么做到同一个mat有着不同的材质的


在代码中,切换材质会调用 RefreshUI 事件,而后对 mat 进行 SetScreenTexture()
// 节选
public void RefreshUI()
{
_needRefreshUI = false;
switch (State)
{
//这个环节设置sliden的材质,有一个叫做SlidenState.Ready的方法导向视频材质的处理
case SlidenState.Initial:
SetScreenTexture(DefaultScreen);
foreach (var material in _screens)
{
material.SetFloat(shaderPropertyContrast, _Contrast = 1f);
}
break;
case SlidenState.Loading:
SetScreenTexture(LoadingScreen);
foreach (var material in _screens)
{
material.SetFloat(shaderPropertyContrast, _Contrast = 1f);
}
break;
case SlidenState.Ready:
foreach (var material in _screens)
{
material.SetFloat(shaderPropertyContrast, _Contrast = 2.2f);
}
break;
case SlidenState.Error:
switch (Error)
{
case SlidenError.None:
/* NOP */
break;
case SlidenError.AccessDenied:
SetScreenTexture(AccessDeniedErrorScreen);
foreach (var material in _screens)
{
material.SetFloat(shaderPropertyContrast, _Contrast = 1f);
}
break;
case SlidenError.RateLimit:
SetScreenTexture(RateLimitErrorScreen);
foreach (var material in _screens)
{
material.SetFloat(shaderPropertyContrast, _Contrast = 1f);
}
break;
case SlidenError.InvalidURL:
SetScreenTexture(URLPlayerErrorScreen);
foreach (var material in _screens)
{
material.SetFloat(shaderPropertyContrast, _Contrast = 1f);
}
break;
case SlidenError.Player:
SetScreenTexture(URLPlayerErrorScreen);
foreach (var material in _screens)
{
material.SetFloat(shaderPropertyContrast, _Contrast = 1f);
}
break;
case SlidenError.Unknown:
default:
SetScreenTexture(URLPlayerErrorScreen);
foreach (var material in _screens)
{
material.SetFloat(shaderPropertyContrast, _Contrast = 1f);
}
break;
}
break;
}
}
这段代码是为了纠正材质对比度,咱发现在 SlidenState.Ready 的时候由AVPro输入的_MainTex会有肉眼可见的亮度失真,因为不知道该怎么做所以就直接在每次 RefreshUI 的时候纠正一次mat的对比度(严格来说不是对比度)以使画面回归预期亮度。
foreach (var material in _screens)
{
material.SetFloat(shaderPropertyContrast, _Contrast = 1f);
}
现在的情况是,每次刷新画面(比如触发加载事件),画面会正常工作并且将正确的图片覆盖至mat挂上的所有mesh,但是当关闭mesh对象并重新打开时(isActive),这些有着同一个mat的不同mesh会显示十分随机且混乱的 _MainTex
