public override void Execute(List <BasicEntity> entities) { for (int i = 0; i < entities.Count; i++) { BasicEntity e = entities [i]; DeadComponent dead = e.GetComponent <DeadComponent> (); PropertyComponent propertyComp = (PropertyComponent)e.GetSpecicalComponent(ComponentType.Property); if (dead.hp <= 0) { if (propertyComp.m_characterType == PropertyComponent.CharacterType.Heretic || propertyComp.m_characterType == PropertyComponent.CharacterType.Deepone) { AIComponent aiComp = (AIComponent)e.GetSpecicalComponent(ComponentType.AI); //todo //aiComp.m_enemy.Dead (); } //播放死亡动画 RemoveDead(dead); dead.m_entity.RemoveAllComponent(); continue; } if (dead.san == 0) { } } }
public override void Execte(T enemyEntity) { Debug.Log("exec survey!"); MonitorComponent monitorComp = (MonitorComponent)enemyEntity.m_entity.GetSpecicalComponent(ComponentType.Monitor); PropertyComponent propertyComp = (PropertyComponent)enemyEntity.m_entity.GetSpecicalComponent(ComponentType.Property); DeadComponent deadComp = (DeadComponent)enemyEntity.m_entity.GetSpecicalComponent(ComponentType.Dead); //发现敌人 if (monitorComp.m_enemy.Count != 0) { //倾向攻击攻击 if (deadComp.hp / propertyComp.HP > 0.2f) { enemyEntity.ChangeDecision(AIComponent.Decision.Attack); return; } else { //如果有同伴在旁边,那么就进行攻击 if (AiToInput.ExistEnemy()) { enemyEntity.ChangeDecision(AIComponent.Decision.CallSupport); return; } } } //如果还是听到声音 if (monitorComp.m_voice.Count == 0) { //if (deadComp.hp / propertyComp.HP > 0.2f) { //float j = Random.value; //float surveyDemage = enemyEntity.m_events.DecisionExpectDemage (AIComponent.Decision.Survey); //float patrolDemage = enemyEntity.m_events.DecisionExpectDemage (AIComponent.Decision.Patrol); //Debug.Log ("surveyDemage" + surveyDemage + "patrolDemage" + patrolDemage); //if (j > surveyDemage / (surveyDemage + patrolDemage)) { //如果听到声音,生命充足,且根据历史,直接前去调查可以造成更多的伤害 enemyEntity.ChangeDecision(AIComponent.Decision.Patrol); // return; // } //} else { // float j = Random.value; // float surveyInjure = enemyEntity.m_events.DecisionExpectInjure (AIComponent.Decision.Survey); // float patrolInjeure = enemyEntity.m_events.DecisionExpectInjure (AIComponent.Decision.Patrol); // if (j > patrolInjeure / (surveyInjure + patrolInjeure)) { // //听到声音。生命不足,但是前去调查可以保存更多的生命 // enemyEntity.ChangeDecision (AIComponent.Decision.Patrol); // return; // } //} } Debug.Log("run survey!"); //计算受伤 enemyEntity.m_events.AddInjure(tmpHp - deadComp.hp); tmpHp = deadComp.hp; Survey(enemyEntity.m_entity); return; }
//每帧都会调用对应的实体 public override void Execute(List <BasicEntity> entities) { foreach (BasicEntity e in entities) { AttackComponent attack = e.GetComponent <AttackComponent> (); VoxelBlocks map = GameObject.Find("Voxel Map").transform.GetComponent <VoxelBlocks> (); AbilityComponent ab = e.GetComponent <AbilityComponent> (); InputComponent input = e.GetComponent <InputComponent> (); StateComponent ap = e.GetComponent <StateComponent> (); int i = AiToInput.GetAbilityCount(e, M_LinkedType); //检测是否按下攻击键 if (i >= ab.m_temporaryAbility.Count || i != input.currentKey) { continue; } //若无攻击对象则获取周围可攻击对象 if (attack.enemy == null) { attack.enemy = GetEnemyAround(e); if (attack.enemy == null) { return; } } List <Vector3> el = new List <Vector3> (); foreach (var enemy in attack.enemy) { el.Add(enemy.GetComponent <BlockInfoComponent> ().m_logicPosition); } UISimple ui = GameObject.Find("UI").GetComponent <UISimple> (); ui.ShowUI(el, 2); //左键攻击 if (input.leftButtonDown) { BasicEntity enemy = map.GetBlockByLogicPos(input.currentPos).entity; //检测当前选中敌人是否处于攻击范围内 List <BasicEntity> list = GetEnemyAround(e); if (list != null && !list.Contains(enemy)) { attack.enemy = list; return; } //扣除敌人HP值 DeadComponent dead = enemy.GetComponent <DeadComponent> (); StateComponent state = e.GetComponent <StateComponent> (); dead.hp -= attack.STR; state.m_actionPoint -= 1; state.Invoke("AnimationEnd", 1); state.AnimationStart(); //播放攻击动画 //播放敌人受击动画 //减少AP } } }
public override void Exit(T enemyEntity) { DeadComponent deadComp = (DeadComponent)enemyEntity.m_entity.GetSpecicalComponent(ComponentType.Dead); enemyEntity.m_events.AddDemage(tmpHp - deadComp.hp); tmpHp = deadComp.hp; }
public override void Execte(T enemyEntity) { MonitorComponent monitorComp = (MonitorComponent)enemyEntity.m_entity.GetSpecicalComponent(ComponentType.Monitor); PropertyComponent propertyComp = (PropertyComponent)enemyEntity.m_entity.GetSpecicalComponent(ComponentType.Property); DeadComponent deadComp = (DeadComponent)enemyEntity.m_entity.GetSpecicalComponent(ComponentType.Dead); //如果没有敌人 if (monitorComp.m_enemy.Count == 0) { enemyEntity.ChangeDecision(AIComponent.Decision.Patrol); return; } else { ////如果遇到了敌人,且敌人的距离足够近 //double threat = FuzzyLogic.DistanceThreat (CalculateDistance (enemyEntity.m_entity), propertyComp.HP); //if (threat > 0.4f) { enemyEntity.ChangeDecision(AIComponent.Decision.Attack); return; // return; //} else { // enemyEntity.ChangeDecision (AIComponent.Decision.Escape); // return; //} } //计算受伤 enemyEntity.m_events.AddInjure(tmpHp - deadComp.hp); tmpHp = deadComp.hp; CallSupport(enemyEntity); return; }
void RemoveDead(DeadComponent dead) { GameObject.Destroy(dead.gameObject, 1); //播放死亡动画 VoxelBlocks map = GameObject.Find("Voxel Map").transform.GetComponent <VoxelBlocks> (); map.RemoveBlock(dead.GetComponent <BlockInfoComponent> ().m_logicPosition); }
public override void Exit(T enemyEntity) { Debug.Log("exit patrol!"); DeadComponent deadComp = (DeadComponent)enemyEntity.m_entity.GetSpecicalComponent(ComponentType.Dead); //记录生命值 enemyEntity.m_events.AddInjure(m_tmpHp - deadComp.hp); m_tmpHp = deadComp.hp; }
public override void Enter(T enemyEntity) { //enemyEntity.m_events.AddEvent (AIComponent.Decision.Escape); DeadComponent deadComp = (DeadComponent)enemyEntity.m_entity.GetSpecicalComponent(ComponentType.Dead); tmpHp = deadComp.hp; Escape(enemyEntity); return; }
public override void Exit(T enemyEntity) { Debug.Log("exit survey!"); DeadComponent deadComp = (DeadComponent)enemyEntity.m_entity.GetSpecicalComponent(ComponentType.Dead); enemyEntity.m_entity.GetComponent <MonitorComponent> ().m_voice.Clear(); //计算受伤 enemyEntity.m_events.AddInjure(tmpHp - deadComp.hp); tmpHp = deadComp.hp; }
public override void Enter(T enemyEntity) { enemyEntity.m_entity.GetComponent <AIComponent> ().m_currentDecision = AIComponent.Decision.CallSupport; enemyEntity.m_events.AddEvent(AIComponent.Decision.CallSupport); DeadComponent deadComp = (DeadComponent)enemyEntity.m_entity.GetSpecicalComponent(ComponentType.Dead); tmpHp = deadComp.hp; CallSupport(enemyEntity); return; }
public override void Enter(T enemyEntity) { enemyEntity.m_entity.GetComponent <AIComponent> ().m_currentDecision = AIComponent.Decision.Survey; Debug.Log("enter survey!"); enemyEntity.m_events.AddEvent(AIComponent.Decision.Survey); DeadComponent deadComp = (DeadComponent)enemyEntity.m_entity.GetSpecicalComponent(ComponentType.Dead); tmpHp = deadComp.hp; Survey(enemyEntity.m_entity); return; }
public override void Enter(T enemyEntity) { enemyEntity.m_entity.GetComponent <AIComponent> ().m_currentDecision = AIComponent.Decision.Patrol; enemyEntity.m_events.AddEvent(AIComponent.Decision.Patrol); //记录回合开始时的生命值 DeadComponent deadComp = (DeadComponent)enemyEntity.m_entity.GetSpecicalComponent(ComponentType.Dead); m_tmpHp = deadComp.hp; Debug.Log("enter patrol!"); Patrol(enemyEntity.m_entity); return; }
public void LoadInfo() { if (currentRole == null) { return; } PropertyComponent c_Pro = currentRole.GetComponent <PropertyComponent>(); DeadComponent c_Dead = currentRole.GetComponent <DeadComponent>(); StateComponent c_State = currentRole.GetComponent <StateComponent>(); transform.Find("HP").GetComponent <Text>().text = "HP: " + c_Dead.hp.ToString() + "/" + c_Pro.HP.ToString(); transform.Find("AP").GetComponent <Text>().text = "AP: " + c_State.m_actionPoint.ToString() + "/" + c_Pro.AP.ToString(); transform.Find("Name").GetComponent <Text>().text = "Name: " + c_Pro.name; transform.Find("ATK").GetComponent <Text>().text = "ATK: " + c_Pro.STR.ToString(); transform.Find("SPD").GetComponent <Text>().text = "SPD: " + c_Pro.SPD.ToString(); }
public override void Enter(T enemyEntity) { enemyEntity.m_entity.GetComponent <AIComponent> ().m_currentDecision = AIComponent.Decision.Attack; Debug.Log("enter attack!"); MonitorComponent monitorComp = (MonitorComponent)enemyEntity.m_entity.GetSpecicalComponent(ComponentType.Monitor); target = monitorComp.m_enemy [0]; DeadComponent selfDeadComp = (DeadComponent)enemyEntity.m_entity.GetSpecicalComponent(ComponentType.Dead); DeadComponent targetDeadComp = (DeadComponent)target.GetSpecicalComponent(ComponentType.Dead); tmpHp = selfDeadComp.hp; tmpTargetHp = targetDeadComp.hp; //enemyEntity.m_events.AddEvent (AIComponent.Decision.Attack); Attack(enemyEntity.m_entity); return; }
private void InitPlayerActionList(List <BasicEntity> entities) { playerActionList.Clear(); //获取实体 foreach (BasicEntity e in entities) { DeadComponent deadComp = (DeadComponent)e.GetSpecicalComponent(ComponentType.Dead); StateComponent stateComponent = (StateComponent)e.GetSpecicalComponent(ComponentType.State); if (deadComp != null && deadComp.hp <= 0) { continue; } PropertyComponent PropertyComponent = (PropertyComponent)e.GetSpecicalComponent(ComponentType.Property); if (PropertyComponent.m_characterType == PropertyComponent.CharacterType.Veteran || PropertyComponent.m_characterType == PropertyComponent.CharacterType.Hacker || PropertyComponent.m_characterType == PropertyComponent.CharacterType.Drone) { //将实体入列 playerActionList.Add(e); } } if (playerActionList.Count == 0) { Skyunion.UIManager.Instance().ShowPanel <UIGameFailPanel>(); } //TODO:后续修改 playerActionList.Sort(delegate(BasicEntity x, BasicEntity y) { PropertyComponent stateX = (PropertyComponent)x.GetSpecicalComponent(ComponentType.Property); PropertyComponent stateY = (PropertyComponent)y.GetSpecicalComponent(ComponentType.Property); Debug.Log("stateX.m_agility : " + stateX.m_agility + "stateY.m_agility" + stateY.m_agility); return(-stateX.m_agility.CompareTo(stateY.m_agility)); }); foreach (BasicEntity e in playerActionList) { Debug.Log(e.gameObject.name + "->"); } StateStaticComponent.playerActionList = playerActionList; //确定现在在行动的角色1.是否又有角色在行动。2,角色的行动点是否已经耗尽 }
public override void Execte(T enemyEntity) { Debug.Log("check patrol!"); MonitorComponent monitorComp = (MonitorComponent)enemyEntity.m_entity.GetSpecicalComponent(ComponentType.Monitor); PropertyComponent propertyComp = (PropertyComponent)enemyEntity.m_entity.GetSpecicalComponent(ComponentType.Property); DeadComponent deadComp = (DeadComponent)enemyEntity.m_entity.GetSpecicalComponent(ComponentType.Dead); if (monitorComp.m_enemy.Count != 0) { //if (deadComp.hp / propertyComp.HP > 0.2f) { //发现敌人,且生命值充足 enemyEntity.ChangeDecision(AIComponent.Decision.Attack); return; //} else { // if (AiToInput.ExistEnemy () == true) { // enemyEntity.ChangeDecision (AIComponent.Decision.CallSupport); // return; // } //} } if (monitorComp.m_voice.Count != 0) { //if (deadComp.hp / propertyComp.HP > 0.2f) { enemyEntity.ChangeDecision(AIComponent.Decision.Survey); return; //} } Debug.Log("run patrol!"); //计算在上一回合中受到的伤害 enemyEntity.m_events.AddInjure(m_tmpHp - deadComp.hp); m_tmpHp = deadComp.hp; Patrol(enemyEntity.m_entity); return; }
private void updateInfo() { if (current == null) { return; } PropertyComponent c_Pro = currentRole.GetComponent <PropertyComponent>(); DeadComponent c_Dead = currentRole.GetComponent <DeadComponent>(); StateComponent c_State = currentRole.GetComponent <StateComponent>(); if (c_Pro == null || c_Dead == null || c_State == null) { return; } current.Find("HP").GetComponent <Text>().text = "HP:" + c_Dead.hp.ToString(); current.Find("AP").GetComponent <Text>().text = "AP:" + c_State.m_actionPoint.ToString(); current.Find("Name").GetComponent <Text>().text = c_Pro.name; current.Find("HPSlider").GetComponent <Slider>().maxValue = c_Pro.HP; current.Find("HPSlider").GetComponent <Slider>().value = c_Dead.hp; current.Find("APSlider").GetComponent <Slider>().maxValue = c_Pro.AP; current.Find("APSlider").GetComponent <Slider>().value = c_State.m_actionPoint; foreach (BasicEntity role in StateStaticComponent.playerActionList) { if (role == currentRole) { continue; } PropertyComponent f_Pro = role.GetComponent <PropertyComponent>(); DeadComponent f_Dead = role.GetComponent <DeadComponent>(); if (f_Pro == null || f_Dead == null) { continue; } others.Find("HP").GetComponent <Text>().text = "HP:" + f_Dead.hp.ToString(); others.Find("Name").GetComponent <Text>().text = f_Pro.name; others.Find("HPSlider").GetComponent <Slider>().maxValue = f_Pro.HP; others.Find("HPSlider").GetComponent <Slider>().value = f_Dead.hp; } }
public override void Exit(T enemyEntity) { Debug.Log("quit attack!"); DeadComponent selfDeadComp = (DeadComponent)enemyEntity.m_entity.GetSpecicalComponent(ComponentType.Dead); if (target == null || target.m_components.Count == 0) { //如果敌人死亡了,那么把最后记录的敌人生命全部加上 enemyEntity.m_events.AddDemage(tmpTargetHp); tmpTargetHp = 0; } else { //如果敌人没有死亡,那么获取当前的生命加入事件伤害中 DeadComponent targetDeadComp = (DeadComponent)target.GetSpecicalComponent(ComponentType.Dead); enemyEntity.m_events.AddDemage(tmpTargetHp - targetDeadComp.hp); tmpTargetHp = targetDeadComp.hp; } //唯一一个会记录攻击的区域 enemyEntity.m_events.AddInjure(tmpHp - selfDeadComp.hp); tmpHp = selfDeadComp.hp; }
//添加某一类型的组件 public BasicComponent AddComponent(ComponentType type) { if (ExistSpecialComponent(type)) { //Debug.Log("Exist same component Type" + type); return(GetSpecicalComponent(type)); } //Debug.Log ("Add component" + type + " in " + gameObject); PropertyComponent property = GetComponent <PropertyComponent> (); switch (type) { case ComponentType.Property: PropertyComponent propertyComp = gameObject.AddComponent <PropertyComponent> (); propertyComp.Init(ComponentType.Property, this); m_components.Add(propertyComp); return(propertyComp); case ComponentType.Dead: DeadComponent deadComp = gameObject.AddComponent <DeadComponent> (); deadComp.Init(ComponentType.Dead, this); deadComp.hp = property.HP; m_components.Add(deadComp); return(deadComp); case ComponentType.State: StateComponent stateComp = gameObject.AddComponent <StateComponent> (); stateComp.Init(ComponentType.State, this); m_components.Add(stateComp); stateComp.m_actionPoint = property.AP; return(stateComp); case ComponentType.Ability: AbilityComponent abilityComp = gameObject.AddComponent <AbilityComponent> (); abilityComp.Init(ComponentType.Ability, this); m_components.Add(abilityComp); return(abilityComp); case ComponentType.Hide: HideComponent hideComp = gameObject.AddComponent <HideComponent> (); hideComp.Init(ComponentType.Hide, this); m_components.Add(hideComp); return(hideComp); case ComponentType.Move: MoveComponent moveComp = gameObject.AddComponent <MoveComponent> (); moveComp.Init(ComponentType.Move, this); m_components.Add(moveComp); moveComp.moveSpeed = property.moveSpd; moveComp.SPD = property.SPD; return(moveComp); case ComponentType.Attack: AttackComponent attackComp = gameObject.AddComponent <AttackComponent> (); attackComp.Init(ComponentType.Attack, this); m_components.Add(attackComp); attackComp.STR = property.STR; return(attackComp); case ComponentType.Input: InputComponent inputComp = gameObject.AddComponent <InputComponent> (); inputComp.Init(ComponentType.Input, this); m_components.Add(inputComp); return(inputComp); case ComponentType.CheerUp: CheerUpComponent cheerUpComp = gameObject.AddComponent <CheerUpComponent> (); cheerUpComp.Init(ComponentType.CheerUp, this); m_components.Add(cheerUpComp); return(cheerUpComp); case ComponentType.Monitor: MonitorComponent monitorComp = gameObject.AddComponent <MonitorComponent> (); monitorComp.Init(ComponentType.Monitor, this); m_components.Add(monitorComp); monitorComp.m_SightArea = property.HRZ; return(monitorComp); case ComponentType.Knock: KnockComponent knockComp = gameObject.AddComponent <KnockComponent> (); knockComp.Init(ComponentType.Knock, this); m_components.Add(knockComp); knockComp.m_ridus = property.HRZ; return(knockComp); case ComponentType.Item: ItemComponent itemComp = gameObject.AddComponent <ItemComponent> (); itemComp.Init(ComponentType.Item, this); itemComp.item = property.item; itemComp.numLimit = property.itemLimit; m_components.Add(itemComp); return(itemComp); case ComponentType.AI: AIComponent aiComp = gameObject.AddComponent <AIComponent> (); aiComp.Init(ComponentType.AI, this); m_components.Add(aiComp); return(aiComp); case ComponentType.UI: UIComponent uiComp = gameObject.AddComponent <UIComponent>(); uiComp.Init(ComponentType.UI, this); m_components.Add(uiComp); return(uiComp); default: return(null); } }
public override void Execte(T enemyEntity) { Debug.Log("exec attack!"); MonitorComponent monitorComp = (MonitorComponent)enemyEntity.m_entity.GetSpecicalComponent(ComponentType.Monitor); PropertyComponent propertyComp = (PropertyComponent)enemyEntity.m_entity.GetSpecicalComponent(ComponentType.Property); DeadComponent deadComp = (DeadComponent)enemyEntity.m_entity.GetSpecicalComponent(ComponentType.Dead); //生命值不足,且上一个动作不是呼叫朋友 if (deadComp.hp < 0.1f * propertyComp.HP && enemyEntity.m_events.CurrentDecision() != AIComponent.Decision.CallSupport) { //同时有朋友存在 if (AiToInput.ExistEnemy()) { enemyEntity.ChangeDecision(AIComponent.Decision.CallSupport); return; } } //如果敌人已经死亡 if (target == null || target.m_components.Count == 0) { //如果附近还有敌人 if (monitorComp.m_enemy.Count != 0) { target = monitorComp.m_enemy [0]; } if (monitorComp.m_enemy.Count != 0) { if (deadComp.hp / propertyComp.HP > 0.3f) { // 如果有玩家,且敌人的生命值较高的话,切换对象攻击,切换对象会在enter时进行 enemyEntity.ChangeDecision(AIComponent.Decision.Attack); return; } else { //有玩家,但是生命值不高,可以逃跑 if (AiToInput.ExistEnemy() && enemyEntity.m_events.CurrentDecision() != AIComponent.Decision.CallSupport) { enemyEntity.ChangeDecision(AIComponent.Decision.CallSupport); return; } } } if (monitorComp.m_voice.Count != 0) { //float i = Random.value; //double degreeAttack = FuzzyLogic.AttackBelong (deadComp.hp, propertyComp.HP); //double degreeProtect = FuzzyLogic.ProtectBelong (deadComp.hp, propertyComp.HP); if (deadComp.hp / propertyComp.HP > 0.2f) { //听到声音,生命充足 //float j = Random.value; //float surveyDemage = enemyEntity.m_events.DecisionExpectDemage (AIComponent.Decision.Survey); //float patrolDemage = enemyEntity.m_events.DecisionExpectDemage (AIComponent.Decision.Patrol); //Debug.Log ("surveyDemage" + surveyDemage + "patrolDemage" + patrolDemage); //根据历史计算哪种行动造成的伤害更多 //if (j >0.3f) { enemyEntity.ChangeDecision(AIComponent.Decision.Survey); return; //} else { //enemyEntity.ChangeDecision (AIComponent.Decision.Patrol); //return; //} } else { //float j = Random.value; //float surveyInjure = enemyEntity.m_events.DecisionExpectInjure (AIComponent.Decision.Survey); //float patrolInjeure = enemyEntity.m_events.DecisionExpectInjure (AIComponent.Decision.Patrol); //if (j > 0.3f) { if (AiToInput.ExistEnemy() && enemyEntity.m_events.CurrentDecision() != AIComponent.Decision.CallSupport) { enemyEntity.ChangeDecision(AIComponent.Decision.CallSupport); return; } //} else { //enemyEntity.ChangeDecision (AIComponent.Decision.Patrol); //return; //} } } //敌人死亡且旁边没有敌人,返回巡逻 enemyEntity.ChangeDecision(AIComponent.Decision.Patrol); return; } Debug.Log("run attack!"); //计算受伤 DeadComponent targetDeadComp = (DeadComponent)target.GetSpecicalComponent(ComponentType.Dead); enemyEntity.m_events.AddInjure(tmpHp - deadComp.hp); enemyEntity.m_events.AddDemage(tmpTargetHp - targetDeadComp.hp); tmpHp = deadComp.hp; tmpTargetHp = targetDeadComp.hp; Attack(enemyEntity.m_entity); return; }