/// <summary> /// 角色进场。 /// </summary> public void OnGameEventMonsterLoad(GameEvent ge, EventParameter parameter) { MonsterObj obj = parameter.objParameter as MonsterObj; List <LuaTable> anis; if (!m_CacheMonsterAnimation.TryGetValue(obj.ConfigID, out anis)) { return; } int map = MapMgr.Instance.EnterMapId; for (int i = 0; i < anis.Count; ++i) { LuaTable cfg = anis[i]; if (cfg.Get <int>("monster") == MONSTER_TYPE_BORN) { int sceneid = cfg.Get <int>("sceneid"); if (sceneid == 0 || sceneid == map) { TryPlayerCutScene(cfg); break; } } } }
/// <summary> /// 角色死亡。 /// </summary> public void OnGameEventMonsterDeath(GameEvent ge, EventParameter parameter) { ActorObj actor = parameter.goParameter.GetComponent <ActorObj>(); MonsterObj monster = actor as MonsterObj; if (monster == null) { return; } List <LuaTable> anis; if (!m_CacheMonsterAnimation.TryGetValue(monster.ConfigID, out anis)) { return; } int map = MapMgr.Instance.EnterMapId; for (int i = 0; i < anis.Count; ++i) { LuaTable cfg = anis[i]; if (cfg.Get <int>("monster") == MONSTER_TYPE_DIE) { int sceneid = cfg.Get <int>("sceneid"); if (sceneid == 0 || sceneid == map) { TryPlayerCutScene(cfg); break; } } } }
/// <summary> /// 获取最近的角色。 /// </summary> /// <param name="objList">角色列表。</param> /// <param name="dis">距离限制。</param> /// <returns>最近的角色。</returns> public ActorObj GetNearestActor(List <ActorObj> objList, ref float dis, int mid = 0) { ActorObj selectActor = null; for (int i = 0; i < objList.Count; i++) { //对IOS出现怪物不动 报错的异常 进行错误处理 隐身或死亡状态 ActorObj actor = objList[i]; if (null == actor) { continue; } if (!GameLogicMgr.checkValid(actor.gameObject) || actor.IsInStealthState(this) || actor.IsDeath()) { continue; } //PK模式的玩家对象筛选 if (actor.mActorType == ActorType.AT_REMOTE_PLAYER || actor.mActorType == ActorType.AT_LOCAL_PLAYER || actor.mActorType == ActorType.AT_MECHANICS) { //排除玩家自身、宠物和不可攻击的玩家 if (actor.mActorType != ActorType.AT_REMOTE_PLAYER || !PlayerData.Instance.IsCanAttack(actor as OtherPlayer)) { continue; } } //距离最近 float distance = Vector3.Distance(transform.position, actor.transform.position); if (distance > dis) { continue; } if ((actor is MonsterObj) && actor.IsSameCamp()) { continue; } if (mid != 0) { if (actor.mActorType == ActorType.AT_MONSTER || actor.mActorType == ActorType.AT_BOSS) { MonsterObj monsterobj = actor as MonsterObj; if (monsterobj.ConfigID == mid) { dis = distance; selectActor = actor; } } continue; } dis = distance; selectActor = actor; } return(selectActor); }
/// <summary> /// 获取当前的BOSS对象。 /// </summary> /// <returns>BOSS对象。</returns> public ActorObj GetBoss() { for (int i = 0; i < mMonsterList.Count; i++) { MonsterObj monster = mMonsterList[i] as MonsterObj; if (monster.IsBoss) { return(monster); } } return(null); }
public override void OnEnter(ActorObj actor) { if (actor == null) { return; } //塔不没有受击 bool bChangeColor = true; m_state = ACTOR_STATE.AS_BEHIT; m_actor = actor; m_transform = actor.transform; //if (m_actor != null) //{ // m_actor.m_bIsInAttack = true; //} m_behitParame = m_actor.damageBebitParam; monsterObj = m_actor as MonsterObj; if (monsterObj != null) { if (monsterObj.IsVip) { monsterObj.VipIsUnderAttack(); } } if (CurParam != null && CurParam != null) { m_curSkillID = CurParam.skillID; } //m_GameDataBase = CoreEntry.gGameDBMgr; if (CurParam != null && CurParam.AttackActor != null) { m_attack = CurParam.AttackActor; } m_groundLayerMask = 1 << LayerMask.NameToLayer("ground"); //m_baseTool = CoreEntry.gBaseTool; m_gravityMotionBase = this.gameObject.GetComponent <GravityMotionBase>(); //m_gravityMotionBase.enabled = true; //m_ActionEfxList = new List<EfxAttachAction>(); //修改shader //if (m_actor.ChangeShader("Mobile/BeingHitted")) if (monsterObj && monsterObj.m_bIsTower) { bChangeColor = false; } if (bChangeColor && m_actor.m_bUseBehitColor && m_actor.mActorType == ActorType.AT_MONSTER && m_attack != null && m_attack is PlayerObj) { m_actor.SetBrightenShader(); Invoke("RecoverShader", 0.2f); } // if (m_actor.mActorType == ActorType.AT_BOSS && m_actor.AddShader("DZSMobile/Balloon")) //// if (m_actor.mActorType == ActorType.AT_BOSS && m_actor.ChangeShader("DZSMobile/Balloon")) // { // Invoke("RemoveShader", 0.2f); // } if (m_actor.mActorType == ActorType.AT_BOSS && m_actor.IsInQiJue()) { CoreEntry.gEventMgr.TriggerEvent(GameEvent.GE_Boss_QiJue, null); } m_curRadius = m_actor.GetColliderRadius(); //如果浮空,就给浮空处理受击 if (m_gravityMotionBase != null && m_gravityMotionBase.isUseGravityState) { m_gravityMotionBase.DoBehit(); } else { m_bHitBack = false; m_isNonControlProtect = false; isNonControl = false; m_isHitDownState = false; //小怪倒地被击 if (m_gravityMotionBase != null) { m_gravityMotionBase.BreakExitBehitState(); } //面向被击玩家 // if (m_actor.actorCreatureDisplayDesc.chIsBehitNotLookAtTarget == 0) if (m_actor.mActorType != ActorType.AT_LOCAL_PLAYER && m_actor.mActorType != ActorType.AT_MECHANICS && //机械类不转向 m_attack != null && !(m_actor is MonsterObj && !m_actor.bHitTurn)) { //自动释放法宝技能 CoreEntry.gEventMgr.TriggerEvent(GameEvent.GE_AutoUseMagicKeySkill, null); //只旋转Y轴 Vector3 lookPos = new Vector3(m_attack.transform.position.x, m_transform.position.y, m_attack.transform.position.z); m_transform.LookAt(lookPos); } DoBehitEx(); } }
//class objectMoveInfo //{ // public GameObject obj; // public Vector3 srcPos; //}; void DoFocusAction() { //计算位移距离 FunDamageNode fun = m_oneDamageInfo.damageNode.funDamage; //聚怪中心点 Vector3 centerPos = m_transform.position + m_transform.forward.normalized * fun.offDistance; //中间是否有空气墙 Vector3 wallPos = CoreEntry.gBaseTool.GetWallHitPoint(m_transform.position, centerPos); if (!wallPos.Equals(centerPos)) { //存在空气墙 Vector3 dist = wallPos - m_transform.position; dist = dist * 0.9f; //Vector3 wallGroundPos = CoreEntry.gBaseTool.GetGroundPoint(m_transform.position + dist); centerPos = CoreEntry.gBaseTool.GetGroundPoint(centerPos); } if (centerPos.Equals(Vector3.zero)) { centerPos = m_transform.position; } //需要聚集的怪物 List <ActorObj> actors = CoreEntry.gActorMgr.GetAllMonsterActors(); for (int i = 0; i < actors.Count; i++) { //对IOS出现怪物不动 报错的异常 进行错误处理 if (GameLogicMgr.checkValid(actors[i].gameObject) == false) { continue; } GameObject obj = actors[i].gameObject; ActorObj actorBase = actors[i]; //塔不没有受击 MonsterObj monsterObj = obj.GetComponent <MonsterObj>(); if (monsterObj && monsterObj.m_bIsTower) { continue; } //bool isSkillSuccess = false; if (!m_skillBase.m_actor.IsAimActorType(actorBase)) { continue; } // 有霸体的不能被拉动 if (actorBase.IsActorEndure()) { continue; } //伤害对象 if (CoreEntry.gBaseTool.IsPointInCircleXZ(centerPos, obj.transform.position, fun.radius, 1f)) { //isSkillSuccess = true; Go.to(obj.transform, 0.4f, new GoTweenConfig().position(centerPos)); } } StartCoroutine(destroyBox()); }
//float m_lastFootTime = 0; public override void OnEnter(ActorObj actorBase) { if (actorBase.mActorType == ActorType.AT_TRAP || actorBase.mActorType == ActorType.AT_SCENE_BUFF) { return; } MonsterObj monsterObj = this.gameObject.GetComponent <MonsterObj>(); if (monsterObj && monsterObj.m_bIsTower) { return; } m_state = ACTOR_STATE.AS_RUN; m_actor = actorBase; if (m_actor == null) { return; } // m_actor.PlayAction(m_actor.modelInfo.san_walk); if (m_actor.curCastSkillID > 0) { LuaTable skillDesc = ConfigManager.Instance.Skill.GetSkillConfig(m_actor.curCastSkillID); if (skillDesc != null) { if (skillDesc.Get <int>("subtype") != (int)SkillType.SKILL_XUANFANZHAN) { if (m_actor != null) { m_actor.PlayAction(m_actor.ModelConfig.Get <string>("san_walk")); } } } } else { if (StoryMgr.IsInStory) { if (string.IsNullOrEmpty(m_actor.ModelConfig.Get <string>("san_walk"))) { m_actor.PlayAction("walk"); } else { m_actor.PlayAction(m_actor.ModelConfig.Get <string>("san_walk")); } } else { m_actor.PlayAction(m_actor.ModelConfig.Get <string>("san_walk")); } } //设置跑步速度 if (m_actor.mBaseAttr != null) { if (m_actor.mBaseAttr.Speed > 0) { m_actor.SetSpeed(m_actor.mBaseAttr.Speed); } } else { m_actor.SetSpeed(1.0f); } }
/// <summary> /// 加载怪物 /// </summary> /// <param name="monsterStruct"></param> /// <returns></returns> public GameObject LoadMonster(MsgData_sSceneObjectEnterMonster monsterStruct) { if (MainPanelMgr.Instance.bInsertStatus) { return(null); } LuaTable cfg = ConfigManager.Instance.Actor.GetMonsterConfig(monsterStruct.ConfigID); if (null == cfg) { return(null); } int modleid = cfg.Get <int>("modelId"); LuaTable modelCfg = ConfigManager.Instance.Common.GetModelConfig(modleid); Vector3 position = CommonTools.ServerPosToClient(monsterStruct.PosX, monsterStruct.PosY); Vector3 eulerAngle = CommonTools.ServerDirToClient(monsterStruct.Dir); GameObject obj = CreateGameObject(modleid, position, eulerAngle); if (obj == null) { Object oj = CoreEntry.gResLoader.LoadResource("Animation/monster/mon041_shouchengshibing/mon041_shouchengshibing_pre"); if (oj != null) { obj = (GameObject)Instantiate(oj); } } { float s = cfg.Get <float>("scale"); obj.transform.localScale = new Vector3(s, s, s); ParticleScaler[] scalers = obj.GetComponentsInChildren <ParticleScaler>(true); for (int i = 0; i < scalers.Length; i++) { scalers[i].particleScale = s; } ActorObj actorObject = null; actorObject = obj.GetComponent <ActorObj>(); if (null != actorObject) { Object.DestroyImmediate(actorObject); } MonsterObj monster = obj.AddComponent <MonsterObj>(); if (monster != null) { monster.Init(modleid, monsterStruct.ConfigID, monsterStruct.Guid); monster.ServerID = monsterStruct.Guid; monster.InitAttr(monsterStruct); monster.mBaseAttr.Name = cfg.Get <string>("name"); monster.mBaseAttr.Level = cfg.Get <int>("level"); monster.Faction = monsterStruct.Faction; CoreEntry.gActorMgr.AddActorObj(monster); StoryTriggerOnBossBorn.CheckRegister(); } else { //Debug.LogError("monster null"); return(obj); } EventParameter parameter = EventParameter.Get(); parameter.goParameter = obj; parameter.objParameter = monster; CoreEntry.gEventMgr.TriggerEvent(GameEvent.GE_MONSTER_LOADED, parameter); return(obj); } }