#c#
#c#
Вопрос:
Я работаю над RPG и начал работать над восстановлением способностей. У меня есть игрок, которым управляет пользователь (игрок1), и игрок, управляемый компьютером (игрок2) для целей тестирования. Перезарядка способностей отлично работает для игрока, управляемого пользователем, но когда дело доходит до ИИ, компьютер не будет использовать способность, если компьютер не начнет первым (когда перезарядка способности отключена по умолчанию). Ниже приведен код, который, по моему мнению, имеет отношение к вопросу, но если потребуется дополнительная информация, я обновлю сообщение.
Класс способностей:
using UnityEngine;
public class attackList : MonoBehaviour{
public int dmg;
public float coolDown;
public float _attackTimer;
public void Attack1(basePlayer user, basePlayer target, int D)
{
coolDown = 2.5f;
if (user._attackTimer == 0)
{
dmg = D;
user._attackTimer = coolDown;
target.curHealth -= dmg;
}
}
public void cooldown(basePlayer user)
{
if (user._attackTimer > 0) {
user._attackTimer -= Time.deltaTime;
if (user._attackTimer < 0) {
user._attackTimer = 0;
}
}
}
}
Класс логики атаки:
public class attackLogic : MonoBehaviour {
private attackList _attackList = new attackList();
private playerList _playerList = new playerList();
public bool player1_turn = false; //player1 is not allowed to go first by default
public bool player2_turn = false; //player2 is not allowed to go first by default
void Start()
{
int rnd = Random.Range (1,3); // random value between 1 and 2 generated, which will determine what player goes first
if (rnd == 1)
{
player1_turn = true;
}
if (rnd == 2)
{
player2_turn = true;
}
//current health set to the maximum health at the beginning of each fight
_playerList.player1.curHealth = _playerList.player1.maxHealth;
_playerList.player2.curHealth = _playerList.player2.maxHealth;
}
void Update()
{
Logic(); //run through the logic of the battle
}
public void Logic()
{
if (player1_turn == true)
{
_attackList.cooldown(_playerList.player1);
if (Input.GetKeyUp("1"))
{
_attackList.Attack1(_playerList.player1, _playerList.player2, 5);
player1_turn = false;
player2_turn = true;
}
}
if (player2_turn == true)
{
_attackList.cooldown(_playerList.player2);
_attackList.Attack1(_playerList.player2, _playerList.player1, 5);
player1_turn = true;
player2_turn = false;
}
}
}
Комментарии:
1. Интересно, может ли проблема быть связана с тем, как вы
if
настроили свои блоки. А именно, в первом блоке вы устанавливаетеplayer2_turn = true
, а затем во втором блоке вы сразу же проверяетеplayer2_turn == true
, так что в итоге вы оцениваете ход двух игроков в одном обновлении.
Ответ №1:
1) У меня есть неприятное подозрение, что настоящая проблема заключается в Time.deltaTime, но вы не показали код, поэтому я не могу это подтвердить.
2) Поскольку у вас здесь код, основанный на времени, вы не можете ожидать, что он будет вести себя так же, когда вы переходите по коду. Таким образом, это часто помогает избавиться от некоторых старых методов, а именно от инструкций печати. Конечно, за эти годы все изменилось настолько, что стало писать, но идеи все еще работают. Возьмите часть экрана, которая не важна для того, что вы тестируете, и запишите переменные, которые участвуют в том, что вы делаете. Я думаю, вы обнаружите, что player 2 остывает очень медленно.
3) Я думаю, вам нужно лучше понимать объекты. Похоже, вы просто используете их как контейнеры. Мне также не нравятся player1 и player2 — у вас должен быть просто список игроков. Помните, как WOPR потерпел поражение в военных играх? — иногда это может быть очень полезно для балансировки.
Комментарии:
1. На случай, если кто-то не знает, WOPR потерпел поражение, заставив его играть самому
2. Спасибо, Лорен, за твой ответ. К сожалению, я не могу предоставить время. скрипт deltatime, потому что это монохарактеристика, предоставляемая Unity, однако вот ссылка на документацию для функции docs.unity3d.com/ScriptReference/Time-deltaTime.html
3. Также спасибо, что указали на мое неправильное использование объектов, я обязательно проведу дальнейшие исследования. Я создам список игроков в соответствии с вашей рекомендацией.
4. @TimothyWhite Это опровергает мою идею. Я думаю, вам придется отлаживать это так, как я говорю.
5. Между предложениями LorenPechtel и Abion47 я заметил несколько вещей, а именно: 1) player1 работает нормально, и значения перезарядки обновляются без каких-либо проблем. 2) player2 обновит значения перезарядки только в том случае, если я вручную нажму 1 (которая является клавишей, привязанной к attack1) несколько раз, пока время перезарядки player2 не достигнет 0, после чего у player1 будет удалено здоровье. Я немного поработаю с кодом, а затем отправлю ответ, если исправлю его. Надеюсь, эта информация поможет в решении проблемы.