8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

如何在 Ubuntu 上的 C# 应用程序中实现应用程序指标?

Jarrod Carlson 2月前

88 0

我想编写一个在 Ubuntu 24.04 上安装 .NET 8.0 的应用程序,它有一个可以隐藏的主窗口,我认为在最上面有一个叫做“应用程序指示器”的东西……

我想编写一个在 Ubuntu 24.04 上运行的应用程序,该应用程序使用 .NET 8.0,并且有一个可以隐藏的主窗口,我认为右上角有一个“应用程序指示器”。我来自 Windows 世界,我正在寻找的东西被称为“系统托盘图标”——我进行了大量搜索,试图弄清楚这是如何做到的,但只找到了对“D-BUS 菜单”的模糊引用,我想这就是我在这里寻找的东西?

有一页提到了一个 libappindicator0.1-cil-dev 用于 Mono 的包,但不清楚这是否是一个可以在 .NET 运行时下运行的可移植库,而且无论如何它似乎不在任何默认的高贵包源中。

我还怀疑应用程序指示器可能独立于窗口工具包,因为它只是跨进程通信菜单的问题,菜单及其图标实际上会显示在哪里?所以,例如,问这是否可以用 Gtk# 完成,我认为可能没什么帮助?

所有这些记录在哪里?:-) 存在样本吗?

帖子版权声明 1、本帖标题:如何在 Ubuntu 上的 C# 应用程序中实现应用程序指标?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Jarrod Carlson在本站《ubuntu》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 所以我确实设法解决了这个问题,但仍然不知道为什么会导致不一致。

    之前,我按照 YouTube 视频 ,视频中创建了一个通用类来创建池,然后可以根据需要进行访问。它按预期工作,但它更像是一个 C# 解决方案,而不是 Unity 对象池解决方案。

    public static void EnqueueObject<T>(T item, string name) where T : Component
    {
        if (!item.gameObject.activeSelf)
        {
            return;
        }
    
        item.transform.position = Vector2.zero;
    
        poolDictionary[name].Enqueue(item);
    
        Debug.Log("item.GetType(): " + item.GetType());
    
        item.gameObject.SetActive(false);
    
    }
    
    public static T DequeueObject<T>(string key) where T : Component
    {
        if (poolDictionary[key].TryDequeue(out var item))
        {
            return (T)item;
        }
    
        return (T)EnqueueNewInstance(poolLookup[key], key);
        //return (T)poolDictionary[key].Dequeue();
    }
    
    public static T EnqueueNewInstance<T>(T item, string key) where T : Component
    {
        T newInstance = Object.Instantiate(item);
        newInstance.gameObject.SetActive(false);
        newInstance.transform.position = Vector2.zero;
        poolDictionary[key].Enqueue(newInstance);
        return newInstance;
    }
    

    事实证明,在 Unity 中池化对象的正确方法是使用 UnityEngine.Pool 。我按照 这个教程 做了同样的事情,但这次我不必担心队列。

    我将这些添加到我的 EnemySpawner.cs 中,

    private void Start()
    {
        _enemyPool = new ObjectPool<Enemy>(() =>
        {
            return Instantiate(enemyPrefab);
        }, enemy =>
        {
            enemy.gameObject.SetActive(true);
        }, enemy =>
        {
            enemy.gameObject.SetActive(false);
        }, enemy =>
        {
            Destroy(enemy.gameObject);
        }, false, 10, 20);
    
    }
    
    public void KillEnemy(Enemy enemy)
    {
        _enemyPool.Release(enemy);
    }
    
    public void InstantiateNewEnemy()
    {
    
        StatsManager.Instance.SpawnedNewEnemy(1);
    
        Enemy instance = _enemyPool.Get();
    
        instance.Initialize(10.0f); // get this hp value from the experience manager
    
        instance.SetThisAlive();
    
        instance.gameObject.SetActive(true);
    
        instance.transform.SetParent(enemiesHolder);
    
        int randomIndex = Random.Range(0, enemySpawnPoints.childCount);
    
        instance.transform.position = enemySpawnPoints.GetChild(randomIndex).position;
    
        instance.transform.rotation = Quaternion.identity;
    }
    

    然后当敌人被杀死时

    public void KillMyself()
    {
        StatsManager.Instance.TookDownEnemy(1);
        EnemySpawner.Instance.KillEnemy(this);
    }
    

    (最初是作为对 OP 问题的编辑发布的,而不是作为答案)

返回
作者最近主题: