尝试从字符串创建材料 - 不再支持此功能

时间:2016-09-26 18:28:23

标签: 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行是:

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) );
  }
}

4 个答案:

答案 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;
}

就是这样!您的代码现在应该可以使用了。