unity3d - 通过漫反射着色器设置随机颜色
问题描述
我编写了以下代码来查看是否可以为对象分配随机颜色。我错过了什么对象永远不会改变颜色?
using UnityEngine;
public class ColorManager : MonoBehaviour
{
private void Start()
{
Shader shader = Shader.Find("Diffuse");
Material mat = new Material(shader) {hideFlags = HideFlags.HideAndDontSave};
mat.color = new Color(Random.value, Random.value, Random.value);
}
}
解决方案
您创建了一种材料,但您没有将该材料分配给任何东西......
你可能想把它分配给类似的Renderer.material
东西
public class ColorManager : MonoBehaviour
{
// Reference this via the Inspector
[SerializeField] private Renderer targetRenderer;
private void Start()
{
// As fallback look for a renderer on this object
if(!targetRenderer) targetRenderer = GetComponent<Renderer>();
var shader = Shader.Find("Diffuse");
var mat = new Material(shader) { hideFlags = HideFlags.HideAndDontSave };
mat.color = new Color(Random.value, Random.value, Random.value);
targetRenderer.material = mat;
}
}
实际上根本不需要创建新材料。您可以简单地使用已经存在的。只创建一个新的作为后备:
public class ColorManager : MonoBehaviour
{
[SerializeField] private Renderer targetRenderer;
private void Start()
{
if(!targetRenderer) targetRenderer = GetComponent<Renderer>();
var mat = targetRenderer.material;
if(!mat)
{
Shader shader = Shader.Find("Diffuse");
mat = new Material(shader) { hideFlags = HideFlags.HideAndDontSave };
}
mat.color = new Color(Random.value, Random.value, Random.value);
}
}
推荐阅读
- angular - 如何获得儿童投影组件?
- html - 在 Bootstrap3 中将工具栏的末端与表格的末端对齐
- kubernetes - 从 GCP 存储桶到 Kubernetes 持久卷的 gsutil rsync 使用的磁盘空间超出了应有的水平
- kubernetes - Minikube:尝试创建特权容器时,受限 PodSecurityPolicy 不受限制
- lua - 当你有一个函数作为参数时会发生什么?
- vue.js - 使用 v-model 将相同的对象加载到两个 b-form-select - VueJS(bootstrap-vue)
- javascript - 使用数组属性初始化对象
- kubernetes - 本地 VM 上的 consul 和 Kubernetes 中的 consul 之间的通信
- linux - Cron 作业 Linux Shell 命令 SiteGround - 它在哪个目录中运行?
- python - Python Webscraping:grequests 与多线程请求?