//----------------------------------------------------------------------- /*! * @brief 現在の行動パラメータを取得 */ //----------------------------------------------------------------------- public MasterDataEnemyActionParam GetCurrentActionParam() { MasterDataEnemyActionParam actionParam = null; //-------------------------------- // テーブル切り替え時:行動IDがある場合 // @add Developer v320 //-------------------------------- if (m_ActionSwitchParamID > UNUSE_ACTIONPARAM_ID) { // アクションパラメータのマスターデータを取得 actionParam = BattleParam.m_MasterDataCache.useEnemyActionParam((uint)m_ActionSwitchParamID); return(actionParam); } //-------------------------------- // 現在の行動テーブルデータを参照する //-------------------------------- MasterDataEnemyActionTable tableData = GetCurrentActionTableParam(); if (tableData == null) { return(null); } //-------------------------------- // 現在のアクションパラメータを取得 //-------------------------------- int actionStep = m_ActionStep; int[] actionParamIDArray = { tableData.action_param_id1, tableData.action_param_id2, tableData.action_param_id3, tableData.action_param_id4, tableData.action_param_id5, tableData.action_param_id6, tableData.action_param_id7, tableData.action_param_id8 }; int actionParamID = actionParamIDArray[actionStep]; if (actionParamID == UNUSE_ACTIONPARAM_ID) { return(null); } //-------------------------------- // アクションパラメータのマスターデータの取得 //-------------------------------- actionParam = BattleParam.m_MasterDataCache.useEnemyActionParam((uint)actionParamID); return(actionParam); }
// マスターデータを取得(同時にキャッシュもされます) public T use(uint id) { if (id == 0) { return(null); } if (m_Dictionary == null) { m_Dictionary = new Dictionary <uint, T>(); } if (m_Dictionary.ContainsKey(id)) { return(m_Dictionary[id]); } T master_data = null; #if BUILD_TYPE_DEBUG // デバッグ用の一時的なマスターデータがあればそこから取得 if (m_DebugAllData != null) { for (int idx = 0; idx < m_DebugAllData.Length; idx++) { T wrk_master_data = m_DebugAllData[idx]; if (wrk_master_data != null && wrk_master_data.fix_id == id ) { master_data = wrk_master_data; break; } } m_Dictionary[id] = master_data; return(master_data); } #endif if (typeof(T) == typeof(MasterDataParamEnemy) || typeof(T) == typeof(MasterDataEnemyActionTable) || typeof(T) == typeof(MasterDataEnemyActionParam) ) { // クエストのたびにサーバからもらうもの //敵のマスターデータのうち MasterDataParamEnemy・MasterDataEnemyActionTable・MasterDataEnemyActionParam は PacketStructQuestBuildから毎回取得しているようです(おそらくチート対策) if (BattleParam.m_QuestBuild != null ) { if (typeof(T) == typeof(MasterDataParamEnemy) && BattleParam.m_QuestBuild.list_e_param != null ) { for (int idx = 0; idx < BattleParam.m_QuestBuild.list_e_param.Length; idx++) { MasterDataParamEnemy wrk_master_data = BattleParam.m_QuestBuild.list_e_param[idx]; if (wrk_master_data != null && wrk_master_data.fix_id == id ) { master_data = wrk_master_data as T; break; } } } else if (typeof(T) == typeof(MasterDataEnemyActionTable) && BattleParam.m_QuestBuild.list_e_acttable != null ) { for (int idx = 0; idx < BattleParam.m_QuestBuild.list_e_acttable.Length; idx++) { MasterDataEnemyActionTable wrk_master_data = BattleParam.m_QuestBuild.list_e_acttable[idx]; if (wrk_master_data != null && wrk_master_data.fix_id == id ) { master_data = wrk_master_data as T; break; } } } else if (typeof(T) == typeof(MasterDataEnemyActionParam) && BattleParam.m_QuestBuild.list_e_actparam != null ) { for (int idx = 0; idx < BattleParam.m_QuestBuild.list_e_actparam.Length; idx++) { MasterDataEnemyActionParam wrk_master_data = BattleParam.m_QuestBuild.list_e_actparam[idx]; if (wrk_master_data != null && wrk_master_data.fix_id == id ) { master_data = wrk_master_data as T; break; } } } } #if BUILD_TYPE_DEBUG && USE_LOCAL_ENEMY_MASTER if (master_data == null) { master_data = _getMasterData(id); } #endif //USE_LOCAL_ENEMY_MASTER } else { master_data = _getMasterData(id); } m_Dictionary[id] = master_data; return(master_data); }
/// <summary> /// 敵にしゃべらせる /// </summary> /// <param name="enemyIndex"></param> /// <param name="enemyActionParam"></param> public void talk(int enemyIndex, MasterDataEnemyActionParam enemyActionParam) { if (enemyActionParam == null) { return; } //---------------------------------------- // エラーチェック //---------------------------------------- if (enemyIndex < 0 || enemyIndex >= BattleParam.m_EnemyParam.Length) { return; } string message = enemyActionParam.skill_name; if (message != null && message != "") { if (m_BossTalkArea != null && m_BossTalkAreaFrame != null && m_BossTalkAreaMessage != null) { TextMeshPro text_mesh = m_BossTalkAreaMessage.GetComponent <TextMeshPro>(); text_mesh.text = message; // 行数を調べる int line_count = 1; int start_index = 0; while (true) { int idx = message.IndexOf('\n', start_index); if (idx >= 0) { line_count++; start_index = idx + 1; } else { break; } } // 表示行数に合わせて下地のサイズを広げる const float FRAME_LINE_HEIGHT = 0.66f; // 文字一行分の高さ const float FRAME_BORDER_HEIGHT = 1.0f - FRAME_LINE_HEIGHT; // 下地枠の高さ float talk_area_frame_y_scale = FRAME_BORDER_HEIGHT + FRAME_LINE_HEIGHT * line_count; m_BossTalkAreaFrame.transform.localScale = new Vector3(14.0f, talk_area_frame_y_scale, 1.0f); // 表示時間設定 m_BossTalkTimer = enemyActionParam.wait_time / 1000.0f; // 表示時間(ミリ秒を秒へ変換) if (m_BossTalkTimer > 0.0f) { if (m_BossTalkTimer < 0.3f) { // 短すぎる時間は設定ミスの可能性があるので一瞬だけ見えるようにする(何も見えないとバグに気付けない) m_BossTalkTimer = 0.3f; } } else { const float TALK_TIME_DEFAULT = 1.5f; // デフォルトの表示時間(1.5秒) m_BossTalkTimer = TALK_TIME_DEFAULT; } m_BossTalkArea.SetActive(true); } playAnimation(enemyIndex, AnimationType.TALK); DebugBattleLog.writeText(DebugBattleLog.StrOpe + "敵行動:セリフ「" + message + "」"); } }
/// <summary> /// 敵ユニットによる攻撃 /// </summary> /// <param name="enemyIndex"></param> /// <param name="actionParam"></param> public void attack(int enemyIndex, MasterDataEnemyActionParam actionParam, BattleSceneUtil.MultiInt damage_value, BattleSceneUtil.MultiInt damage_target) { //---------------------------------------- // エラーチェック //---------------------------------------- if (enemyIndex < 0 || enemyIndex >= BattleParam.m_EnemyParam.Length) { return; } //---------------------------------------- // 各種設定の取得 //---------------------------------------- MasterDataDefineLabel.EnemyMotionType attackMotion; MasterDataDefineLabel.EnemyATKShakeType shakeScreen; MasterDataDefineLabel.BoolType damageEffect; MasterDataDefineLabel.UIEffectType effectID; int seID; if (actionParam != null) { //---------------------------------------- // 行動定義の設定値 //---------------------------------------- attackMotion = actionParam.attack_motion; shakeScreen = actionParam.shake_screen; damageEffect = actionParam.damage_effect; effectID = actionParam.effect_id; seID = actionParam.se_id; } else { //---------------------------------------- // デフォルト値 //---------------------------------------- attackMotion = MasterDataDefineLabel.EnemyMotionType.ATK_00; shakeScreen = MasterDataDefineLabel.EnemyATKShakeType.NORMAL; damageEffect = MasterDataDefineLabel.BoolType.ENABLE; effectID = 0; seID = (int)SEID.SE_BATLE_ATTACK_EN_NORMAL; } //---------------------------------------- // 攻撃モーション再生 //---------------------------------------- if (attackMotion != MasterDataDefineLabel.EnemyMotionType.NONE) { playAnimation(enemyIndex, AnimationType.ATTACK); } if (damageEffect == MasterDataDefineLabel.BoolType.ENABLE && m_BattlePlayerPartyViewControl != null ) { MasterDataDefineLabel.ElementType element_type = BattleParam.m_EnemyParam[enemyIndex].getMasterDataParamChara().element; // 属性指定攻撃の場合はその属性のエフェクト if (actionParam != null && actionParam.skill_type == MasterDataDefineLabel.EnemySkillCategory.ATK_ELEM) { element_type = actionParam.Get_ATK_ELEM_TARGET_ELEM(); } if (element_type != MasterDataDefineLabel.ElementType.NONE) { GameObject effect_prefab = null; switch (element_type) { case MasterDataDefineLabel.ElementType.FIRE: effect_prefab = SceneObjReferGameMain.Instance.m_EffectPrefab.m_2DPlayerDamage[(int)MasterDataDefineLabel.ElementType.FIRE]; break; case MasterDataDefineLabel.ElementType.WATER: effect_prefab = SceneObjReferGameMain.Instance.m_EffectPrefab.m_2DPlayerDamage[(int)MasterDataDefineLabel.ElementType.WATER]; break; case MasterDataDefineLabel.ElementType.DARK: effect_prefab = SceneObjReferGameMain.Instance.m_EffectPrefab.m_2DPlayerDamage[(int)MasterDataDefineLabel.ElementType.DARK]; break; case MasterDataDefineLabel.ElementType.LIGHT: effect_prefab = SceneObjReferGameMain.Instance.m_EffectPrefab.m_2DPlayerDamage[(int)MasterDataDefineLabel.ElementType.LIGHT]; break; case MasterDataDefineLabel.ElementType.NAUGHT: effect_prefab = SceneObjReferGameMain.Instance.m_EffectPrefab.m_2DPlayerDamage[(int)MasterDataDefineLabel.ElementType.NAUGHT]; break; case MasterDataDefineLabel.ElementType.WIND: effect_prefab = SceneObjReferGameMain.Instance.m_EffectPrefab.m_2DPlayerDamage[(int)MasterDataDefineLabel.ElementType.WIND]; break; case MasterDataDefineLabel.ElementType.NONE: default: break; } if (effect_prefab != null) { m_BattlePlayerPartyViewControl.setDamageEffectMember(effect_prefab, damage_target); } } } //---------------------------------------- // 攻撃エフェクト //---------------------------------------- playDamageEffect(effectID, enemyIndex, true); //---------------------------------------- // SE再生 //---------------------------------------- if (seID != (int)SEID.SE_NONE) { SoundUtil.PlaySE((SEID)seID); } }