Unity中如何通过脚本访问并修改Shader Graph的Vector2属性
在Unity中通过脚本修改Shader Graph的Vector2属性(视差效果场景)
核心解决方案
Unity的Material类提供了两种修改Vector2属性的方法,你之前没找到是因为早期版本没有单独的SetVector2方法,但可以用通用的SetVector替代;高版本Unity也新增了更直观的SetVector2方法。
操作步骤
确认Shader Graph属性设置
在Shader Graph中创建的Vector2属性必须勾选Exposed(暴露到Inspector),并且记住属性的Reference Name(参考名称,不是Inspector里的显示名称)——脚本中必须使用这个参考名来定位属性。获取Material引用
通过目标对象的Renderer组件获取材质:- 使用
Renderer.material:会创建材质实例,仅修改当前对象的材质,适合独立背景层; - 使用
Renderer.sharedMaterial:直接修改原始材质,会影响所有使用该材质的对象,适合批量修改。
- 使用
修改Vector2属性
两种可行方法:- 方法一(兼容所有Unity版本):使用
SetVector,Vector2可以隐式转换为Vector4,直接传入即可:material.SetVector("_ParallaxOffset", new Vector2(calculatedX, calculatedY)); - 方法二(Unity 2020.1及以上版本支持):使用专门的
SetVector2方法,更直观:material.SetVector2("_ParallaxOffset", new Vector2(calculatedX, calculatedY));
- 方法一(兼容所有Unity版本):使用
完整示例代码
using UnityEngine; public class ParallaxBackground : MonoBehaviour { [SerializeField] private Renderer _bgRenderer; [SerializeField] private float _parallaxXSpeed = 0.1f; [SerializeField] private float _parallaxYSpeed = 0.05f; private Material _bgMaterial; private Vector2 _currentOffset; private void Start() { // 获取当前对象的材质实例 _bgMaterial = _bgRenderer.material; // 读取Shader中已有的偏移值作为初始值 _currentOffset = _bgMaterial.GetVector("_ParallaxOffset"); } private void Update() { // 替换为你自己的视差偏移计算逻辑 _currentOffset.x += _parallaxXSpeed * Time.deltaTime; _currentOffset.y += _parallaxYSpeed * Time.deltaTime; // 应用计算后的偏移到Shader属性 _bgMaterial.SetVector("_ParallaxOffset", _currentOffset); } private void OnDestroy() { // 销毁手动创建的材质实例,避免内存泄漏 Destroy(_bgMaterial); } }
注意事项
- 必须使用Shader Graph属性的Reference Name,如果你的属性参考名是
_CustomOffset,脚本里就不能用显示名称比如"视差偏移"来调用。 - 如果使用
sharedMaterial修改,所有使用该材质的对象都会同步变化,注意场景中的材质复用情况。 - 可以用
GetVector方法读取当前的Vector2属性值,返回的Vector4可以直接转换为Vector2使用。
内容的提问来源于stack exchange,提问作者Sacc Ace
相关产品推荐
相关产品推荐

