C# Unity3d网格渲染

C# Unity3d网格渲染,c#,unity3d,C#,Unity3d,我正在尝试使用C#禁用和启用Unity3d中的MeshRender组件,但出现以下错误: 错误CS0120:访问非静态成员“UnityEngine.GameObject.GetComponent(System.Type)”需要对象引用 下面是我正在使用的代码行。我在同一个函数中使用它 MeshRenderer showZone = GameObject.GetComponent<MeshRenderer>(); mesh渲染器showZone=GameObject.GetCompo

我正在尝试使用C#禁用和启用Unity3d中的
MeshRender
组件,但出现以下错误:

错误CS0120:访问非静态成员“UnityEngine.GameObject.GetComponent(System.Type)”需要对象引用

下面是我正在使用的代码行。我在同一个函数中使用它

MeshRenderer showZone = GameObject.GetComponent<MeshRenderer>();
mesh渲染器showZone=GameObject.GetComponent();
另外,我在这里发布的不是Unity的答案,因为我在这里得到的响应要快得多,而且无论结果如何,它都是有用的信息

查看文档:

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void Example() {
        renderer.enabled = false;
    }
}
链接:
更改右上角的编程语言。

您遇到了几个问题。首先,您试图对类而不是对象的实例使用
GetComponent
。这直接导致你的第二个问题。搜索特定的
GameObject
后,您没有使用结果,而是试图禁用包含脚本的
GameObject
的渲染器。第三,C#区分大小写,
Renderer
是一个类,
Renderer
是对
Renderer
实例的引用,该实例附加到
GameObject

此代码段组合了所有内容:查找
游戏对象
并禁用其渲染器

GameObject go = GameObject.FindWithTag("zone1");
if (go != null) { // the result could be null if no matching GameObject is found
  go.renderer.enabled = false;
}

您可以使用
go.GetComponent().enabled=false而不是
go.renderer。启用=错误
但是通过使用
渲染器
您不需要知道
游戏对象
使用哪种渲染器。它可以是
网格渲染器
精灵渲染器
,例如,
渲染器
始终指向
游戏对象
使用的渲染器(如果存在)。

我的朋友。只需尝试使用小写的
gameObject
而不是
gameObject
renderer
而不是
renderer

MeshRenderer showZone = GetComponent<MeshRenderer>();
主要问题是您尝试访问静态类变量,使用类的名称而不是类实例。
这里的类名是
GameObject
Renderer

实例是
gameObject
renderer

MeshRenderer showZone=GetComponent();
MeshRenderer showZone = GetComponent<MeshRenderer>();
删除“游戏对象”

GameObject是一种类型。您需要在游戏对象的实例中调用GetcComponent。这就是错误所在

值得注意的是:

MeshRenderer showZone = GetComponent<MeshRenderer>();
showZone=GetComponent();
与此完全相同:

MeshRenderer showZone = this.GetComponent<MeshRenderer>();
MeshRenderer showZone=this.GetComponent();

您正在脚本所附加到的GameObject实例上调用GetComponent。

2种解决问题的方法。将static一词添加到调用语句的方法中

例: 公共静态GetTheMesh(){}

我不建议这样做。如果在方法中有其他需要访问实例的调用,这将给您带来麻烦


第二种修复方法是在获取组件之前先创建指针或引用。或者使用GameObject。查找您的代码应该如下所示:

MeshRenderer showZone = GetComponent<MeshRenderer>();
showZone=GetComponent();

像其他人已经编写的一样,您需要获得一个实例化的
游戏对象。您可以调用基类
GameObject
,其中只能调用不需要
SceneView
中的
GameObject
的静态函数

gameObject
是一个实例。您将获得添加到的
monobhavior
gameObject的实例。在没有任何对象的情况下调用函数
GetComponent
,与以下操作相同:

  • gameObject

GameObject
不是实例


注意第一个字母

如果要禁用此游戏对象上的渲染器,请使用:

this.GetComponent<Renderer>().enabled = false;
GameObject.FindGameObjectWithTag("your_tag").GetComponent<Renderer>().enabled = false;
this.GetComponent().enabled=false;
如果不是此游戏对象,请使用:

this.GetComponent<Renderer>().enabled = false;
GameObject.FindGameObjectWithTag("your_tag").GetComponent<Renderer>().enabled = false;
GameObject.FindGameObjectWithTag(“您的标签”).GetComponent().enabled=false;
或者,您可以手动为对象指定:

public GameObject go;
go.GetComponent<Renderer>().enabled = false;
公共游戏对象go;
go.GetComponent().enabled=false;

您可以使用两种类型的和平代码来启用和禁用访问

1> 创建附加到场景中的空游戏对象的GetMeshRenderer脚本(脚本名称,如您所需),并根据您要启用和禁用的对象指定立方体或球体或任何3d对象

**************************************代码***************************

using UnityEngine;
using System.Collections;

public class GetMeshRenderer : MonoBehaviour 
{
public MeshRenderer ShowZone;

void Start () 
{

}

// Update is called once per frame
void Update () 
{

    if(Input.GetKey(KeyCode.Y))
    {
        ShowZone.enabled = true;    
    }

    if(Input.GetKey(KeyCode.N))
    {
        ShowZone.enabled = false;   
    }

}
 using UnityEngine;
 using System.Collections;

 public class GetMeshRenderer : MonoBehaviour 
 {
   private MeshRenderer ShowZone;
// Use this for initialization
void Start () 
{
    ShowZone = gameObject.GetComponent<MeshRenderer> (); 
}

// Update is called once per frame
void Update () 
{

    if(Input.GetKey(KeyCode.Y))
    {
        ShowZone.enabled = true;         
    }

    if(Input.GetKey(KeyCode.N))
    {
        ShowZone.enabled = false;   
    }

}
}


2>

将下面的代码脚本附加到任何3d对象,如球体、立方体

***************************代码***************************

using UnityEngine;
using System.Collections;

public class GetMeshRenderer : MonoBehaviour 
{
public MeshRenderer ShowZone;

void Start () 
{

}

// Update is called once per frame
void Update () 
{

    if(Input.GetKey(KeyCode.Y))
    {
        ShowZone.enabled = true;    
    }

    if(Input.GetKey(KeyCode.N))
    {
        ShowZone.enabled = false;   
    }

}
 using UnityEngine;
 using System.Collections;

 public class GetMeshRenderer : MonoBehaviour 
 {
   private MeshRenderer ShowZone;
// Use this for initialization
void Start () 
{
    ShowZone = gameObject.GetComponent<MeshRenderer> (); 
}

// Update is called once per frame
void Update () 
{

    if(Input.GetKey(KeyCode.Y))
    {
        ShowZone.enabled = true;         
    }

    if(Input.GetKey(KeyCode.N))
    {
        ShowZone.enabled = false;   
    }

}
使用UnityEngine;
使用系统集合;
公共类GetMeshRenderer:单行为
{
私人展览区;
//用于初始化
无效开始()
{
ShowZone=gameObject.GetComponent();
}
//每帧调用一次更新
无效更新()
{
if(Input.GetKey(KeyCode.Y))
{
ShowZone.enabled=true;
}
if(Input.GetKey(KeyCode.N))
{
ShowZone.enabled=false;
}
}

}

您的问题是使用的是
GameObject
,它只是一个“描述”它是什么的类。如果此脚本附加到所需网格渲染器的GameObject,您需要的是
GameObject
,并带有小写字母“g”

如果你想获得另一个游戏对象的网格渲染器,你可以通过
GameObject.find(“zone1”)
(注意其中的大写字母“G”),或者你可以给它一个标签,然后用
GameObject.FindGameObjectWithTag(“zone1”)找到它
(你可能知道,也可能不知道,但提供信息并没有坏处。)

编辑:

您的另一个问题是必须使用
渲染器
而不是
渲染器
be