C# 尝试从字符串创建材质-不再支持此操作
错误是:C# 尝试从字符串创建材质-不再支持此操作,c#,unity3d,C#,Unity3d,错误是: Trying to create a material from string - this is no longer supported. UnityEngine.Material:.ctor(String) Drawer:CreateLineMaterial() (at Assets/Flying Birds/Scripts/Drawer.cs:27) Drawer:Awake() (at Assets/Flying Birds/Scripts/Drawer.cs:46) 第27
Trying to create a material from string - this is no longer supported.
UnityEngine.Material:.ctor(String)
Drawer:CreateLineMaterial() (at Assets/Flying Birds/Scripts/Drawer.cs:27)
Drawer:Awake() (at Assets/Flying Birds/Scripts/Drawer.cs:46)
第27行是:
var mat = new Material(
第46行:
lineMaterial = CreateLineMaterial();
using System;
using UnityEngine;
using System.Collections.Generic;
public class Drawer: MonoBehaviour
{
public Material lineMaterial;
struct Line
{
public Vector3 from;
public Vector3 to;
public Color color;
public Line( Vector3 from, Vector3 to, Color color )
{
this.from = from;
this.to = to;
this.color = color;
}
}
static List<Line> lines = new List<Line>();
static Material CreateLineMaterial()
{
var mat = new Material(
@"Shader ""Lines/Colored Blended"" {
SubShader { Pass {
Blend SrcAlpha OneMinusSrcAlpha
ZWrite Off Cull Off Fog { Mode Off }
BindChannels {
Bind ""vertex"", vertex Bind ""color"", color }
}}}"
);
mat.hideFlags = HideFlags.HideAndDontSave;
mat.shader.hideFlags = HideFlags.HideAndDontSave;
return mat;
}
void Awake()
{
if( lineMaterial == null )
lineMaterial = CreateLineMaterial();
}
void OnPostRender()
{
lineMaterial.SetPass( 0 );
GL.Begin( GL.LINES );
foreach( var l in lines )
{
GL.Color( l.color );
GL.Vertex3( l.from.x, l.from.y, l.from.z );
GL.Vertex3( l.to.x, l.to.y, l.to.z );
}
GL.End();
}
void FixedUpdate()
{
lines.Clear();
}
public static void DrawLine( Vector3 from, Vector3 to, Color color )
{
lines.Add( new Line(from, to, color) );
}
public static void DrawRay( Vector3 from, Vector3 to, Color color )
{
lines.Add( new Line(from, from + to, color) );
}
}
lineMaterial=CreateLineMaterial();
使用制度;
使用UnityEngine;
使用System.Collections.Generic;
公共类抽屉:单一行为
{
公共材料线条材料;
结构线
{
公共向量3来自;
公共向量3到;
公共色彩;
公共线(矢量3从、矢量3到、颜色)
{
this.from=from;
这个;
这个颜色=颜色;
}
}
静态列表行=新列表();
静态材质CreateLineMaterial()
{
var mat=新材料(
@“着色器”“线条/彩色混合”{
子阴影{Pass{
混合SrcAlpha ONEMUSSRCALPHA
Z注销剔除雾{模式关闭}
绑定通道{
绑定“顶点”,顶点绑定“颜色”,颜色}
}}}"
);
mat.hideFlags=hideFlags.hideAndOntSave;
mat.shader.hideFlags=hideFlags.hideAndOntSave;
返回垫;
}
无效唤醒()
{
if(lineMaterial==null)
lineMaterial=CreateLineMaterial();
}
void OnPostRender()
{
lineMaterial.SetPass(0);
总帐开始(总帐行);
foreach(行中的变量l)
{
GL.颜色(l.颜色);
总图顶点3(l.from.x、l.from.y、l.from.z);
总图顶点3(长至x、长至y、长至z);
}
GL.End();
}
void FixedUpdate()
{
行。清除();
}
公共静态空白绘制线(矢量3 from、矢量3 to、彩色)
{
添加(新行(从、到、颜色));
}
公共静态void DrawRay(矢量3从、矢量3到、颜色)
{
添加(新行(从,从+到,颜色));
}
}
不再支持从着色器源字符串创建材质。改用着色器资源
来源:Unity Docs材质字符串构造函数现在已过时。可以使用着色器或材质构造函数
public Material(Material source);
public Material(Shader shader);
将着色器代码放入着色器文件中,然后使用shader.Find
查找它
var mat = new Material(Shader.Find("Transparent/Diffuse"));
我相信在更新版本的Unity中,无法从着色器字符串创建材质(这可以说是件好事) 您需要创建一个着色器资源,并将代码从
CreateLineMaterial
放在那里。然后你可以写一些类似的东西:
var mat = new Material(Shader.Find("Lines/Colored Blended"));
相反,在材质构造函数中。对于不熟悉着色器的用户,这是一个逐步解决方案
public Material(Material source);
public Material(Shader shader);
1)创建着色器文件
要创建新着色器,请使用主菜单或项目视图关联菜单中的资源>创建>着色器。着色器是一种类似于C#脚本的文本文件,使用Cg/HLSL和ShaderLab语言的组合编写
2)复制/粘贴此着色器代码
着色器的文件名并不重要。继续并将此着色器代码复制/粘贴到着色器中。(删除创建着色器文件时存在的所有旧代码)
3)在C#代码中查找着色器
现在,您可以编写自己喜欢的函数(使用Shader.Find()函数):
就这样!您的代码现在应该可以工作了
static Material CreateLineMaterial()
{
mat = new Material(Shader.Find("Lines/Colored Blended"));
mat.hideFlags = HideFlags.HideAndDontSave;
mat.shader.hideFlags = HideFlags.HideAndDontSave;
return mat;
}