如何使游戏对象列表消失动画? (或如何在设置 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 值时解决奇怪的行为)的主要内容,如果未能解决你的问题,请参考以下文章

做幻灯片中如何使一段文字消失的同时出现另一段文字?

EaselJS spritesheet 动画使背景消失

在 Swift 中为对象设置动画?

React:如何在内容大小未知时为展开和折叠 Div 设置动画

如何使组件在表单设计器中消失?

当 NPC 向左或向右走时,如何使动画匹配?