-
-
Save todorok1/35de82107e6f5860f7531a23b355a0ba to your computer and use it in GitHub Desktop.
シンプルRPGチュートリアル第54回 攻撃に関する行動を処理するクラス
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System.Collections; | |
using UnityEngine; | |
namespace SimpleRpg | |
{ | |
/// <summary> | |
/// 戦闘中の攻撃アクションを処理するクラスです。 | |
/// </summary> | |
public class BattleActionProcessorAttack : MonoBehaviour, IBattleActionProcessor | |
{ | |
/// <summary> | |
/// 戦闘中のアクションを処理するクラスへの参照です。 | |
/// </summary> | |
BattleActionProcessor _actionProcessor; | |
/// <summary> | |
/// 戦闘に関する機能を管理するクラスへの参照です。 | |
/// </summary> | |
BattleManager _battleManager; | |
/// <summary> | |
/// メッセージウィンドウを制御するクラスへの参照です。 | |
/// </summary> | |
MessageWindowController _messageWindowController; | |
/// <summary> | |
/// 戦闘中の敵キャラクターの管理を行うクラスへの参照です。 | |
/// </summary> | |
EnemyStatusManager _enemyStatusManager; | |
/// <summary> | |
/// 戦闘関連のスプライトを制御するクラスへの参照です。 | |
/// </summary> | |
BattleSpriteController _battleSpriteController; | |
/// <summary> | |
/// 参照をセットします。 | |
/// </summary> | |
public void SetReferences(BattleManager battleManager, BattleActionProcessor actionProcessor) | |
{ | |
_battleManager = battleManager; | |
_actionProcessor = actionProcessor; | |
_messageWindowController = _battleManager.GetWindowManager().GetMessageWindowController(); | |
_enemyStatusManager = _battleManager.GetEnemyStatusManager(); | |
_battleSpriteController = _battleManager.GetBattleSpriteController(); | |
} | |
/// <summary> | |
/// 攻撃のアクションを処理します。 | |
/// </summary> | |
public void ProcessAction(BattleAction action) | |
{ | |
var actorParam = _actionProcessor.GetCharacterParameter(action.actorId, action.isActorFriend); | |
var targetParam = _actionProcessor.GetCharacterParameter(action.targetId, action.isTargetFriend); | |
int damage = BattleCalculator.CalculateDamage(actorParam.strength, targetParam.guard); | |
int hpDelta = damage * -1; | |
int mpDelta = 0; | |
bool isTargetDefeated = false; | |
if (action.isTargetFriend) | |
{ | |
CharacterStatusManager.ChangeCharacterStatus(action.targetId, hpDelta, mpDelta); | |
isTargetDefeated = CharacterStatusManager.IsCharacterDefeated(action.targetId); | |
} | |
else | |
{ | |
_enemyStatusManager.ChangeEnemyStatus(action.targetId, hpDelta, mpDelta); | |
isTargetDefeated = _enemyStatusManager.IsEnemyDefeated(action.targetId); | |
if (isTargetDefeated) | |
{ | |
_enemyStatusManager.OnDefeatEnemy(action.targetId); | |
} | |
} | |
_actionProcessor.SetPauseProcess(true); | |
StartCoroutine(ShowAttackMessage(action, damage, isTargetDefeated)); | |
} | |
/// <summary> | |
/// 攻撃のメッセージを表示します。 | |
/// </summary> | |
IEnumerator ShowAttackMessage(BattleAction action, int damage, bool isTargetDefeated) | |
{ | |
string actorName = _actionProcessor.GetCharacterName(action.actorId, action.isActorFriend); | |
string targetName = _actionProcessor.GetCharacterName(action.targetId, action.isTargetFriend); | |
_actionProcessor.SetPauseMessage(true); | |
_messageWindowController.GenerateAttackMessage(actorName); | |
while (_actionProcessor.IsPausedMessage) | |
{ | |
yield return null; | |
} | |
_actionProcessor.SetPauseMessage(true); | |
_messageWindowController.GenerateDamageMessage(targetName, damage); | |
_battleManager.OnUpdateStatus(); | |
while (_actionProcessor.IsPausedMessage) | |
{ | |
yield return null; | |
} | |
if (!isTargetDefeated) | |
{ | |
_actionProcessor.SetPauseProcess(false); | |
yield break; | |
} | |
if (action.isTargetFriend) | |
{ | |
_actionProcessor.SetPauseMessage(true); | |
_messageWindowController.GenerateDefeateFriendMessage(targetName); | |
while (_actionProcessor.IsPausedMessage) | |
{ | |
yield return null; | |
} | |
if (CharacterStatusManager.IsAllCharacterDefeated()) | |
{ | |
_battleManager.OnGameover(); | |
} | |
} | |
else | |
{ | |
_actionProcessor.SetPauseMessage(true); | |
_battleSpriteController.HideEnemy(); | |
_messageWindowController.GenerateDefeateEnemyMessage(targetName); | |
while (_actionProcessor.IsPausedMessage) | |
{ | |
yield return null; | |
} | |
if (_enemyStatusManager.IsAllEnemyDefeated()) | |
{ | |
_battleManager.OnEnemyDefeated(); | |
} | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment