繁体   English   中英

Unity3d MeshRender

[英]Unity3d MeshRender

我正在尝试使用C#来禁用和启用MeshRender中的MeshRender组件,但是我收到以下错误,

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

我正在使用的代码行如下。 我在同一个功能中使用它。

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

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

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

此代码段组合了所有内容:查找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; go.renderer. enabled = false; 但是通过使用renderer您无需知道GameObject使用何种渲染器。 这可能是一个MeshRendererSpriteRenderer例如, renderer总是指向由所使用的渲染GameObject ,如果存在一个。

我的朋友。 刚刚尝试使用小写gameObject ,而不是GameObjectrenderer ,而不是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只有静态函数可以调用它并不需要一个GameObjectSceneView

gameObject是instance.You获得的实例GameObjectMonobehaviour被添加到。 在没有任何对象的情况下调用函数GetComponent与以下内容相同:

  • this
  • gameObject

GameObject是NO实例。

第一个字母要小心!

看文档:

using UnityEngine;
using System.Collections;

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

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

2种方法也可以解决问题。 您将单词static添加到调用语句的方法中。

例如:public static GetTheMesh(){}

我不建议这样做。 如果您在方法中有其他需要访问Instance的调用,这将导致您遇到麻烦。

修复它的第二种方法是在获取组件之前先做一个指针或引用。 或者使用GameObject.Find <=这是慢的if。

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

如果要在此gameObject上禁用渲染器,请使用:

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

如果它不是这个游戏对象那么使用:

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对象,如sphere,cube

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

 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");按名称找到它GameObject.Find("zone1"); (注意那个中的大写“G”,或者你可以给它一个标签,并用GameObject.FindGameObjectWithTag("zone1");找到它GameObject.FindGameObjectWithTag("zone1"); (您可能已经或可能不知道,但提供信息并没有什么坏处。)

编辑:

你的另一个问题是你必须使用renderer而不是Renderer因为像GameObject “渲染器”一样,大写“R”引用一个类,而不是特定的对象。

问题是GameObject是从不同的gameobject游戏物体是一个类和游戏物体是在该脚本的连接当前游戏物体或游戏对象的一个实例

更换线

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

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

我想会这样做,

另请注意,在Error语句中,它表示GameObject是Class或数据类型而不是对象

你看到齿轮了吗? 是? 单击它然后单击删除组件。

您可以使用声明:

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

单线参考...条件满足后...

有关MeshRender的更精确帮助,请参阅Unity Documentations ..

我的声明有同样的问题,我只是通过在gameObject中将“G”更改为“g”来修复它,我在Start中声明它就像是......

MeshRenderer showZone = gameObject.GetComponent();

GameObject是一个Class,您应该使用'GetComponent()'来立即获取组件。 因为你已经在实例中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM