前回は探索中にアイテムを使用する処理を実装しました。今回は戦闘中にアイテムが使えるようにしたいと思います。ItemUiは探索と戦闘の両方同じスクリプトで呼び出しているのですが、実際にボタンを押した時の挙動については戦闘時と探索時で変えたいです。現在が探索中か戦闘中かの状態は、GameManagerのGAMEPHASEが保持しているので、GAMEPHASEを使って処理を分岐させます。
現状、戦闘中にアイテムコマンドを押すと、アイテムのリストが表示されて、回復アイテムであれば実際に使う事ができるのですが、敵とプレイヤーの行動順に関係なく即座に使えてしまい、さらに敵のターンの処理が回ってこず再度プレイヤーが行動を選べてしまいます。あと探索時のアイテム処理と共有しているので使用後に探索コマンドも出てしまいます。
探索コマンドのバグはすぐに直せます。gamePhase==QUESTの場合のみ探索コマンドを表示するようにすればいいだけです。
アイテム使用後は「やめる」ボタンを表示しないようにしたいので、ItemEventでCommandUIManagerの処理を実行できるように、ItemUsePanelでItemEventコンポーネントを追加する時に、CommandUIManagerを渡すようにします。あとgamePhaseがBATTLEのときはbuttonState.onClick.AddListenerで別の関数を登録するようにします。
クリックで展開
public class ItemUsePanel : MonoBehaviour
{
public PlayerUIManager playerUIManager;
public GameObject itemCanvas;
public GameObject itemUI;
public GameObject cancelButton;
public CommandUIManager commandUI;
public bool canTapItemUsePanel = true;
public void SetHealItemUsePanel(GameObject useItemMessagePanel,ItemData itemData,ItemUsePanel itemUsePanel)
{
var itemEvent = targetPartyMember.AddComponent<itemEvent>();
itemEvent.useItemMessaagePanel = useItemMessagePanel;
itemEvent.itemData = itemData;
itemEvent.itemUsePanel = itemUsePanel;
itemEvent.playerUIManager = this.playerUIManager;
itemEvent.cancelButton = cancelButton;
itemEvent.commandUI = this.commandUI;
itemEvent.itemCanvas = this.itemCanvas;
if (GameManager.instance.gamePhase == GameManager.GAMEPHASE.QUEST)
{
buttonState.onClick.AddListener(() => itemEvent.UseHealItem(PlayerManager.instance));
}else if (GameManager.instance.gamePhase == GameManager.GAMEPHASE.BATTLE)
{
buttonState.onClick.AddListener(() => itemEvent.UseHealItemOnBattle(PlayerManager.instance));
}
}
}
それからCommandUIManager.csで戦闘中のキャンセルボタンを非表示にする関数を定義しておきます。
クリックで展開
public void HideCancelButton()
{
cancelButton.SetActive(false);
}
itemEvent.csに戦闘中に回復アイテムを使用する関数を定義します。とりあえずその関数の一番初めに「やめる」ボタンを非表示するようにしておきます。
クリックで展開
public class itemEvent : MonoBehaviour
{
ItemManager itemManager;
public ItemData itemData;
public GameObject itemCanvas;
public ItemUsePanel itemUsePanel;
public ItemUI itemUI;
public GameObject itemUIView;
public GameObject useItemMessaagePanel;
public Text useItemText;
TermManager termManagerF;
public PlayerUIManager playerUIManager;
public GameObject cancelButton;
public CommandUIManager commandUI;
public void UseHealItemOnBattle(PlayerManager player)
{
if (itemUsePanel.canTapItemUsePanel)
{
itemUsePanel.canTapItemUsePanel = false;
StartCoroutine(IEUseHealItemOnBattle(player));
}
}
public IEnumerator IEUseHealItemOnBattle(PlayerManager player)
{
commandUI.HideCancelButton();
commandUI.ShowDialogUI();
itemUsePanel.gameObject.SetActive(false);
itemUIView.SetActive(false);
DialogTextManager.instance.SetScenarios(new string[] {
player.pname + "は" + itemData.itemName + "を使った!" });
Debug.Log("Wait前");
SoundManager.instance.PlaySE(itemData.UseSEID);
yield return new WaitForSeconds(0.7f);
Debug.Log("回復量計算前");
int hpPoint = (int)(player.maxHp * itemData.HPHealRateValue + itemData.healHPPoint);
int mpPoint = (int)(player.maxMp * itemData.MPHealRateValue + itemData.healMPPoint);
int tpPoint = (int)(player.maxTp * itemData.TPHealRateValue + itemData.healTPPoint);
player.hp += hpPoint;
player.mp += mpPoint;
player.tp += tpPoint;
bool wasItemEffective = false;
if (player.hp > player.maxHp)
{
hpPoint -= player.hp - player.maxHp;
player.hp = player.maxHp;
}
if(hpPoint > 0)
{
DialogTextManager.instance.SetScenarios(new string[] {
player.pname + "のHPが" + hpPoint + "回復した!" });
SoundManager.instance.PlaySE(12);
yield return new WaitForSeconds(1.2f);
wasItemEffective = true;
}
if (player.mp > player.maxMp)
{
mpPoint -= player.mp - player.maxMp;
player.mp = player.maxMp;
}
if(mpPoint > 0)
{
DialogTextManager.instance.SetScenarios(new string[] {
player.pname + "のHPが" + mpPoint + "回復した!" });
SoundManager.instance.PlaySE(12);
yield return new WaitForSeconds(1.2f);
wasItemEffective = true;
}
if (player.tp > player.maxTp)
{
tpPoint -= player.tp - player.maxTp;
player.tp = player.maxTp;
}
if(tpPoint > 0)
{
DialogTextManager.instance.SetScenarios(new string[] {
player.pname + "のTPが" + tpPoint + "回復した!" });
SoundManager.instance.PlaySE(12);
yield return new WaitForSeconds(1.2f);
wasItemEffective = true;
}
TermManager termManager = new TermManager();
if (player.statusCondiWithLastTurn[itemData.careCondition1] > 0)
{
player.statusCondiWithLastTurn[itemData.careCondition1] = 0;
string statusMessage = termManager.Get_STATUSCONDI_Message(itemData.careCondition1, false);
DialogTextManager.instance.SetScenarios(new string[] {player.pname + statusMessage});
yield return new WaitForSeconds(1.2f);
wasItemEffective = true;
}
if (player.statusCondiWithLastTurn[itemData.careCondition2] > 0)
{
player.statusCondiWithLastTurn[itemData.careCondition2] = 0;
string statusMessage = termManager.Get_STATUSCONDI_Message(itemData.careCondition2, false);
DialogTextManager.instance.SetScenarios(new string[] { player.pname + statusMessage });
yield return new WaitForSeconds(1.2f);
wasItemEffective = true;
}
if (player.statusCondiWithLastTurn[itemData.careCondition3] > 0)
{
player.statusCondiWithLastTurn[itemData.careCondition3] = 0;
string statusMessage = termManager.Get_STATUSCONDI_Message(itemData.careCondition3, false);
DialogTextManager.instance.SetScenarios(new string[] { player.pname + statusMessage });
yield return new WaitForSeconds(1.2f);
wasItemEffective = true;
}
if(itemData.tempEnforceSta1 != GeneralEnum.STATUS.NONE)
{
if(itemData.enforceRate1 >= 0)
{
yield return StartCoroutine(StatusEnforce(player, itemData.tempEnforceSta1, itemData.enforceTurn1, itemData.enforceRate1));
wasItemEffective = true;
}
else
{
yield return StartCoroutine(StatusWeakened(player, itemData.tempEnforceSta1, itemData.enforceTurn1, itemData.enforceRate1));
wasItemEffective = true;
}
}
if(itemData.tempEnforceSta2 != GeneralEnum.STATUS.NONE)
{
if(itemData.enforceRate2 >= 0)
{
yield return StartCoroutine(StatusEnforce(player, itemData.tempEnforceSta2, itemData.enforceTurn2, itemData.enforceRate2));
wasItemEffective = true;
}
else
{
yield return StartCoroutine(StatusWeakened(player, itemData.tempEnforceSta2, itemData.enforceTurn2, itemData.enforceRate2));
wasItemEffective = true;
}
}
if(itemData.tempEnforceSta3 != GeneralEnum.STATUS.NONE)
{
if(itemData.enforceRate3 >= 0)
{
yield return StartCoroutine(StatusEnforce(player, itemData.tempEnforceSta3, itemData.enforceTurn3, itemData.enforceRate3));
wasItemEffective = true;
}
else
{
yield return StartCoroutine(StatusWeakened(player, itemData.tempEnforceSta3, itemData.enforceTurn3, itemData.enforceRate3));
wasItemEffective = true;
}
}
if (!wasItemEffective)
{
DialogTextManager.instance.SetScenarios(new string[] {"しかし何もおこらなかった"});
yield return new WaitForSeconds(1.2f);
}
useItemMessaagePanel.SetActive(false);
playerUIManager.UpdateUI(PlayerManager.instance);
CloseItemMessageAndPanel();
}
UseHealItemOnBattleには状態異常の回復処理や、ステータスの強化処理なども入れておきました。これらはまだ完全には実装されていないので、戦闘中に効果を及ぼすことはないですが、状態異常解除やステータス強化のメッセージは表示されるようになっています。
これでうまくいくのかと思いきや残念ながらうまく動きませんでした。理由は不明ですが、アイテム使用後のメッセージを表示する際のコルーチンのWaitForSecondのところで止まってしまいます。
youtu.be