Unity中如何通过脚本修改物体材质与灯光的颜色/材质?
在Unity中通过脚本修改物体材质的方法
1. 修改单个物体的材质
- 如果仅需修改当前物体的材质实例(不影响其他共享该材质的物体),使用
material属性:
using UnityEngine; public class MaterialChanger : MonoBehaviour { public Material targetMaterial; void Update() { // 示例:按下空格键切换材质 if (Input.GetKeyDown(KeyCode.Space)) { GetComponent<Renderer>().material = targetMaterial; } } }
- 如果要修改共享材质(所有使用该材质的物体都会同步变化),使用
sharedMaterial属性:
GetComponent<Renderer>().sharedMaterial = targetMaterial;
2. 修改物体的多子材质
若物体使用了多材质的MeshRenderer,可通过materials数组批量修改:
Renderer renderer = GetComponent<Renderer>(); Material[] materials = renderer.materials; // 修改第二个材质(索引从0开始) materials[1] = targetMaterial; renderer.materials = materials;
按钮触发门开启+灯光状态切换的实现方案
需求分为门的状态切换、灯光状态反馈两部分,以下是两种实用实现方式:
方式1:直接修改灯光颜色(高效简洁)
Unity的Light组件自带color属性,无需修改材质即可快速切换颜色:
using UnityEngine; using UnityEngine.UI; public class DoorController : MonoBehaviour { public Button triggerButton; public Transform door; public Light doorLight; public float openAngle = 90f; public float openSpeed = 2f; private bool isOpen = false; private Quaternion closedRotation; private Quaternion openRotation; void Start() { closedRotation = door.rotation; openRotation = closedRotation * Quaternion.Euler(0, openAngle, 0); // 绑定按钮点击事件 triggerButton.onClick.AddListener(ToggleDoor); } void ToggleDoor() { isOpen = !isOpen; // 切换灯光颜色:开门时绿色,关门时恢复默认白色 doorLight.color = isOpen ? Color.green : Color.white; } void Update() { // 平滑旋转门实现开关动画 door.rotation = Quaternion.Lerp(door.rotation, isOpen ? openRotation : closedRotation, Time.deltaTime * openSpeed); } }
方式2:修改灯光物体的自发光材质(适用于自定义发光效果)
如果灯光是通过物体的自发光Shader实现的,可通过修改材质参数调整颜色:
// 替换ToggleDoor方法中灯光颜色相关代码 Renderer lightRenderer = doorLight.GetComponent<Renderer>(); if (isOpen) { // 设置自发光颜色为绿色并启用发光 lightRenderer.material.SetColor("_EmissionColor", Color.green); lightRenderer.material.EnableKeyword("_EMISSION"); } else { // 关闭发光效果 lightRenderer.material.SetColor("_EmissionColor", Color.black); lightRenderer.material.DisableKeyword("_EMISSION"); }
注意事项
- 需在Inspector面板中为脚本的
triggerButton、door、doorLight变量赋值对应的场景物体 - 若门的开关使用动画剪辑,可将Update中的旋转逻辑替换为
Animator.Play()调用动画
内容的提问来源于stack exchange,提问作者Miracle
相关产品推荐
相关产品推荐

