您的位置:首页 > 移动开发 > Unity3D

为什么通过GetComponent获取的组件,有时修改会无效?

2017-12-17 16:55 267 查看
这几天正在学unity,突然遇到一个关于GetComponent的一个问题,我百思不得其解

public class MeshAndMat : MonoBehaviour
{
public Mesh meshDemo;
private Mesh targetMesh;
private Material mat;

void Start ()
{
targetMesh = GetComponent<MeshFilter>().mesh;
targetMesh = meshDemo;

mat = GetComponent<MeshRenderer>().material;
mat.color = Color.black;

}

这段代码很简单,我想修改一个正方体Cube变成圆柱体,同时修改它的颜色变成黑色
meshDemo是一个圆柱体,我通过targetMesh获取了正方体身上的mesh,通过mat获取了正方体身上的material

然后直接赋值,让targetMesh赋值成圆柱体,颜色变成黑色。

我直接说结果吧,它没有变成圆柱体,仍然是个Cube,但是颜色却变成了黑色。

这样我百思不得其解,我都是同样获取了组件,为什么一个修改成功了,一个修改却失败了呢?

细心的人可能已经发现问题了,我targetMesh获取的是MeshFilter组件下的mesh变量,而mat获取的是MeshRenderer下的material
而修改的时候,targetMesh是直接赋值,而mat是修改material下的color变量
然后我尝试了反过来写这段代码
public class MeshAndMat : MonoBehaviour
{
public Mesh meshDemo;
private Mesh targetMesh;
private Material mat;
private MeshFilter mf;
private Color coco;

void Start ()
{
//targetMesh = GetComponent<MeshFilter>().mesh;
//targetMesh = meshDemo;

//mat = GetComponent<MeshRenderer>().material;
//mat.color = Color.black;

mf = GetComponent<MeshFilter>();
mf.mesh = meshDemo;

coco = GetComponent<MeshRenderer>().material.color;
coco=Color.black;
}
mf对应之前的targetMesh,coco对应之前的mat
运行这段代码,正方形成功的变成了圆柱体,但是颜色没有变成黑色

这是因为如果直接获取的是组件下的变量的话,你不能直接修改这个变量你可以直接修改这个变量下的各种参数但不能直接修改它本体
就是只能直接修改这个组件/变量的下一级变量/参数
我是这么理解的:两者不在同一个内存地址,即使修改了targetMesh的内存地址,GetComponent<MeshFilter>().mesh本身的内存地址并没有变,所以该是正方体还是正方体。
你可以通过获取上一级的方式直接修改它。就如同第二段代码,mf = GetComponent<MeshFilter>();,然后修改mf下的变量mesh="你要改成的mesh",这是可以直接修改的。

以上都是我个人理解,如有不对请指出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unity getcomponent c#
相关文章推荐