Unity非Canvas GameObject宽高设为0仍正常显示的原因咨询
嘿,这个问题其实戳中了Unity里UI和普通对象核心的区别点,我来给你理清楚为啥会这样:
RectTransform只认Canvas“户口本”
如果你给这个主GameObject挂了RectTransform组件(就是能调Width/Height的那个),但它不在Canvas下面的话,这个组件基本就是个“摆设”。RectTransform是Unity UI系统专属的,必须依托Canvas的渲染和布局逻辑才能生效。对于非UI对象,Unity根本不会理它的宽高参数,只会看普通Transform组件的位置、旋转、缩放。普通对象的大小由Transform和Renderer说了算
非Canvas里的GameObject,显示大小是由俩东西决定的:一是Transform的localScale(缩放比例),二是挂载的Renderer组件(比如SpriteRenderer、MeshRenderer)里的原始素材尺寸(Sprite或者Mesh本身的大小)。你调的那个Width/Height如果跟这俩没关系,自然不会有任何变化。实例化的对象根本不继承无效参数
你用这个主对象实例化其他对象时,实例化出来的东西只会继承主对象的Transform属性(位置、旋转、缩放),那些无效的宽高参数根本不会被传递。毕竟主对象自己都不吃这一套,实例化的对象自然该咋显示咋显示。
如果你想通过主对象的参数控制实例化对象的大小,直接改主对象的Transform.localScale就行,实例化时让子对象继承这个缩放;或者写个简单的自定义组件,用自己定义的宽高参数来计算子对象的缩放比例,这样就靠谱多了。
内容的提问来源于stack exchange,提问作者Johny

