//#define FIGHT_TEST
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System;
using DG.Tweening;
using BehaviorDesigner.Runtime;
using BehaviorDesigner.Runtime.Tasks;
using UnityEngine.AI;
using YLBattle;
using UnityGameFramework.Runtime;
using AdonGameKit;
using Adon.Game.BO;
///
/// 角色管理者
///
public class RoleManager : MonoBehaviour
{
//
/// 单键
///
private static RoleManager m_Instance;
///
/// 已创建的怪物角色
///
public Dictionary> mCreateMonsterRoles = new Dictionary>();
///
/// 玩家创建的角色
///
private Dictionary mPlayerRoles = new Dictionary();
private Dictionary mFriendRoles = new Dictionary();
/////
///// 玩家镜像角色
/////
//private List mMirrorPlayerRoles = new List();
///
/// 英雄的数据
///
private List mHeroVos = new List();
/////
///// 玩家镜像的英雄数据
/////
//private List mMirrorHeroVos = new List();
///
/// 当前的区域
///
private int mCurArea = 1;
///
/// 创建的言灵
///
private Dictionary mCreateYanLings = new Dictionary();
///
/// 本场角色资源数据
///
private Dictionary mRoleRes = new Dictionary();
///
/// 镜像的行为树
///
private List mMirrorBTS = new List();
private List mMonsterList = new List();
///
/// 言灵资源
///
private List mYanLingRess = new List();
private bool _bossLive = false;
private Vector3 diePos;
///
/// 传送门
///
private ChuanSongMen chuanSongMen = null;
public bool BoosLive
{
get
{
return this._bossLive;
}
}
///
/// 刷新时间
///
private float _refreshTime = 1.0f;
///
/// 刷新计时器
///
private float _refreshNowTime = 0.0f;
///
/// 上次的玩家索引
///
private int lastPlayerIndex = -1;
private int curPlayerIndex = -1;
///
/// 单键
///
public static RoleManager Instance
{
get
{
if (m_Instance == null)
{
m_Instance = GameObject.Find("RoleManager").AddComponent();
}
return m_Instance;
}
}
public void SetFriendPosition(string uid, float x, float y, float z)
{
foreach (var r in this.mFriendRoles)
{
if (uid == r.Value.playerUID)
{
Vector3 pos = new Vector3(x, y, z);
r.Value.mNavMeshAgent.SetDestination(pos);
float speed = (pos - r.Value.transform.position).magnitude;
if (speed > 1.0f)
{
speed = 1;
}
else if (speed < 0.05f)
{
speed = 0;
}
r.Value.mAnimator.SetFloat(Animator.StringToHash("ForwardSpeed"), speed);
}
}
}
public void SetFiendStatus(string uid, string propertyName, string pValue)
{
foreach (var r in this.mFriendRoles)
{
if (uid == r.Value.playerUID)
{
switch (propertyName)
{
case "SetBool":
{
Adon.Game.Data.StructData.Attack_MsgData msgData = new Adon.Game.Data.StructData.Attack_MsgData();
CommonManager.Desrialize(msgData, pValue);
BaseHero bh = r.Value.gameObject.GetComponent();
bh.SetAnimatorStatusAttack(msgData);
}
break;
case "SetTrigger":
r.Value.mAnimator.SetTrigger(int.Parse(pValue));
break;
case "DashAttack":
{
Adon.Game.Data.StructData.Rush_MsgData msgData = new Adon.Game.Data.StructData.Rush_MsgData();
CommonManager.Desrialize(msgData, pValue);
BaseHero bh = r.Value.gameObject.GetComponent();
bh.OnMsg_DashAttack(msgData);
}
break;
case "Rush":
{
BaseHero bh = r.Value.gameObject.GetComponent();
bh.SetAnimatorStatusRush();
}
break;
case "Skill":
{
BaseHero bh = r.Value.gameObject.GetComponent();
bh.SetAnimatorStatusSkill();
}
break;
case "Idle":
{
BaseHero bh = r.Value.gameObject.GetComponent();
bh.SetAnimatorStatusIdle();
}
break;
}
//r.Value.mAnimator.SetBool(int.Parse(propertyName), bool.Parse(pValue));
}
}
}
public void SetDiePosition(Vector3 pos)
{
diePos = pos;
}
///
/// 获取玩家
///
public Role GetPlayer(bool containHide = false)
{
foreach (var item in mPlayerRoles)
{
if (item.Value == null)
{
continue;
}
if (containHide)
{
return item.Value;
}
else if (item.Value.gameObject.activeSelf)
{
return item.Value;
}
}
return null;
}
// 刷新玩家数据
public void UpdatePlayerDate()
{
foreach (var item in mPlayerRoles)
{
if (item.Value == null)
{
continue;
}
BattleUnitBase battleUnitBase = item.Value as BattleUnitBase;
battleUnitBase.Init(new YLBattleUnit(item.Value.mData.mHeroVo.mo, item.Value.mData.mHeroVo));
}
}
///
/// 通过自然id 返回
///
///
///
public Role GetRole(int id)
{
// 在我的英雄里查找
foreach (var item in mPlayerRoles)
{
if (item.Value != null && id == item.Value.mData.UID)
{
return item.Value;
}
}
// 在创建的怪物中查找
foreach (var area in this.mCreateMonsterRoles)
{
foreach (var role in area.Value)
{
if (role != null && id == role.mData.UID)
{
return role;
}
}
}
return null;
}
///
/// 获取生存的怪物
///
///
public List GetLiveMonsters()
{
mMonsterList.Clear();
foreach (var item in mCreateMonsterRoles)
{
foreach (var monster in item.Value)
{
mMonsterList.Add(monster);
}
}
return mMonsterList;
}
///
/// 初始化英雄
///
public void InitHeros(bool isGuide = false)
{
mCreateYanLings.Clear();
mHeroVos.Clear();
//mMirrorHeroVos.Clear();
//mMirrorPlayerRoles.Clear();
var teamVo = UserProxy.Instance.player.heroTeamConfig;
Ins_TeamInfo curVo = teamVo.teamDic[teamVo.curUseTeamID];
// 获取队伍角色
for (int i = 0; i < curVo.heros.Count; i++)
{
GameHeroVo heroVo = UserProxy.Instance.player.collectHero.GetHeroGameInfoByHeroUId(curVo.heros[i]);
if (heroVo != null)
{
heroVo.isLocked = false;
mHeroVos.Add(heroVo);
}
}
// 创建角色
if (!isGuide)
{
StartCoroutine("CreatePlayers", 0);
StartCoroutine("CreatePlayers", 1);
StartCoroutine("CreatePlayers", 2);
}
// 挂载战报系统
this.gameObject.AddComponent();
}
///
/// 初始化挑战英雄
///
public void InitChallengeHeros()
{
mCreateYanLings.Clear();
mHeroVos.Clear();
//mMirrorHeroVos.Clear();
//mMirrorPlayerRoles.Clear();
VSHeroInfo _heroInfo = LevelManager.Instance().mParameter as VSHeroInfo;
if (_heroInfo == null)
{
Debug.LogError("挑战镜像数据异常!!!");
return;
}
mHeroVos.AddRange(_heroInfo.selfHeros);
//mMirrorHeroVos.AddRange(_heroInfo.otherHeros);
}
///
/// 设置玩家角色
///
/// 角色索引
public IEnumerator CreatePlayers(int index)
{
if (index >= 0 && index < mHeroVos.Count)
{
// 存在
if (mPlayerRoles.ContainsKey(index))
{
yield break; ;
}
// 创建 默认地图出生点
Vector3 createPos = Vector3.zero;
Quaternion createRotation = Quaternion.identity;
// 返回副本记录点
if (GameDateManager.Instance.IsBackDoor)
{
createPos = GameDateManager.Instance.CreatePosition;
}
// 返回据点传送阵 MapTcpProxy.Instance.Peer.MapData.BirthPoint 为非死亡时 zheng chan存储
else if (GameDateManager.Instance.CreateMapSwitchPoint == 0 || GameDateManager.Instance.isBackDie)
{
Transform liveTran = GameObject.Find("AIManager/Area1/0").transform;
createPos = liveTran.position;
createRotation = liveTran.rotation;
// 如果使用回城券 创建 返回传送门
if (GameDateManager.Instance.isBackTicket)
{
GameDateManager.Instance.isBackTicket = false;
ResourceHelper.Instance.LoadAssetBundle("Scene_BackDoor", ab =>
{
if (ab != null)
{
GameObject bdObj = (GameObject)Instantiate(ab.LoadAsset("Scene_BackDoor"));
bdObj.SetActive(true);
//bdObj.transform.SetParent(this.transform);
bdObj.transform.localPosition = createPos + Vector3.forward * 2f;
bdObj.transform.localRotation = createRotation;
}
});
}
}
// 需要移动到地图切换器入口处
else
{
SceneEventMapSwitchLogic swiObj = null;
while (swiObj == null)
{
yield return 0;
swiObj = SceneCmptManager.Instance.GetMapSwitchCmptByIndex(GameDateManager.Instance.CreateMapSwitchPoint);
if (swiObj != null)
{
swiObj.SetTeleportClose();
Transform liveTran = swiObj.transform.Find("createPoint");
createPos = liveTran.position;
createRotation = liveTran.rotation;
break;
}
}
}
GameDateManager.Instance.isBackDie = false;
Vector3 pos = createPos + new Vector3(UnityEngine.Random.Range(-1.5f, 1.5f), 0, UnityEngine.Random.Range(-1.5f, 1.5f));
CreateHero(mHeroVos[index], pos, createPos, 5, "PlayerBT", (role) =>
{
//role.gameObject.SetActive(false);
role.transform.rotation = createRotation;
NavMeshAgent nav = role.gameObject.GetComponent();
CheckWarp(nav, createPos);
role.IsTeamLeader = false;
role.playerUID = UserProxy.Instance.player.uid;
role.SetPropertyFinal(null, EBattleProperty.NPOWER, role.mData.MP_Final);
// 创建英雄携带的言灵
CreateHeroYanLing(role, mHeroVos[index]);
mPlayerRoles[index] = role;
// 默认先控制第一个
if (index == 0)
{
ReplaceHero(index, false);
}
if (GameDateManager.Instance.IsBackDoor)
{
// 播放创建落地动画
HeroPlayerController.Instance.m_Hero.PlayAnimation("return_entry_e");
}
// 返回据点传送阵
else if (GameDateManager.Instance.CreateMapSwitchPoint == 0)
{
if (GameDateManager.Instance.isBackTicket)
{
HeroPlayerController.Instance.m_Hero.PlayAnimation("return_back_e");
}
}
});
}
}
public void CreatePlayers(int index, System.Action ac = null)
{
if (index >= 0 && index < mHeroVos.Count)
{
// 存在
if (mPlayerRoles.ContainsKey(index))
{
if (ac != null)
ac();
return;
}
// 创建
Transform liveTran = GameObject.Find("AIManager/Area1/0").transform;
Vector3 pos = liveTran.position + new Vector3(UnityEngine.Random.Range(-1.5f, 1.5f), 0, UnityEngine.Random.Range(-1.5f, 1.5f));
CreateHero(mHeroVos[index], pos, liveTran.position, 5, "PlayerBT", (role) =>
{
role.gameObject.SetActive(false);
role.transform.rotation = liveTran.rotation;
NavMeshAgent nav = role.gameObject.GetComponent();
CheckWarp(nav, livePos);
role.IsTeamLeader = false;
role.playerUID = UserProxy.Instance.player.uid;
// 创建英雄携带的言灵
CreateHeroYanLing(role, mHeroVos[index]);
mPlayerRoles[index] = role;
// 默认先控制第一个
if (index == 0)
{
ReplaceHero(index, false);
}
if (ac != null)
{
ac();
}
});
}
else
{
if (ac != null)
{
ac();
}
}
}
public void CreateFriendPlayers(string uid, System.Action ac = null)
{
UserProxy.Instance.UserOtherPlayerInfo(uid, (player) =>
{
// 创建
Transform liveTran = GameObject.Find("AIManager/Area1/0").transform;
Vector3 pos = liveTran.position + new Vector3(UnityEngine.Random.Range(-1.5f, 1.5f), 0, UnityEngine.Random.Range(-1.5f, 1.5f));
GameHeroVo hVo = player.collectHero.GetHeroGameInfoByHeroUId(player.heroTeamConfig.CurTeam.heros[0]);
CreateHero(hVo, pos, liveTran.position, 5, "PlayerBT", (role) =>
{
role.gameObject.SetActive(true);
role.transform.rotation = liveTran.rotation;
NavMeshAgent nav = role.gameObject.GetComponent();
CheckWarp(nav, livePos);
role.IsTeamLeader = false;
role.playerUID = uid;
// 创建英雄携带的言灵
CreateHeroYanLing(role, hVo);
mFriendRoles.Add(mFriendRoles.Count, role);
if (role.transform.Find("CMStateDrivenCamera") != null)
{
GameObject cmObj = role.transform.Find("CMStateDrivenCamera").gameObject;
GameObject.Destroy(cmObj);
}
});
});
// GameHeroVo heroVo = mMirrorHeroVos[index];
// Transform liveTran = GameObject.Find("AIManager/Area1/" + (index + 1)).transform;
// Vector3 pos = liveTran.position;
// CreateHero(heroVo, pos, liveTran.position, 5, "PlayerMirrorBT", (role) =>
// {
// role.transform.rotation = liveTran.rotation;
// NavMeshAgent nav = role.gameObject.GetComponent();
// nav.Warp(liveTran.position);
// role.IsTeamLeader = false;
// role.gameObject.name = "Mirror_" + heroVo.mo.prefabRes;
// // 创建英雄携带的言灵
// CreateHeroYanLing(role, heroVo);
// // 创建下一个言灵
// CreateMirrorPlayer(index + 1);
// }, true);
}
private Vector3 livePos = Vector3.zero;
private System.Action sucAC = null;
///
/// 下一位队长
///
/// 是否切换成功
public void NextTeamLeader(Vector3 pos, System.Action ac)
{
if (IsInvoking("LateNextTeamLeader") == false)
{
livePos = pos;
sucAC = ac;
Invoke("LateNextTeamLeader", 2.0f);
}
}
///
/// 延迟切换队长
///
private void LateNextTeamLeader()
{
// 优先设置上次切换的角色
if (mPlayerRoles.ContainsKey(lastPlayerIndex))
{
if (mPlayerRoles[lastPlayerIndex] != null)
{
mPlayerRoles[lastPlayerIndex].transform.position = livePos;
//ADON新增控制玩家模块
HeroPlayerController.Instance.SetPlayer(mPlayerRoles[lastPlayerIndex] as BaseHero, true);
// 初始化三人头像
if (BattleCanvas.Instance != null)
{
BattleCanvas.Instance.UpdateHeroIcon(lastPlayerIndex, -1, mHeroVos);
}
// 成功回调
if (sucAC != null)
{
sucAC.Invoke(true);
}
return;
}
}
// 查找还活着的角色,并设置控制权
foreach (var item in mPlayerRoles)
{
if (item.Value != null)
{
curPlayerIndex = item.Key;
lastPlayerIndex = item.Key;
item.Value.transform.position = livePos;
//ADON新增控制玩家模块
HeroPlayerController.Instance.SetPlayer(item.Value as BaseHero, true);
// 初始化三人头像
if (BattleCanvas.Instance != null)
{
BattleCanvas.Instance.UpdateHeroIcon(curPlayerIndex, -1, mHeroVos);
}
// 成功回调
if (sucAC != null)
{
sucAC.Invoke(true);
}
return;
}
}
// 失败回调
if (sucAC != null)
{
sucAC.Invoke(false);
}
}
///
/// 替换英雄
///
///
public void ReplaceHero(int index, bool isSwitchRole = true)
{
// 检测是否有指定玩家
GameDateManager.Instance.CheckHaveAppointPlayers(mHeroVos);
Vector3 pos = Vector3.zero;
// 切换钱角色不为空,则隐藏
if (mPlayerRoles.ContainsKey(curPlayerIndex))
{
mPlayerRoles[curPlayerIndex].gameObject.SetActive(false);
pos = mPlayerRoles[curPlayerIndex].transform.position;
}
lastPlayerIndex = curPlayerIndex;
// 激活新的
if (mPlayerRoles.ContainsKey(index))
{
curPlayerIndex = index;
if (pos != Vector3.zero)
{
mPlayerRoles[index].transform.position = pos;
}
//ADON新增控制玩家模块
HeroPlayerController.Instance.SetPlayer(mPlayerRoles[index] as BaseHero, true);
}
else
{
// 激活新的失败, 找一个存活的激活
foreach (var item in mPlayerRoles)
{
if (item.Value != null)
{
curPlayerIndex = item.Key;
if (pos != Vector3.zero)
{
mPlayerRoles[index].transform.position = pos;
}
//ADON新增控制玩家模块
HeroPlayerController.Instance.SetPlayer(item.Value as BaseHero, true);
break;
}
}
}
// 初始化三人头像
if (BattleCanvas.Instance != null)
{
BattleCanvas.Instance.UpdateHeroIcon(curPlayerIndex, lastPlayerIndex, mHeroVos);
}
}
/////
///// 创建镜像玩家
/////
/////
/////
//public void CreateMirrorPlayer(int index)
//{
// if (index >= 0 && index < mMirrorHeroVos.Count)
// {
// GameHeroVo heroVo = mMirrorHeroVos[index];
// Transform liveTran = GameObject.Find("AIManager/Area1/" + (index + 1)).transform;
// Vector3 pos = liveTran.position;
// CreateHero(heroVo, pos, liveTran.position, 5, "PlayerMirrorBT", (role) =>
// {
// role.transform.rotation = liveTran.rotation;
// NavMeshAgent nav = role.gameObject.GetComponent();
// nav.Warp(liveTran.position);
// role.IsTeamLeader = false;
// role.gameObject.name = "Mirror_" + heroVo.mo.prefabRes;
// // 创建英雄携带的言灵
// CreateHeroYanLing(role, heroVo);
// // 创建下一个言灵
// CreateMirrorPlayer(index + 1);
// }, true);
// }
// else
// {
// Invoke("LateRunmMirrorBTS", 3);
// }
//}
///
/// 延迟运行
///
private void LateRunmMirrorBTS()
{
for (int i = 0; i < mMirrorBTS.Count; i++)
{
mMirrorBTS[i].EnableBehavior();
}
}
///
/// 创建英雄携带的言灵
///
///
///
public void CreateHeroYanLing(Role role, GameHeroVo heroVO)
{
//一个英雄 有3个言灵槽: left:1、middle:2、right:3
for (int i = 1; i <= heroVO.yanling.Count; i++)
{
role.RefreshYanLing(i, heroVO.yanling[i]);
if (heroVO.yanling[i].Mo() != null && heroVO.yanling[i].Mo().GetYanlingExt() != null)
{
string ylRes = heroVO.yanling[i].Mo().GetYanlingExt().res;
mYanLingRess.Add(ylRes);
}
}
}
///
/// 言灵攻击
///
///
///
///
///
///
///
public void YanLanAttack(int yanLingUID, Role target, string skillAni, System.Action ac, float goTime = 0.5f, float stayTime = 0.25f, float backTime = 0.5f)
{
if (mCreateYanLings.ContainsKey(yanLingUID))
{
YanLingBattleInfo info = mCreateYanLings[yanLingUID];
// 去攻击
info.selfTransform.parent = null;
info.selfTransform.DOScale(Vector3.one * 0.25f, goTime);
Vector3 dir = target.transform.position - info.selfTransform.position;
dir.Normalize();
Tweener toTweener = info.selfTransform.DOMove(target.transform.position - dir, goTime);
toTweener.OnComplete(() =>
{
// 往回返
info.selfTransform.parent = info.parentTransform;
info.selfTransform.DOScale(Vector3.one * 0.05f, backTime);
Tweener backTweener = info.selfTransform.DOLocalMove(Vector3.zero, backTime);
backTweener.SetDelay(stayTime);
// 到达目的地的攻击回调
if (ac != null)
{
ac.Invoke();
}
// 播放动画
info.dragonComponent.animation.GotoAndPlayByFrame(skillAni);
});
}
}
///
/// 创建英雄
///
/// 怪物数据
/// Transform
public void CreateHero(GameHeroVo date, Vector3 pos, Vector3 _livePos, float radius, string btResName, Action ac, bool isMirror = false)
{
if (string.IsNullOrEmpty(date.mo.prefabRes))
{
return;
}
string resName = "Role_" + date.mo.prefabRes;
if (mRoleRes.ContainsKey(resName))
{
mRoleRes[resName]++;
}
else
{
mRoleRes.Add(resName, 1);
}
ResourceHelper.Instance.LoadAssetBundle("Role_" + date.mo.prefabRes, (AssetBundle bundle) =>
{
if (bundle != null)
{
GameObject roleObj = (GameObject)Instantiate(bundle.LoadAsset("Role_" + date.mo.prefabRes), transform, false);
roleObj.AddComponent();
roleObj.transform.position = pos;
BaseHero role = null;
if (date.mo.prefabRes == "202011")
{
role = roleObj.AddComponent();
}
else if (date.mo.prefabRes == "101005")
{
role = roleObj.AddComponent();
}
else if (date.mo.prefabRes == "101013")
{
role = roleObj.AddComponent();
}
else
{
role = roleObj.AddComponent();
}
//BaseHero role = roleObj.AddComponent();
role.mLivePos = _livePos;
role.IsHero = true;
role.mRadius = radius;
role.roleType = RoleType.Hero;
NavMeshAgent nav = role.gameObject.GetComponent();
CheckWarp(nav, _livePos);
if (isMirror)
{
role.gameObject.layer = LayerMask.NameToLayer("Enemy");
role.Init(new YLBattleUnit(date.mo, date), E_Camp.Red, isMirror);
//mMirrorPlayerRoles.Add(role);
}
else
{
role.gameObject.layer = LayerMask.NameToLayer("Player");
role.Init(new YLBattleUnit(date.mo, date), E_Camp.Blue, isMirror);
}
// 加载行为树资源
ResourceHelper.Instance.LoadAssetBundle(btResName, (btAB) =>
{
if (btAB != null)
{
ExternalBehaviorTree ebt = btAB.LoadAsset(btResName);
if (ebt != null)
{
BehaviorTree bt = role.mBehaviorTree;
bt.RestartWhenComplete = true;
bt.StartWhenEnabled = false;
bt.ExternalBehavior = ebt;
bt.DisableBehavior();
//// 设置属性
//bt.SetVariableValue("moveSpeed", role.mData.MSP_Final);
//bt.SetVariableValue("viewDistance", role.mData.ORG_Final);
//bt.SetVariableValue("attackDistance", role.mData.ARG_Final);
if (isMirror)
{
mMirrorBTS.Add(bt);
}
if (ac != null)
{
ac(role);
}
}
else
{
Debug.LogWarning("解析行为树资源失败!" + btResName);
}
}
else
{
Debug.LogWarning("加载行为树资源失败!" + btResName);
}
});
//// 加入小地图
//BattleCanvas.Instance.mapCmpt.AddTarget(role.gameObject, YL_MiniMap.MiniType.Player);
}
});
}
///
/// 原地复活
///
public void RebirthHero()
{
RoleManager.Instance.CreatePlayers(0, () =>
{
Role role = RoleManager.Instance.GetPlayer(true);
NavMeshAgent nav = role.GetComponent();
nav.enabled = false;
role.transform.position = diePos;
nav.enabled = true;
BattleCanvas.Instance.mapCmpt.AddTarget(role.gameObject, YL_MiniMap.MiniType.Player);
});
}
public void RebirthGoCreatePoint()
{
RoleManager.Instance.CreatePlayers(0, () =>
{
Role role = RoleManager.Instance.GetPlayer(true);
NavMeshAgent nav = role.GetComponent();
nav.enabled = false;
role.transform.position = AIManager.Instance.GetPlayerCreatePoint().position;
nav.enabled = true;
BattleCanvas.Instance.mapCmpt.AddTarget(role.gameObject, YL_MiniMap.MiniType.Player);
});
}
///
/// 创建怪物
///
/// 所属区域
/// 怪物数据
/// Transform
public void CreateMonster(int area, sm_hero date, List dropId, Vector3 pos, Vector3 _livePos, float radius, RoleType roleType, Action ac = null)
{
if (string.IsNullOrEmpty(date.prefabRes))
{
return;
}
string resName = "Role_" + date.prefabRes;
if (mRoleRes.ContainsKey(resName))
{
mRoleRes[resName]++;
}
else
{
mRoleRes.Add(resName, 1);
}
ResourceHelper.Instance.LoadAssetBundle("Role_" + date.prefabRes, (AssetBundle bundle) =>
{
if (bundle != null)
{
mCurArea = area;
GameObject roleObj = (GameObject)Instantiate(bundle.LoadAsset("Role_" + date.prefabRes), transform, false);
roleObj.AddComponent();
roleObj.transform.position = pos;
Role role = AddMonsterScript(date, roleObj);//创建添加怪脚本
role.Init(new YLBattleUnit(date), E_Camp.Red);
role.mLiveArea = area;
role.mLivePos = _livePos;
role.dropId = dropId;
role.IsHero = false;
NavMeshAgent nav = role.gameObject.GetComponent();
CheckWarp(nav, _livePos);
role.mRadius = radius;
role.roleType = roleType;
if (roleType == RoleType.Boss)
{
this._bossLive = true;
}
if (mCreateMonsterRoles.ContainsKey(area))
{
mCreateMonsterRoles[area].Add(role);
}
else
{
List roles = new List();
roles.Add(role);
mCreateMonsterRoles.Add(area, roles);
}
// 加载行为树资源
string behaviorTreeName = role.mData.mMonsterVo.ai_btree;
ResourceHelper.Instance.LoadAssetBundle(behaviorTreeName, (btAB) =>
{
if (btAB != null)
{
ExternalBehaviorTree ebt = btAB.LoadAsset(behaviorTreeName);
if (ebt != null)
{
BehaviorTree bt = role.mBehaviorTree;
bt.RestartWhenComplete = true;
bt.StartWhenEnabled = true;
bt.ExternalBehavior = ebt;
if (ac != null)
{
ac(role);
}
}
else
{
Debug.LogWarning("解析行为树资源失败!" + behaviorTreeName);
}
}
else
{
Debug.LogWarning("加载行为树资源失败!" + behaviorTreeName);
}
});
// 网格优化分配
if (GameObject.Find("GridMap") != null)
{
MyGridMap gridMap = GameObject.Find("GridMap").GetComponent();
gridMap.AddOneObjToGrid(roleObj);
}
}
});
}
///
/// 创建怪物
///
/// 所属区域
/// 怪物数据
/// Transform
public void CreateUnitBySpawner(int area, sm_hero date, List dropId, Vector3 pos, Quaternion qua, float radius, RoleType roleType, Action ac = null)
{
if (string.IsNullOrEmpty(date.prefabRes))
{
return;
}
string resName = "Role_" + date.prefabRes;
if (mRoleRes.ContainsKey(resName))
{
mRoleRes[resName]++;
}
else
{
mRoleRes.Add(resName, 1);
}
ResourceHelper.Instance.LoadAssetBundle("Role_" + date.prefabRes, (AssetBundle bundle) =>
{
if (bundle != null)
{
mCurArea = area;
GameObject roleObj = (GameObject)Instantiate(bundle.LoadAsset("Role_" + date.prefabRes), transform, false);
roleObj.AddComponent();
float offsetX = UnityEngine.Random.Range(0, radius);
float offsetZ = UnityEngine.Random.Range(0, radius);
roleObj.transform.position = pos + new Vector3(offsetX, 0,offsetZ);
roleObj.transform.rotation = qua;
// 精英怪比普通怪大
if (roleType == RoleType.Elite)
{
roleObj.transform.localScale = Vector3.one * 1.25f;
}
// BOSS
else if (roleType == RoleType.Boss)
{
roleObj.transform.localScale = Vector3.one * 1.5f;
}
// 普通怪
else
{
roleObj.transform.localScale = Vector3.one;
}
roleObj.SetActive(true);
Role role = AddMonsterScript(date, roleObj);//创建添加怪脚本
role.Init(new YLBattleUnit(date), E_Camp.Red);
role.mLiveArea = area;
role.mLivePos = roleObj.transform.position;
role.IsHero = false;
role.dropId = dropId;
NavMeshAgent nav = role.gameObject.GetComponent();
CheckWarp(nav, roleObj.transform.position);
role.mRadius = radius;
role.roleType = roleType;
if (roleType == RoleType.Boss)
{
this._bossLive = true;
}
if (mCreateMonsterRoles.ContainsKey(area))
{
mCreateMonsterRoles[area].Add(role);
}
else
{
List roles = new List();
roles.Add(role);
mCreateMonsterRoles.Add(area, roles);
}
// 加载行为树资源
string behaviorTreeName = role.mData.mMonsterVo.ai_btree;
sm_gate gateMo = sm_gate.GetMoById(UserProxy.Instance.player.newMap.curMapId);
if ((BattleDefine.EBattleSceneType)int.Parse(gateMo.battleType) == BattleDefine.EBattleSceneType.EBattleType_Defense)
{
behaviorTreeName = "BT_Defense_301001";
}
ResourceHelper.Instance.LoadAssetBundle(behaviorTreeName, (btAB) =>
{
if (btAB != null)
{
ExternalBehaviorTree ebt = btAB.LoadAsset(behaviorTreeName);
if (ebt != null)
{
BehaviorTree bt = role.mBehaviorTree;
bt.RestartWhenComplete = true;
bt.StartWhenEnabled = true;
bt.ExternalBehavior = ebt;
//// 设置属性
//bt.SetVariableValue("moveSpeed", role.mData.MSP_Final);
//bt.SetVariableValue("viewDistance", role.mData.ORG_Final);
//bt.SetVariableValue("attackDistance", role.mData.ARG_Final);
if (ac != null)
{
ac(role);
}
}
else
{
Debug.LogWarning("解析行为树资源失败!" + behaviorTreeName);
}
}
else
{
Debug.LogWarning("加载行为树资源失败!" + behaviorTreeName);
}
});
//// 加入小地图
if (BattleCanvas.Instance != null && BattleCanvas.Instance.mapCmpt)
{
BattleCanvas.Instance.mapCmpt.AddTarget(role.gameObject, YL_MiniMap.MiniType.Monster);
}
// 网格优化分配
if (GameObject.Find("GridMap") != null)
{
MyGridMap gridMap = GameObject.Find("GridMap").GetComponent();
gridMap.AddOneObjToGrid(roleObj);
}
}
});
}
///
/// 添加怪物脚本
///
///
///
///
Role AddMonsterScript(sm_hero date, GameObject roleObj)
{
Role role = new Role();
if (date.prefabRes == "301001")
{
role = roleObj.AddComponent();
}
else if (date.prefabRes == "601001")
{
role = roleObj.AddComponent();
}
else if (date.prefabRes == "401001")
{
role = roleObj.AddComponent();
}
else if (date.prefabRes == "701001")
{
role = roleObj.AddComponent();
}
else if (date.prefabRes == "1001001")
{
role = roleObj.AddComponent();
role.GetComponent().m_CurForm = 1;
}
else if (date.prefabRes == "1001002")
{
role = roleObj.AddComponent();
role.GetComponent().m_CurForm = 2;
}
else if (date.prefabRes == "1001003")
{
role = roleObj.AddComponent();
role.GetComponent().m_CurForm = 3;
}
else if (date.prefabRes == "1001004")
{
role = roleObj.AddComponent();
role.GetComponent().m_CurForm = 4;
}
else if (date.prefabRes == "2001001")
{
role = roleObj.AddComponent();
}
else if (date.prefabRes == "2101001")
{
role = roleObj.AddComponent();
}
else if (date.prefabRes == "2201001")
{
role = roleObj.AddComponent();
}
else if (date.prefabRes == "2301001")
{
role = roleObj.AddComponent();
}
else if (date.prefabRes == "2401001")
{
role = roleObj.AddComponent();
}
else if (date.prefabRes == "2501001")
{
role = roleObj.AddComponent();
}
else if (date.prefabRes == "2601001")
{
role = roleObj.AddComponent();
}
else if (date.prefabRes == "2701001")
{
role = roleObj.AddComponent();
}
else if (date.prefabRes == "701101" || date.prefabRes == "701201" || date.prefabRes == "701301" || date.prefabRes == "701401")//俯冲战机(元素)
{
role = roleObj.AddComponent();
}
else if (date.prefabRes == "1101101" || date.prefabRes == "1101201" || date.prefabRes == "1101301" || date.prefabRes == "1101401")//大眼怪(元素)
{
role = roleObj.AddComponent();
}
else if (date.prefabRes == "1201001" || date.prefabRes == "1201101" || date.prefabRes == "1201201" || date.prefabRes == "1201301" || date.prefabRes == "1201401")//野蛮先行官
{
role = roleObj.AddComponent();
}
else if (date.prefabRes == "1301001" || date.prefabRes == "1301101" || date.prefabRes == "1301201" || date.prefabRes == "1301301" || date.prefabRes == "1301401")//自爆机甲
{
role = roleObj.AddComponent();
}
else
{
role = roleObj.AddComponent();
}
return role;
}
///
/// 移除一个角色
///
/// 角色
public void DeleteRole(Role role, float delayTime = 0)
{
int point = role.mLiveArea;
diePos = role.transform.position;
if (GameBattleManager.Instance().battleType == BattleDefine.EBattleSceneType.EBattleType_Arena && role.isMirror)
{
}
else if (role.mData.mIsHero)
{
// 删除VO数据
for (int i = 0; i < mHeroVos.Count; i++)
{
if (mHeroVos[i] != null && mHeroVos[i].typeId == role.mData.mHeroVo.typeId)
{
mHeroVos[i].isLocked = true;
}
}
// 删除实例
foreach (var item in mPlayerRoles)
{
if (item.Value == role)
{
mPlayerRoles[item.Key] = null;
mPlayerRoles.Remove(item.Key);
break;
}
}
Destroy(role.gameObject, delayTime);
}
else
{
// 非无尽塔 守护模式下 进行掉落
sm_gate gateMo = sm_gate.GetMoById(UserProxy.Instance.player.newMap.curMapId);
if ((BattleDefine.EBattleSceneType)int.Parse(gateMo.battleType) != BattleDefine.EBattleSceneType.EBattleType_Endless &&
(BattleDefine.EBattleSceneType) int.Parse(gateMo.battleType) != BattleDefine.EBattleSceneType.EBattleType_Defense)
{
// 上报
TaskProxy.Instance.ReportKillMonsterEvent(role.mData.TID, 1, (b, taskCardVo, newCardVo) =>
{
if (b == false || taskCardVo == null)
{
return;
}
});
string heroId = UserProxy.Instance.player.CurrentBattleteam.CurTeamLeaderUID;
ItemProxy.Instance.killMosterAddData(heroId, role.mData.TID, (expnum) =>
{
EventComponent eventCmpt = GameEntry.GetComponent();
eventCmpt.FireNow(this, new GetExpEvent(expnum));
});
ResourceHelper.Instance.LoadAssetBundle("shiqu_nengliang", (ab) =>
{
if (ab != null)
{
GameObject eff = (GameObject)Instantiate(ab.LoadAsset("shiqu_nengliang"));
eff.transform.localPosition = diePos;
CmptAutoDestory des = eff.AddComponent();
des.LiveTime = 2.0f;
eff.transform.DOMove(diePos + Vector3.up * 3.5f, 0.5f).OnComplete(() =>
{
DropItemFollow follow = eff.AddComponent();
follow.target = HeroPlayerController.Instance.m_Hero.gameObject;
});
}
});
// 如果dropId 有值 则是被孵化器修改 则按照孵化器的掉落ID掉落
if (role.dropId == null)
{
if (DropManager.Instance != null)
{
DropManager.Instance.DropItems((int)(role.mData.mMonsterVo.dropId), diePos + new Vector3(UnityEngine.Random.Range(-0.5f, 0.5f), 0, UnityEngine.Random.Range(-0.5f, 0.5f)));
}
}
else
{
foreach (var id in role.dropId)
{
if (DropManager.Instance != null)
{
DropManager.Instance.DropItems(id, diePos + new Vector3(UnityEngine.Random.Range(-0.5f, 0.5f), 0, UnityEngine.Random.Range(-0.5f, 0.5f)));
}
}
}
}
if (role.roleType == RoleType.Boss)
{
this._bossLive = false;
}
// ----------- 孵化器 同步 列表刷新 S -----------------------
EventComponent eventCmpt = GameEntry.GetComponent();
eventCmpt.FireNow(this, new BattleEventRemoveUnit(role));
// ----------- 孵化器 同步 列表刷新 E -----------------------
DestoryRole(role, delayTime);
// BOSS被击杀
if (role.roleType == RoleType.Boss)
{
if (gateMo.battleType == BattleDefine.EBattleSceneType.EBattleType_Boss.ToString() ||
gateMo.battleType == BattleDefine.EBattleSceneType.EBattleType_Duplicate.ToString() ||
// 0城镇 1据点 2非据点 3Boss点 4 其他
gateMo.mapType == 4)
{
SpawnerSystem.Instance.CloseSystem();
// 其他小怪处于死亡状态
AllMonsterDeath(point);
// 点击传送门才结束
ResourceHelper.Instance.LoadAssetBundle("sucai_chuansongmen", (ab) =>
{
if (ab != null)
{
GameObject obj = (GameObject)Instantiate(ab.LoadAsset("sucai_chuansongmen"), diePos + Vector3.up, Quaternion.identity);
chuanSongMen = obj.GetComponent();
chuanSongMen.clickAC = ChuanSongMenClick;
chuanSongMen.enterAC = ChuanSongMenEnter;
}
});
}
EventComponent ec = GameEntry.GetComponent();
ec.FireNow(this, new NoviceEventBossDie());
}
else
{
if ((BattleDefine.EBattleSceneType)int.Parse(gateMo.battleType) == BattleDefine.EBattleSceneType.EBattleType_Endless ||
(BattleDefine.EBattleSceneType)int.Parse(gateMo.battleType) == BattleDefine.EBattleSceneType.EBattleType_Defense)
{
if (SpawnerSystem.Instance.IsCloseAllSpawner() &&
SpawnerSystem.Instance.IsLastSpawner() &&
mCreateMonsterRoles.Count <= 0)
{
EventComponent ec = GameEntry.GetComponent();
ec.FireNow(this, new BattleEventEndlessUpdateSpawner());
}
}
else if (SpawnerSystem.Instance.GetBattleType() != BattleDefine.EBattleSceneType.EBattleType_Boss)
{
if (SpawnerSystem.Instance.IsCloseAllSpawner() &&
SpawnerSystem.Instance.IsLastSpawner() &&
mCreateMonsterRoles.Count <= 1)
{
// 点击传送门才结束
ResourceHelper.Instance.LoadAssetBundle("sucai_chuansongmen", (ab) =>
{
if (ab != null)
{
GameObject obj = (GameObject)Instantiate(ab.LoadAsset("sucai_chuansongmen"), diePos + Vector3.up, Quaternion.identity);
chuanSongMen = obj.GetComponent();
chuanSongMen.clickAC = ChuanSongMenClick;
chuanSongMen.enterAC = ChuanSongMenEnter;
}
});
}
}
}
//if (mCreateMonsterRoles[point].Count <= 0)
//{
// AIManager.Instance.CreateNextPointMonster(Vector3.zero);
//}
}
}
public void DestoryRole(Role role, float delayTime = 0)
{
int point = role.mLiveArea;
Vector3 diePos = role.transform.position;
if (mCreateMonsterRoles.ContainsKey(point))
{
mCreateMonsterRoles[point].Remove(role);
Destroy(role.gameObject, delayTime);
if(mCreateMonsterRoles[point].Count == 0)
{
mCreateMonsterRoles.Remove(point);
}
}
}
private void ChuanSongMenClick(int type)
{
UI_CueDialog.Instance().Open("是否离开战场?", "", E_DialogType.TwoBntton, () =>
{
// 游戏胜利 向服务器发送数据 接受奖励信息
this.GameWin();
});
}
private void ChuanSongMenEnter(int type, GameObject obj)
{
if (obj.layer == LayerMask.NameToLayer("Player"))
{
UI_CueDialog.Instance().Open("是否离开战场?", "", E_DialogType.TwoBntton, () =>
{
// 游戏胜利 向服务器发送数据 接受奖励信息
this.GameWin();
});
}
}
///
/// 当前刷怪点的所有怪物死亡
///
///
private void AllMonsterDeath(int point)
{
if (mCreateMonsterRoles.ContainsKey(point))
{
for (int i = 0; i < mCreateMonsterRoles[point].Count; i++)
{
//*//mCreateMonsterRoles[point][i].roleState = new RoleState_Death(mCreateMonsterRoles[point][i], false);
}
}
}
public void GameWin()
{
ProcedureComponent procedure = GameObject.Find("YLGameFramework").transform.Find("Procedure").gameObject.GetComponent();
if (procedure.CurrentProcedure != null && (procedure.CurrentProcedure.GetType().ToString() == "GameFrameworkYLSJ.ProcedureNoviceGuideEnd" ||
procedure.CurrentProcedure.GetType().ToString() == "GameFrameworkYLSJ.ProcedureNoviceGuideArousal" ||
procedure.CurrentProcedure.GetType().ToString() == "GameFrameworkYLSJ.ProcedureNoviceGuideBoss"))
{
return;
}
if (chuanSongMen != null)
{
chuanSongMen.gameObject.SetActive(false);
}
// 结束
EventComponent e = GameEntry.GetComponent();
e.FireNow(this, new BattleEventAppraise());
}
public void Update()
{
//UpdateMonsterActiveStatus();
OnUpdateRoles();
}
float updateTime = 0;
///
/// 更新怪物的激活状态
///
private void UpdateMonsterActiveStatus()
{
updateTime += Time.deltaTime;
if (updateTime < 1.0f)
{
return;
}
else
{
updateTime = 0;
}
Role ctrlRole = GetPlayer();
if (ctrlRole == null)
{
return;
}
foreach (var item in mCreateMonsterRoles)
{
foreach (var targetRole in item.Value)
{
if (targetRole != null)
{
float dis = Vector3.Distance(ctrlRole.transform.position, targetRole.transform.position);
if (dis >= 20)
{
if (targetRole.mAnimator.isActiveAndEnabled)
{
targetRole.mAnimator.enabled = false;
targetRole.mNavMeshAgent.isStopped = true;
targetRole.mBehaviorTree.DisableBehavior(true);
}
}
else
{
if (targetRole.mAnimator.isActiveAndEnabled == false)
{
targetRole.mAnimator.enabled = true;
targetRole.mNavMeshAgent.isStopped = false;
targetRole.mBehaviorTree.EnableBehavior();
}
}
}
}
}
}
private void OnUpdateRoles()
{
Role cdRole = null;
foreach (var item in mPlayerRoles)
{
if (item.Value != null && item.Value.gameObject.activeSelf)
{
cdRole = item.Value;
break;
}
}
if (cdRole == null)
{
return;
}
HeroGameVo_Yanling yanlingVOU = cdRole.mData.mHeroVo.yanling[1];
HeroGameVo_Yanling yanlingVOC = cdRole.mData.mHeroVo.yanling[2];
HeroGameVo_Yanling yanlingVOB = cdRole.mData.mHeroVo.yanling[3];
if (yanlingVOU.typeId != 0 && yanlingVOU.cd_now > 0)
{
yanlingVOU.cd_now -= Time.deltaTime;
}
if (yanlingVOC.typeId != 0 && yanlingVOC.cd_now > 0)
{
yanlingVOC.cd_now -= Time.deltaTime;
}
if (yanlingVOB.typeId != 0 && yanlingVOB.cd_now > 0)
{
yanlingVOB.cd_now -= Time.deltaTime;
}
// 刷新能量SP
_refreshNowTime += Time.deltaTime;
if (_refreshNowTime > _refreshTime)
{
_refreshNowTime -= _refreshTime;
}
else
{
return;
}
if (yanlingVOU.typeId != 0)
{
yanlingVOU.sp_now = Math.Min(yanlingVOU.Mo().GetYanlingExt().sp_max, yanlingVOU.sp_now + yanlingVOU.Mo().GetYanlingExt().sp_cure);
}
if (yanlingVOC.typeId != 0)
{
yanlingVOC.sp_now = Math.Min(yanlingVOC.Mo().GetYanlingExt().sp_max, yanlingVOC.sp_now + yanlingVOC.Mo().GetYanlingExt().sp_cure);
}
if (yanlingVOB.typeId != 0)
{
yanlingVOB.sp_now = Math.Min(yanlingVOB.Mo().GetYanlingExt().sp_max, yanlingVOB.sp_now + yanlingVOB.Mo().GetYanlingExt().sp_cure);
}
}
///
/// 挑战结果
///
///
public void ChallengeResult(bool win)
{
PanelHelper.Instance.ShowPanel("UI_ChallengeResultWindow", null, win);
PanelHelper.Instance.ClosePanel("BattleCanvas");
}
///
/// 检测有效位置并设置
///
///
///
private void CheckWarp(NavMeshAgent nav, Vector3 pos, float dis = 5)
{
NavMeshHit hit;
bool has = NavMesh.SamplePosition(pos, out hit, dis, NavMesh.AllAreas);
if (has)
{
nav.Warp(hit.position);
}
//else
//{
// nav.Warp(hit.position);
//}
}
///
/// 清除角色资源
///
public void ClearRoleRes()
{
// 卸载角色资源
foreach (var item in mRoleRes)
{
ResourceHelper.Instance.UnloadAssetBundle(item.Key);
}
mRoleRes.Clear();
// 卸载言灵资源
for (int i = 0; i < mYanLingRess.Count; i++)
{
ResourceHelper.Instance.UnloadAssetBundle(mYanLingRess[i]);
}
mYanLingRess.Clear();
// 删除角色GameObject
foreach (var item in mPlayerRoles)
{
Destroy(item.Value);
}
mPlayerRoles.Clear();
// 删除怪物GameObject
foreach (var item in mCreateMonsterRoles)
{
for (int i = item.Value.Count - 1; i >= 0; i--)
{
Destroy(item.Value[i]);
}
}
mCreateMonsterRoles.Clear();
// 清空RoleManager残余(正常不需要,有几率有残余)
for (int i = transform.childCount - 1; i >= 0; i--)
{
Destroy(transform.GetChild(i).gameObject);
}
lastPlayerIndex = -1;
curPlayerIndex = 0;
}
}
///
/// 阵营
///
public enum E_Camp
{
///
/// 无
///
None = 0,
///
/// 红队(敌方)
///
Red = 1,
///
/// 蓝队(友方)
///
Blue = 2,
}
///
/// 言灵的战斗信息
///
public struct YanLingBattleInfo
{
public Transform parentTransform;
public Transform selfTransform;
public HeroGameVo_Yanling yanLingVO;
public DragonBones.UnityArmatureComponent dragonComponent;
public Role ownRole;
}