UI 中的堆叠效果和通电 |统一 C#

Posted

技术标签:

【中文标题】UI 中的堆叠效果和通电 |统一 C#【英文标题】:Stacking effects & powerups in UI | Unity C# 【发布时间】:2021-05-04 16:21:32 【问题描述】:

我怎样才能做到这一点,例如,如果只有一个东西放在它会移动到第一个位置,我想你知道我的意思......那么我怎么能做到这一点?1

我想过使用数组,但我不明白怎么做。

这是我目前的代码,它只是显示和隐藏,但不移动它们,所以只有一个间隙。

using System.Collections;
using UnityEngine;
using UnityEngine.UI;

public class UI : MonoBehaviour

    public Text myText;
    public GameObject Player;
    public GameObject SugarIcon;
    public GameObject DashIcon;
    public GameObject JumpIcon;
    public GameObject ShieldIcon;
    private string dashreadystring;
    private string doublejumpstring;
    private string triplejumpstring;
    private string shieldbuffstring;
    private int iconamount = 0;
    
    void Start()
    
        GameObject Player = GameObject.Find("Player");
    

    void Update()
    
        PlayerScript PlayerScript = Player.GetComponent<PlayerScript>();
        bool dashready = PlayerScript.canDash;
        float sugarbuff = PlayerScript.sugarbuffactive;
        int airJumpCount = PlayerScript.airJumpCount;
        int airJumpCountMax = PlayerScript.airJumpCountMax;
        bool canDoubleJump = PlayerScript.canDoubleJump;
        bool shieldon = PlayerScript.shieldon;
        float score = Player.transform.position.x;

        // If Dash is ready, show icon, if not, hide it.
        if (dashready == true)
        
            DashIcon.GetComponent<Renderer>().enabled = true;
        
        else
        
            DashIcon.GetComponent<Renderer>().enabled = false;
        

        // If Sugarbuff is active, show icon, if not, hide it.
        if (sugarbuff == 1.5)
        
            SugarIcon.GetComponent<Renderer>().enabled = true;
        
        else
        
            SugarIcon.GetComponent<Renderer>().enabled = false;
        

        // If can jump, 
        if ((airJumpCount < airJumpCountMax) | ((canDoubleJump) && (sugarbuff == 1.5f)))
        
            JumpIcon.GetComponent<Renderer>().enabled = true;
        
        else
        
            JumpIcon.GetComponent<Renderer>().enabled = false;
        
        if (shieldon)
        
            ShieldIcon.GetComponent<Renderer>().enabled = true;
        
        else
        
            ShieldIcon.GetComponent<Renderer>().enabled = false;
        
    


我怎么能做到这一点?谢谢。

【问题讨论】:

【参考方案1】:

如果您的图标是使用 Horizo​​ntalLayoutGroup 组件的父容器的子级,它将自动水平排列您的图标(使用 VerticalLayoutGroup 或 GridLayoutGroup 以不同的模式自动对齐)。

然后,如果您禁用图标的游戏对象,它们将消失。 Horizo​​ntalLayoutGroup 将以我认为您想要的方式重新排列剩余的图标。当您重新启用图标时,它将重新插入到水平布局中。

注意事项:

    您当前正在禁用游戏对象上的渲染器组件。这确实使对象不可见,但它仍然存在并占用空间。相反,禁用图标本身的游戏对象(SugarIcon.enabled = false)。希望 Icon 对象只是图像,并且没有脚本/逻辑,但如果是这样,您需要将其解耦。

    看起来您每帧都多次使用 GetComponent() 调用。不要这样做—— GetComponent() 调用有相当大的开销。相反,在初始化管理器时调用它一次,然后缓存结果。这将节省大量的处理时间。

// 调用 GetComponent() 并缓存一次引用(在初始化对象时)。

Renderer sugarIconRenderer = SugarIcon.GetComponent<Renderer>();

// 在需要时每帧调用缓存的引用。

sugarIconRenderer.enabled = false;

【讨论】:

以上是关于UI 中的堆叠效果和通电 |统一 C#的主要内容,如果未能解决你的问题,请参考以下文章

如何统一去掉UI文字中的红叉?

如何让 ui 元素指向统一的世界坐标中的位置?

如何在 c# 中的浮点列表中添加浮点列表,统一?

如何将字符串列表转换为c#中的浮点列表,统一?

SetBool 和 SetTrigger 不能在 UI 按钮上统一单击

如何通过统一单击UI按钮来传递值