Unity3d MeshRender

本文关键字:MeshRender Unity3d | 更新日期: 2023-09-27 18:08:47

我试图使用c#禁用和启用Unity3d中的MeshRender组件,但我得到以下错误,

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

我使用的代码行如下所示。我在同一个函数中使用这个。

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

另外,我在这里发布而不是Unity答案,因为我在这里得到更快的响应,无论结果如何,它总是有用的信息。

Unity3d MeshRender

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

上的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<MeshRenderer>().enabled = false;代替go.renderer. enabled = false;,但通过使用renderer,你不需要知道GameObject使用什么样的渲染器。它可以是MeshRendererSpriteRenderer,例如,renderer总是指向GameObject使用的渲染器(如果存在的话)。

我的朋友。用小写的gameObject代替GameObject,用小写的renderer代替Renderer

访问静态类变量的主要问题是,使用类的名称而不是类的实例。
这里的类名是GameObjectRenderer
实例为gameObjectrenderer

MeshRenderer showZone = GetComponent<MeshRenderer>();

删除"GameObject"

GameObject是一种类型。你想要的是在一个gameObject的实例中调用GetcComponent。这就是错误的原因。

需要注意的是:

MeshRenderer showZone = GetComponent<MeshRenderer>();

和下面的完全一样:

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

你正在调用GameObject实例的GetComponent,其中脚本被附加到。

你的代码应该是这样的:

MeshRenderer showZone = GetComponent<MeshRenderer>();

就像其他人已经写过的那样,您需要获得一个实例化的GameObject。您调用基类GameObject,其中只能调用静态函数,这些函数在SceneView中不需要GameObject

gameObject 是一个实例。您将获得添加MonobehaviourGameObject的实例。调用不带任何对象的GetComponent函数与

相同:
  • this
  • gameObject

GameObject IS NO instance。

注意第一个字母!

看文档:

using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour {
    void Example() {
        renderer.enabled = false;
    }
}

链接:http://docs.unity3d.com/ScriptReference/Renderer-enabled.html更改编程语言的右上方。

有两种方法可以解决这个问题。将单词static添加到调用语句的方法中。

交货:public static GetTheMesh(){}

我不建议这样做。如果你在方法内部有其他需要访问Instance的调用,这会给你带来麻烦。

修复它的第二种方法是在获得组件之前先创建一个指针或引用。或者使用GameObject。查找<=

showZone = GameObject.Find("TheGameObjectName").GetComponent<MeshRenderer>();

如果你想在这个gameObject上禁用渲染器,那么使用:

this.GetComponent<Renderer>().enabled = false;

如果不是这个gameObject,那么使用:

GameObject.FindGameObjectWithTag("your_tag").GetComponent<Renderer>().enabled = false;

或者你可以手动给出对象:

public GameObject go;
go.GetComponent<Renderer>().enabled = false;

https://docs.unity3d.com/ScriptReference/Renderer-enabled.html

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

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

}


2>

附加到任何3d对象,如球体,立方体

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

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

}

您的问题是您正在使用GameObject,这只是一个"描述"它是什么的类。你想要什么,如果这个脚本是附加到GameObject的网格渲染器,你想要的是gameObject小写的"g"。"

如果你想获得另一个GameObject的网格渲染器,你可以通过名称GameObject.Find("zone1");找到它(注意其中的大写"G"),或者你可以给它一个标签并使用GameObject.FindGameObjectWithTag("zone1");找到它(你可能已经知道,也可能不知道,但提供这些信息也无妨。)

编辑:

你的另一个问题是,你必须使用renderer而不是Renderer,因为,像GameObject"Renderer"与大写"R"引用一个类,而不是一个特定的对象。

问题是GameObject不同于gameobject Gameobject是一个类,Gameobject是当前Gameobject的实例,或者是脚本附加的Gameobject

替换行

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

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

我想这就行了,

还要注意,在你的错误声明中,它说GameObject是一个类或数据类型,而不是对象

看到齿轮了吗?是吗?点击点击删除组件。

您可以使用声明:

other.gameobject.GetComponent< MeshRenderer>().Setactive (false);

One Line Reference…条件满足后…

有关MeshRender的更精确的帮助,请参阅Unity文档。

我的声明也有同样的问题,我只是通过在gameObject中将"G"更改为"G"来修复它,我在开始中声明它,所以它就像…

MeshRenderer showZone = gameObject.GetComponent();