Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尝试从字符串创建材质-不再支持此操作_C#_Unity3d - Fatal编程技术网

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