bool Attack() { // Debug.Log("--------------Attack--------------"); if (aiConfig.attackLevel == AIAttackLevel.Level_0_Lazy) { return(false); } // 攻击,随机派部队数量 int sendCount = aiConfig.GetAttackSendCount(); // Debug.Log("攻击,随机派部队数量 sendCount=" + sendCount); if (sendCount <= 0) { return(false); } // 攻击,生成派兵的建筑 List <UnitCtl> ownSelectBuilds = new List <UnitCtl>(); int index = 0; foreach (UnitCtl build in ownBuilds) { if (index < sendCount) { if (build.hp <= 0) { continue; } if (build.unitData.behit && Random.Range(0f, 1f) > aiConfig.attackBehitRate) { continue; } ownSelectBuilds.Add(build); index++; } if (index >= sendCount) { break; } } // 计算敌人建筑被攻击值 List <UnitCtl> enemyBuilds = War.scene.GetEnemyBuilds(legionId); if (enemyBuilds.Count <= 0) { return(false); } foreach (UnitCtl enemyBuild in enemyBuilds) { float distance = 0; foreach (UnitCtl ownBuild in ownSelectBuilds) { distance += War.scene.GetBuildDistance(enemyBuild, ownBuild); } distance /= ownSelectBuilds.Count; enemyBuild.unitData.attackScore = enemyBuild.unitData.hp + distance * distanceScoreRate_Attack; // Debug.Log(string.Format("<color=grey>id={0}, hp={1}, distance={2}, attackValue={3}</color>", enemyBuild.unitData.id, enemyBuild.unitData.hp, distance, enemyBuild.unitData.attackScore)); } // 排序敌人建筑被攻击值 enemyBuilds.Sort(delegate(UnitCtl A, UnitCtl B) { return(Mathf.RoundToInt(A.unitData.attackScore - B.unitData.attackScore)); }); // 随机选择敌人建筑 int enemyIndex = aiConfig.GetAttackTargetIndex(); if (enemyIndex >= enemyBuilds.Count) { enemyIndex = enemyBuilds.Count - 1; } // Debug.Log("随机选择敌人建筑 enemyIndex=" + enemyIndex); UnitCtl targetBuild = enemyBuilds[enemyIndex]; bool isSend = true; if (aiConfig.attackLevel == AIAttackLevel.Level_1_Cautious) { float hp = 0; foreach (UnitCtl ownBuild in ownSelectBuilds) { hp += ownBuild.unitData.hp * aiConfig.sendArmPercent; // Debug.Log("HP" + hp); } hp = WarFormula.WD_Solider2Casern_Damage(targetBuild.unitData.def, unitData.legionData.soliderInitData.atk, hp); isSend = hp > targetBuild.unitData.hp; } if (isSend) { // Debug.Log("<color=blue>攻击</color>"); foreach (UnitCtl ownBuild in ownSelectBuilds) { // Debug.LogFormat("<color=blue>ownBuild.hp={0}, aiConfig.sendArmPercent=</color>", ownBuild.hp, aiConfig.sendArmPercent); BSendArming bSendArming = ownBuild.GetComponent <BSendArming>(); bSendArming.Send(targetBuild, aiConfig.sendArmPercent); } } return(isSend); }
public float GetBuildDistance(UnitCtl a, UnitCtl b) { return(GetBuildDistance(a.unitData.id, b.unitData.id)); }
/** 判断该技能是否能应用到某个单位 */ public bool EnableUse(UnitCtl unit, RelationType unitRelation) { if (isSettledBuild && unit.unitData.hasHero) { return(false); } if (targetBuildType != BuildType.None && unit.unitData.buildType != targetBuildType) { return(false); } if (costHP > 0 && unit.unitData.hp < costHP) { return(false); } if (costHPPer > 0 && unit.unitData.hp < unit.unitData.GetBuildUplevelRequireHp(costHPPer)) { return(false); } bool isUplevel = false; switch (skillType) { case SkillType.Build_Uplevel: isUplevel = true; break; // case SkillType.Build_Replace: // if(buildId == unit.unitData.buildConfig.id) // { // isUplevel = true; // } // break; } if (isUplevel) { if (!unit.levelData.GetSkillEnableUpLevel(addBuildMaxLevel)) { return(false); } } if (skillWarConfig.mainEffectData.target == (int)eSkillWarTargetType.eEffectTargetBuild) { } else if (skillWarConfig.mainEffectData.target == (int)eSkillWarTargetType.eEffectTargetEmptyBuild) { if (unit.unitData.legionData.colorId == WarColor.Gray) { return(false); } } else if (skillWarConfig.mainEffectData.target == (int)eSkillWarTargetType.eEffectTargetHeroBuild) { if (unit.heroData == null) { return(false); } } switch (unitRelation) { case RelationType.Own: return(relation.ROwn()); break; case RelationType.Friendly: return(relation.RFriendly()); break; case RelationType.Enemy: if (unit.unitData.invincible) { return(false); } return(relation.REnemy()); break; } return(false); }
/** 建筑升级 */ public void C_Turret(UnitCtl build, UnitCtl solider) { War.service.C_SyncTurret_0x826(build.unitData.uid, solider.unitData.uid); }
/** 发兵 */ public void C_SendArm(UnitCtl from, UnitCtl to, int count, int idBegin) { War.service.C_SyncSendArm_0x820(from.unitData.id, to.unitData.id, count, idBegin); }
protected override void OnUpdate() { base.OnUpdate(); // if(!unit.IsMyTeam) // { // if(isDrawing) // { // targetUnit = null; // isDrawing = false; // arrow.SetActive(false); // } // return; // } bool enableFrom = War.input.sendArm; if (enableFrom) { enableFrom = Games.Guides.Guide.warConfig.GetEnableSendArmFrom(unit.unitData.uid); } if (!enableFrom) { if (isDrawing) { targetUnit = null; isDrawing = false; arrow.SetActive(false); } return; } if (Input.GetMouseButtonDown(0)) { // if (EventSystem.current == null || !EventSystem.current.IsPointerOverGameObject()) // { if (IsSelf()) { isDown = true; preMousePosition = Input.mousePosition; War.signal.HandDownBuild(unit.unitData.id); } // } } if (isDown) { offset = Input.mousePosition - preMousePosition; if (offset.sqrMagnitude > 0.1F) { isDown = false; DrawStart(); } } if (isDrawing) { DrawMoveing(); } if (Input.GetMouseButtonUp(0)) { isDown = false; War.signal.HandUpBuild(unit.unitData.id); if (isDrawing) { DrawEnd(); } } }
/** 鼠标--拖动 */ public void OnDragHandler() { // Debug.Log("SkillOperateController OnDragHandler _isDrag=" + _isDrag); if (!interactable) { return; } ClearSelectCacheList(); rectTransform.anchoredPosition = Input.mousePosition * rate; SkillOperateState operateState = SkillOperateState.Drag_Object; Ray ray = uiCamera.ScreenPointToRay(Input.mousePosition); RaycastHit2D hit2D = Physics2D.Raycast(ray.origin, ray.direction); if (hit2D.collider != null) { //如果射线检测到的gameobject为grid,就把当前Panel放在grid节点下 if (hit2D.collider.gameObject == buttonStateRect) { operateState = SkillOperateState.Drag_Button; } } if (data.skillConfig.operate == SkillOperateType.SelectUnit || data.skillConfig.operate == SkillOperateType.SelectCircle) { scaleNode.localScale = Vector3.one * Mathf.Lerp(1, 0f, operateState == SkillOperateState.Drag_Button ? Mathf.Abs(rectTransform.position.y - initPosition.y) / 2.5f : 1f); } else { scaleNode.localScale = Vector3.one * Mathf.Lerp(1, 0.5f, operateState == SkillOperateState.Drag_Button ? Mathf.Abs(rectTransform.position.y - initPosition.y) / 2.5f : 1f); } skillInfoNode.Visiable = operateState == SkillOperateState.Drag_Object; if (bezierArrow.useing) { if (data.operateState != operateState) { bezierArrow.Visiable = operateState == SkillOperateState.Drag_Object; } } data.operateState = operateState; bool hasTarget = true; if (data.skillConfig.operate == SkillOperateType.SelectUnit) { hasTarget = data.candidateReceiveCount > 0; } skillInfoNode.HasTarget = hasTarget; bool isSnap = data.skillConfig.operate == SkillOperateType.SelectUnit; RaycastHit hit3d; ray = Camera.main.ScreenPointToRay(Input.mousePosition); data.candidateEntity = null; if (isSnap && War.config.skillSnap && data.operateState == SkillOperateState.Drag_Object) { if (Physics.Raycast(ray, out hit3d, maxDistance, groundLayer.value)) { Vector3 hitPoint = hit3d.point.SetY(0F); float minDistance = float.MaxValue; UnitCtl minEntity = null; for (int i = 0; i < data.candidateReceiveList.Count; i++) { UnitCtl entity = data.candidateReceiveList [i]; float distance = Vector3.Distance(hitPoint, entity.transform.position); if (distance < minDistance) { minDistance = distance; minEntity = entity; } } data.candidateEntity = minEntity; } } else { if (isSnap) { if (Physics.Raycast(ray, out hit3d, maxDistance, unitLayer.value)) { UnitCtl entity = hit3d.collider.gameObject.GetComponent <UnitCtl> (); if (entity != null && data.EnableUse(entity)) { data.candidateEntity = entity; } } } else if (data.skillConfig.operate == SkillOperateType.SelectCircle) { if (Physics.Raycast(ray, out hit3d, maxDistance, groundLayer.value)) { obj.transform.position = hit3d.point.SetY(0F); List <UnitCtl> entityList = War.scene.SearchUnit(obj.transform.position, data.skillConfig.radius, data.skillConfig.unitType, data.legionId, data.skillConfig.relation); for (int i = 0; i < entityList.Count; i++) { AddSelectCache(entityList[i]); } helpPoint.anchoredPosition = Camera.main.WorldToScreenPoint(obj.transform.position) * rate; } } } if (isSnap) { if (data.candidateEntity != null) { rectTransform.anchoredPosition = Camera.main.WorldToScreenPoint(data.candidateEntity.transform.position) * rate; if (obj != null) { obj.transform.position = data.candidateEntity.transform.position; } AddSelectCache(data.candidateEntity); } else if (obj != null) { if (Physics.Raycast(ray, out hit3d, maxDistance, groundLayer.value)) { obj.transform.position = hit3d.point.SetY(0F); } } helpPoint.anchoredPosition = rectTransform.anchoredPosition; } else { helpPoint.anchoredPosition = rectTransform.anchoredPosition; } // if(obj != null) // { // // if(isSnap && Physics.Raycast(ray, out hit3d, maxDistance, unitLayer.value)) // { // UnitCtl entity = hit3d.collider.gameObject.GetComponent<UnitCtl>(); // if(entity != null && data.EnableUse(entity)) // { // obj.transform.position = hit3d.collider.transform.position; // // // AddSelectCache (entity); // } // // } // else if(Physics.Raycast(ray, out hit3d, maxDistance, groundLayer.value)) // { // obj.transform.position = hit3d.point.SetY(0F); // // // List<UnitCtl> entityList = War.scene.SearchUnit (obj.transform.position, data.skillConfig.radius, data.skillConfig.unitType, data.legionId, data.skillConfig.relation); //// List<UnitCtl> entityList = War.scene.SearchUnit (obj.transform.position, data.skillConfig.radius, 0.USolider(true), data.legionId, 0.REnemy(true)); // // // for(int i = 0; i < entityList.Count; i++) // { // AddSelectCache (entityList[i]); // } // } // // // helpPoint.anchoredPosition = Camera.main.WorldToScreenPoint(obj.transform.position) * rate; // // } // else // { // if(isSnap && Physics.Raycast(ray, out hit3d, maxDistance, unitLayer.value)) // { // UnitCtl entity = hit3d.collider.gameObject.GetComponent<UnitCtl>(); // if(entity != null && data.EnableUse(entity)) // { // rectTransform.anchoredPosition = Camera.main.WorldToScreenPoint(hit3d.collider.transform.position) * rate; // AddSelectCache (entity); // } // } // // helpPoint.anchoredPosition = rectTransform.anchoredPosition; // } if (bezierArrow.useing) { bezierArrow.endAnchor.position = helpPoint.position + new Vector3(0, 0, 5); } SetSelectCacheListEffect(); }
IEnumerator buildHurtOtherTimer(EffectParameter effectInfo) { UnitCtl unit = gameObject.GetComponent <UnitCtl>(); effectInfo.waitTime = 9999; int timerCount = 0; //SkillWarConf skillWarConf = War.model.GetSkillWarConf(skillParameter.skillId); while (true) { try { if (effectInfo.effect.buffAnimPath != "temp") { GameObject effectPrefab = WarRes.GetPrefab(effectInfo.effect.buffAnimPath); GameObject effectAnim = GameObject.Instantiate <GameObject>(effectPrefab); effectAnim.transform.position = unit.transform.position; } } catch (Exception e) { if (Application.isEditor) { Debug.LogError(e); } break; } yield return(new WaitForSeconds(effectInfo.effect.time)); try { //DamageVO damageVo = War.skillWarManager.GetDamageParameter(effectInfo.value, false, DamageType.ATTACK, unit, effectInfo.caster); // unit.Damage(damageVo); UnitCtl unitEnemy = War.skillWarManager.GetEnemyBuildNearest(unit, effectInfo); if (unitEnemy != null) { War.skillWarManager.sendSkillAnim(unit.transform.position, unitEnemy, effectInfo.effect.animPathStart, 5.0f, 1.0f); StartCoroutine(buildHurt(unitEnemy, effectInfo)); } Debug.Log(string.Format("<color=yellow> buildHurtOtherTimer all= effectid:{0} </color>", effectInfo.effect.id)); timerCount++; if (timerCount >= effectInfo.waitTime) { break; } } catch (Exception e) { if (Application.isEditor) { Debug.LogError(e); } break; } } effectInfo.waitTime = 0; CleanList(); Debug.Log(string.Format("<color=white> buildHurtOtherTimer done=</color>")); }
/** 添加经验--箭塔攻击 */ public virtual void AddExp_SoliderTurret(float num, UnitCtl unit) { float exp = num * LegionLevelSoliderExpConfig.SoliderTurretExp; AddExp(exp); }
IEnumerator effectBuildCantSendTimer(EffectParameter effectParameter, AttachPropData attachPropData, UnitCtl unit) { yield return(new WaitForSeconds(effectParameter.value)); if (effectParameter.effect.type == (int)eSKillWarEffectType.eEffectReduceSpeedTo)//修改材质 { unit.unitAgent.BackMaterial(WarMaterialsType.stateFreeze); } unit.unitData.RevokeProps(attachPropData, true); effectParameter.waitTime = 0; CleanList(); Debug.Log(string.Format("<color=yellow> effectBuildCantSendTimer </color>")); }
public virtual void OnRelease() { unit = null; }
/** 判断该技能是否能应用到某个单位 */ public bool EnableUse(UnitCtl unit, RelationType unitRelation) { if (isSettledBuild && unit.heroData != null) { return(false); } if (targetBuildType != BuildType.None && unit.unitData.buildType != targetBuildType) { return(false); } if (costHP > 0 && unit.unitData.hp < costHP) { return(false); } if (costHPPer > 0 && unit.unitData.hp < unit.unitData.GetBuildUplevelRequireHp(costHPPer)) { return(false); } bool isUplevel = false; switch (skillType) { case SkillType.Build_Uplevel: isUplevel = true; break; // case SkillType.Build_Replace: // if(buildId == unit.unitData.buildConfig.id) // { // isUplevel = true; // } // break; } if (isUplevel) { if (!unit.levelData.GetSkillEnableUpLevel(addBuildMaxLevel)) { return(false); } } switch (unitRelation) { case RelationType.Own: return(relation.ROwn()); break; case RelationType.Friendly: return(relation.RFriendly()); break; case RelationType.Enemy: if (unit.unitData.invincible) { return(false); } return(relation.REnemy()); break; } return(false); }
public bool SearchCirclePosition(float radius, int legionId, int relation, out Vector3 result) { List <UnitCtl> soliderList = War.scene.soliderList; List <Vector3> pointTotals = new List <Vector3>(); List <Vector3> pointCenters = new List <Vector3>(); List <int> pointCounts = new List <int>(); float distance = radius * 2; for (int i = 0; i < soliderList.Count; i++) { UnitCtl entity = soliderList[i]; RelationType relationType = entity.unitData.GetRelation(legionId); if (relation.RValue(relationType) == false) { continue; } Vector3 pos = entity.transform.position; bool hasContain = false; for (int index = 0; index < pointCenters.Count; index++) { Vector3 center = pointCenters[index]; if (Vector3.Distance(center, pos) <= distance) { pointTotals[index] += pos; pointCounts[index] += 1; pointCenters[index] = pointTotals[index] / pointCounts[index]; hasContain = true; break; } } if (hasContain == false) { pointTotals.Add(pos.Clone()); pointCenters.Add(pos.Clone()); pointCounts.Add(1); } } int maxIndex = -1; int maxCount = -1; for (int index = 0; index < pointCounts.Count; index++) { if (maxCount < pointCounts[index]) { maxCount = pointCounts[index]; maxIndex = index; } } if (maxIndex != -1) { result = pointCenters[maxIndex]; // War.skillUse.selectCircleView.transform.position = result; // War.skillUse.selectCircleView.Radius = radius; // War.skillUse.selectCircleView.gameObject.SetActive(true); return(true); } result = Vector3.zero; return(false); }
virtual public void S_Send(UnitCtl target, int count, int idBegin) { ExeSend(target, count, idBegin); }