我想编写一个在 Ubuntu 24.04 上安装 .NET 8.0 的应用程序,它有一个可以隐藏的主窗口,我认为在最上面有一个叫做“应用程序指示器”的东西……
我想编写一个在 Ubuntu 24.04 上运行的应用程序,该应用程序使用 .NET 8.0,并且有一个可以隐藏的主窗口,我认为右上角有一个“应用程序指示器”。我来自 Windows 世界,我正在寻找的东西被称为“系统托盘图标”——我进行了大量搜索,试图弄清楚这是如何做到的,但只找到了对“D-BUS 菜单”的模糊引用,我想这就是我在这里寻找的东西?
有一页提到了一个 libappindicator0.1-cil-dev
用于 Mono 的包,但不清楚这是否是一个可以在 .NET 运行时下运行的可移植库,而且无论如何它似乎不在任何默认的高贵包源中。
我还怀疑应用程序指示器可能独立于窗口工具包,因为它只是跨进程通信菜单的问题,菜单及其图标实际上会显示在哪里?所以,例如,问这是否可以用 Gtk# 完成,我认为可能没什么帮助?
所有这些记录在哪里?:-) 存在样本吗?
我的场景中有超过 100 个(接近 200 个)敌人游戏对象,每秒生成 5-6 个。我正在使用对象池,对象不会每次都被实例化,而只会在需要时才实例化...
我的场景中有超过 100 个(接近 200 个)敌人游戏对象,每秒生成 5-6 个。我使用对象池,对象不会每次都实例化,而只在需要时实例化。我试图记录统计数据,以便显示剩余敌人总数和击落敌人总数。对各个游戏对象进行简单的加减数学运算,结果加起来并不等于应有的数。例如:生成的敌人总数为 200(当我没有杀死一个敌人时)我瞬间杀死了很多敌人,但当我杀死所有敌人时,剩余的敌人并不总是为零。
我尝试在敌人出现时将其逐一杀死,加减运算正确。
那么,如何在不损失准确性的情况下,对多个游戏对象中的变量进行加减操作呢?
public void TookDownEnemy(int enemiesTookDown)
{
//enemiesAlive -= enemiesTookDown;
enemiesTakenDown += enemiesTookDown;
Debug.Log("stats, enemies took down: " + enemiesTakenDown);
UpdateStats();
}
public void SpawnedNewEnemy(int spawned)
{
enemiesAlive += spawned;
UpdateStats();
}
public void UpdateStats()
{
enemiesTakenDownText.text = ": " + enemiesTakenDown.ToString();
enemiesAliveText.text = ": " + (enemiesAlive - enemiesTakenDown).ToString();
}
每当新敌人生成时,我都会从敌人生成的游戏对象中调用 SpawnedNewEnemy,而当新敌人生成时,游戏对象就会调用 TookDownEnemy。
public void InstantiateNewEnemy()
{
StatsManager.Instance.SpawnedNewEnemy(1);
Enemy instance = ObjectPooler.DequeueObject<Enemy>("Enemy");
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;
}
类似地,当敌人被杀或死亡时
if(hp <= 0 && !isDead)
{
//Destroy(this.gameObject); // use pooling here
isDead = true;
StatsManager.Instance.TookDownEnemy(1);
this.GetComponent<Animator>().Play("playDead");
Invoke("EnqueueGameObject", 0.25f);
}
我没有直接对变量进行加减操作,而是创建了三个不同的变量。
其中 enemyRemaining = enemySpawned - enemyTookDown
即使这也有差异。我假设应该有一种方法可以将加法和减法运算排队,而不是仅仅执行它。
更新:我尝试通过排队加法和减法运算并以定义的时间间隔执行这些运算来完成此操作。
public void TookDownEnemy(int enemiesTookDown)
{
enemiesTookDownQueue.Enqueue(enemiesTookDown);
}
public void SpawnedNewEnemy(int spawned)
{
enemiesAliveQueue.Enqueue(spawned);
}
现在我还将敌人的生成数量限制为 260(根据时间,我总共生成 260 个敌人)。当使用队列进行加减时,我 加起来 (双关语)总是得到 80 的差值。其中剩余 80 个敌人,而我击落了 180 个。
这是我每 2 秒将这些数字相加的方法。
public void UpdateStats()
{
while(enemiesAliveQueue.Count > 0)
{
enemiesAlive += (int)enemiesAliveQueue.Dequeue();
}
while(enemiesTookDownQueue.Count > 0)
{
enemiesTakenDown += (int)enemiesTookDownQueue.Dequeue();
}
enemiesTakenDownText.text = ": " + enemiesTakenDown.ToString();
coinsCollectedText.text = ": " + coinsCollected.ToString();
enemiesAliveText.text = ": " + (enemiesAlive - enemiesTakenDown).ToString();
}