我想编写一个在 Ubuntu 24.04 上安装 .NET 8.0 的应用程序,它有一个可以隐藏的主窗口,我认为在最上面有一个叫做“应用程序指示器”的东西……
我想编写一个在 Ubuntu 24.04 上运行的应用程序,该应用程序使用 .NET 8.0,并且有一个可以隐藏的主窗口,我认为右上角有一个“应用程序指示器”。我来自 Windows 世界,我正在寻找的东西被称为“系统托盘图标”——我进行了大量搜索,试图弄清楚这是如何做到的,但只找到了对“D-BUS 菜单”的模糊引用,我想这就是我在这里寻找的东西?
有一页提到了一个 libappindicator0.1-cil-dev
用于 Mono 的包,但不清楚这是否是一个可以在 .NET 运行时下运行的可移植库,而且无论如何它似乎不在任何默认的高贵包源中。
我还怀疑应用程序指示器可能独立于窗口工具包,因为它只是跨进程通信菜单的问题,菜单及其图标实际上会显示在哪里?所以,例如,问这是否可以用 Gtk# 完成,我认为可能没什么帮助?
所有这些记录在哪里?:-) 存在样本吗?
所以我确实设法解决了这个问题,但仍然不知道为什么会导致不一致。
之前,我按照 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 问题的编辑发布的,而不是作为答案)