如何使游戏对象列表消失动画? (或如何在设置 alpha 值时解决奇怪的行为)
Posted
技术标签:
【中文标题】如何使游戏对象列表消失动画? (或如何在设置 alpha 值时解决奇怪的行为)【英文标题】:How to make a list of gameObjects disappear animated? (or how to fix weird behaviour when setting alpha value) 【发布时间】:2022-01-13 12:19:59 【问题描述】:我试图让游戏对象列表在玩家进入房间时消失,我能想到的最好方法是逐帧更改材质 alpha。如果有比这种方法更高效的替代方法,请告诉! (并不是说我注意到任何糟糕的表现,因为这看起来很简单)
我希望玩家进入一个房间,并且该列表中的所有游戏对象会同时以相同的速度消失(就好像它们都只是一个对象,它们的透明度在运行时发生了变化)但是会发生什么(我制作了一个视频:https://youtu.be/z1pz2Te_hDg)有些游戏对象会先于其他游戏对象发生变化,有些游戏对象的消失速度比预期的要快,最后只是在其他游戏对象之后,这一切看起来都很奇怪。
一次只更改一个对象的 alpha 似乎没问题,但由于我需要循环遍历所有材质,我不能简单地将所有对象作为一个游戏对象的子对象。
我尝试通过访问默认“HDPR/Lit”着色器中的默认 alpha 来更改 alpha,但不使用 alpha 属性制作自定义着色器,它的行为相同。
这个问题看起来很简单,我觉得我在做一些愚蠢的错误,但我已经做了几个星期了。
这是我的“RoomTransparencyController”脚本:
bool transparent = false;
public float enhance = 5;
private struct ShaderPropertyIDs
public int AlphaRef;
private ShaderPropertyIDs shaderProps;
public List<GameObject> gameObjectList;
public List<Material> materialList;
void Start()
foreach(GameObject obj in gameObjectList)
foreach(Material mat in obj.GetComponent<MeshRenderer>().materials)
materialList.Add(mat);
// Cache property IDs
shaderProps = new ShaderPropertyIDs()
AlphaRef = Shader.PropertyToID("AlphaRef"),
;
void Update()
UpdateChildsAlpha3(transparent);
private void OnTriggerEnter(Collider col)
if(col.tag == "Player")
transparent = true;
private void OnTriggerExit(Collider col)
if(col.tag == "Player")
transparent = false;
void UpdateChildsAlpha3(bool transparent)
foreach(Material mat in materialList)
mat.SetFloat("AlphaRef", Mathf.Clamp(mat.GetFloat("AlphaRef") + Time.deltaTime * enhance * (transparent ? -1 : 1), 0, 1));
PS:这个脚本应该主要包含来自房间的道具和特定墙壁,因此每个房间都有一个脚本,其中包含其游戏对象列表,以便更好地组织。所以我认为每个房间都有自己的脚本是组织和复制的最佳方式。
【问题讨论】:
【参考方案1】:如果您希望对象消失,请在所有对象上使用带有Destroy()
的for 循环,如果您希望它们不再可见,只需使用SetActive()
。如果您希望它们工作,但只是停止可见,您可以禁用渲染器组件。
【讨论】:
禁用渲染器是可行的,但它不是动画的,这对于让游戏看起来不便宜或太业余很重要。禁用渲染将用于在墙壁、门和天花板在动画后完全不透明后不可见的一些道具。 将模型/精灵换成 null 怎么样? 我怎样才能缓慢而生动地做到这一点?【参考方案2】:如果你尝试使用一些补间来解决这个问题会更好。就像doTween 或LeanTween 一样,他们有一些更好的优化方法来减少alpha 或任何东西。尝试使用它。
【讨论】:
我确实使用了 doTween,但它的行为完全一样,不幸的是! 也许你必须尝试一些着色器。以上是关于如何使游戏对象列表消失动画? (或如何在设置 alpha 值时解决奇怪的行为)的主要内容,如果未能解决你的问题,请参考以下文章