You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 06:24:22