为什么通过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变量
然后我尝试了反过来写这段代码
运行这段代码,正方形成功的变成了圆柱体,但是颜色没有变成黑色
这是因为如果直接获取的是组件下的变量的话,你不能直接修改这个变量,你可以直接修改这个变量下的各种参数,但不能直接修改它本体
就是只能直接修改这个组件/变量的下一级变量/参数
我是这么理解的:两者不在同一个内存地址,即使修改了targetMesh的内存地址,GetComponent<MeshFilter>().mesh本身的内存地址并没有变,所以该是正方体还是正方体。
你可以通过获取上一级的方式直接修改它。就如同第二段代码,mf = GetComponent<MeshFilter>();,然后修改mf下的变量mesh="你要改成的mesh",这是可以直接修改的。
以上都是我个人理解,如有不对请指出。
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通过Attribute代替getComponent获取组件
- 通过html()的方法获取文本内容, form表单组件显示的值与获取到的值不一致的问题
- ECharts图表组件中级入门篇:如何通过Ajax异步获取图表数据赋值于图表并渲染呈现
- Flex编程注意之直接获取某个组件的对象(this[]用法)通过id获取控件
- ios 通过runtime 获取属性列表并修改变量值
- Java通过URL下载网络文件,获取文件流并修改文件名
- 页面两个submit通过onclick修改action本地没问题,服务器无效的奇葩问题
- unity5.x Translate平移移动 以及GetComponent获取组件
- 应用获取时间戳异常后通过系统应用修改时间
- 为什么有时全表扫描比通过索引扫描效率更高
- [iOS]通过xib自定义cell的时候在awakeFromNib方法里面修改view的frame无效
- vue---vue中如何操作dom获取节点?.vue组件中通过mounted获取节点操作
- input type=file为什么不能通过js来修改值的出处
- 坏事做尽--通过修改IL获取某资源文件
- sencha touch 扩展篇之使用sass自定义主题样式 (下)通过css修改官方组件样式以及自定义图标
- 为什么通过sp & ~(THREAD_SIZE - 1) 可以获取到 task_struct
- 为什么通过设置ROI无法修改图像(opencv)
- java通过类的反射获取页面修改字段前后值以及字段名称
- Android自定义控件无法通过代码修改大小、高宽,setMinimumHeight无效的问题
- Angular 通过注入 $location 获取与修改当前页面URL