错误是:
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) );
}
}
答案 0 :(得分:4)
Material string构造函数现已过时。您可以使用着色器或材质构造函数。
public Material(Material source);
public Material(Shader shader);
将着色器代码放在着色器文件中,使用Shader.Find
来查找它。
var mat = new Material(Shader.Find("Transparent/Diffuse"));
答案 1 :(得分:1)
我相信没有办法在较新版本的Unity中使用着色器字符串创建材质(这可能是好事)。
您需要创建一个Shader资源,并将代码从CreateLineMaterial
放到那里。然后你可以写下这样的东西:
var mat = new Material(Shader.Find("Lines/Colored Blended"));
而不是在Material构造函数中。
答案 2 :(得分:0)
不再支持从着色器源字符串创建材质。请改用Shader资源。 https://docs.unity3d.com/Manual/class-Shader.html
来源:Unity Docs https://docs.unity3d.com/ScriptReference/Material-ctor.html
答案 3 :(得分:0)
这是针对不熟悉着色器的用户的分步解决方案。
1)创建着色器文件
要创建新的着色器,请从主菜单或“项目视图”上下文菜单中使用 资产>创建>着色器 。着色器是类似于C#脚本的文本文件,并以Cg / HLSL和ShaderLab语言的组合编写。
2)复制/粘贴此着色器代码
着色器的文件名无关紧要。继续并将此着色器代码复制/粘贴到您的着色器中。 (删除创建着色器文件时存在的所有旧代码)
Shader "Lines/Colored Blended" {
SubShader { Pass {
Blend SrcAlpha OneMinusSrcAlpha
ZWrite Off Cull Off Fog { Mode Off }
BindChannels {
Bind "vertex", vertex Bind "color", color }
} } }
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;
}
就是这样!您的代码现在应该可以使用了。