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答案,因为我在这里得到更快的响应,无论结果如何,它总是有用的信息。
您遇到了几个问题。首先,您试图在类而不是对象的实例上使用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
使用什么样的渲染器。它可以是MeshRenderer
或SpriteRenderer
,例如,renderer
总是指向GameObject
使用的渲染器(如果存在的话)。
我的朋友。用小写的gameObject
代替GameObject
,用小写的renderer
代替Renderer
访问静态类变量的主要问题是,使用类的名称而不是类的实例。
这里的类名是GameObject
和Renderer
实例为gameObject
和renderer
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
是一个实例。您将获得添加Monobehaviour
的GameObject
的实例。调用不带任何对象的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();