如何在 Unity3D 中分配给一个游戏对象的两种材质之间切换?
Posted
技术标签:
【中文标题】如何在 Unity3D 中分配给一个游戏对象的两种材质之间切换?【英文标题】:How to switch between two materials assigned to one gameobject in Unity3D? 【发布时间】:2019-10-11 05:56:05 【问题描述】:我在一个游戏对象上附加了两种材质,我想做的是在几秒钟后从一种材质切换到另一种材质。
在 Unity3D 中,在我选择的 Gameobject 的检查器菜单下,在材质子标题下方的 MeshRenderer 标题下,我将大小从 1 增加到 2。我已将两种材质分配给两个新创建的元素。但是当我运行场景时,材质不会切换。
public var arrayMAterial : Material[];
public var CHILDObject : Transform;
function Update()
CHILDObject.GetComponent.<Renderer>().material = arrayMAterial[0];
没有错误消息。它只是没有切换到新材料。
【问题讨论】:
你有那个 CHILDObject 的引用吗?第一:不要在 Update 函数中执行此操作。第二:切换到 C#。 看起来您正在访问数组中的第一个值,我认为这将是您的原始材料。你在这里没有改变任何东西。 我认为@Eliasar 是对的。尝试使用... = arrayMAterial[1];
。另外,您是否使用旧版本的 Unity 只是为了使用 UnityScript?
【参考方案1】:
这是一个快速的 C# 脚本,它将在延迟后循环遍历一组材料。
using UnityEngine;
public class SwitchMaterialAfterDelay : MonoBehaviour
[Tooltip("Delay in Seconds")]
public float Delay = 3f;
[Tooltip("Array of Materials to cycle through")]
public Material[] Materials;
[Tooltip("Mesh Renderer to target")]
public Renderer TargetRenderer;
// use to cycle through our Materials
private int _currentIndex = 0;
// keeps track of time between material changes
private float _elapsedTime= 0;
// Start is called before the first frame update
void Start()
// optional: update the renderer with the first material in the array
TargetRenderer.material = Materials[_currentIndex];
// Update is called once per frame
void Update()
_elapsedTime += Time.deltaTime;
// Proceed only if the elapsed time is superior to the delay
if (_elapsedTime <= Delay) return;
// Reset elapsed time
_elapsedTime = 0;
// Increment the array position index
_currentIndex++;
// If the index is superior to the number of materials, reset to 0
if (_currentIndex >= Materials.Length) _currentIndex = 0;
TargetRenderer.material = Materials[_currentIndex];
一定要给组件分配材质和渲染器,否则会报错!
hth.
【讨论】:
以上是关于如何在 Unity3D 中分配给一个游戏对象的两种材质之间切换?的主要内容,如果未能解决你的问题,请参考以下文章