gpt4 book ai didi

c# - 在基于 Unity 的 Roguelike 中调整代码执行

转载 作者:太空宇宙 更新时间:2023-11-03 15:35:25 28 4
gpt4 key购买 nike

[更新] 我尝试使用下面的建议,但仍然有一个问题,即敌人似乎同时移动,并且当第一次看到是否已经有敌人在视线中时,他们每个移动两次。我真正想做的是在玩家视线中的敌人的行动之间有一个延迟,这样他们就不会同时移动、播放声音等...

更新后的代码是:

    private IEnumerator takeAllEnemyActions()
{
// Cycle through all enemies and have them perform their actions
if (Enemies != null && Enemies.Length > 0)
{
bool foundEnemyInLoS = false;
Enemy lastEnemy = null;
foreach (GameObject enemy in Enemies)
{
// Cache the enemies script
Enemy thisEnemy = enemy.GetComponent<Enemy>();

// If it is not this enemies turn to move then move on to the next enemy
if (thisEnemy.NextMoveTick > GameManager.Instance.CurrentTick)
{
continue;
}

// Check to see is this enemy is the first enemy in the players line of sight (If there is one)
if (!foundEnemyInLoS && thisEnemy.isInLineOfSightOfPlayer())
{
// If so then we save it for last to ensure that if any enemy is called with a delay that the last one does not make the player wait to move
foundEnemyInLoS = true;
lastEnemy = thisEnemy;
continue;
}

// At this point only enemies whose turn it is and who are not being saved for later can act
thisEnemy.TakeEnemyActions();

// If the enemy was in the players line of sight wait 200ms before continuing
if (thisEnemy.isInLineOfSightOfPlayer())
{
yield return new WaitForSeconds(0.5f);
}
}

// if there were enemies in the players line of sight then one was saved for last
// Take its action without a delay so the player can go next
if (foundEnemyInLoS)
{
lastEnemy.TakeEnemyActions();
}
}

原始问题:在 Unity3d 5 中自上而下的 2d 回合制 roguelike 我遇到了游戏节奏问题。我正在使用一个非常简单的状态机来控制执行,但我希望所有在同一回合移动的敌人都在玩家视线范围内的情况下在每个敌人之间暂停,以便动画和声音有时间发生而不重叠(尤其是声音)。我遇到的唯一问题是在不影响动画或相机移动的情况下让实际暂停发生(相机可能会滑动以跟随玩家移动并且它正在停止)。在移动到下一个敌人之前,我只需要大约 100 毫秒的停顿。

敌人在 EnemyManager 脚本中的 foreach 循环中采取行动

private void takeAllEnemyActions()
{
// Cycle through all enemies and have them perform their actions
if (Enemies != null && Enemies.Length > 0)
{
foreach (GameObject enemy in Enemies)
if (enemy.GetComponent<Enemy>().NextMoveTick <= GameManager.Instance.CurrentTick)
enemy.GetComponent<Enemy>().TakeEnemyActions();
}
GameManager.States.NextPlayState();
}

我尝试创建一个例程来调用每个敌人采取行动,但问题是其他敌人的处决仍在继续。

我尝试使用协程,但问题是游戏会继续进入下一个状态。

我什至尝试使用 Time.RealTimeSinceStartup 进行 while-do 循环,只是为了看看它会做什么(我知道,这是一个非常非常糟糕的主意)

我敢肯定这很简单,我只是脑抽筋了,但我已经尝试了好几个小时,也没有任何进展。感谢上帝让 git 回滚。

有没有人对最佳方式有任何建议?我不需要有人来编写我的代码,我只需要指明正确的方向。

谢谢

最佳答案

为每个语句使用协程和 yield。这是一些修改后的代码。

private IEnumerator TakeAllEnemyActions() {
// Cycle through all enemies and have them perform their actions
if (enemies != null && enemies.Length > 0) {
foreach (var enemy in enemies) {
if (enemy.GetComponent<Enemy>().NextMoveTick <= GameManager.Instance.CurrentTick) {
enemy.GetComponent<Enemy>().TakeEnemyActions();
yield return new WaitForSeconds (0.1f);
}
}
}
GameManager.States.NextPlayState();
}

调用这个方法

 StartCoroutine(TakeAllEnemyActions());

关于c# - 在基于 Unity 的 Roguelike 中调整代码执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32029328/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com