/// <summary> /// 得到指定距离可用攻击位 /// </summary> /// <param name="attackDist_">攻击距离</param> private Vector3 OnGetAttackSlot(attackRoleInfo attackInfo_) { // 填充攻击者 if (attackInfoNumDict.ContainsKey(attackInfo_.attackDist)) { attackInfoNumDict[attackInfo_.attackDist] += 1; } else { attackInfoNumDict.Add(attackInfo_.attackDist, 1); } // 找到有没有当前攻击距离的攻击槽信息 List <slotInfo> nowSlotList = OnGetAttckSlots(attackInfo_.attackDist); //if (slotDict.ContainsKey(attackInfo_.attackDist)) // nowSlotList = slotDict[attackInfo_.attackDist]; // 有就直接得到 //else // nowSlotList = OnGetAttckSlots(attackInfo_.attackDist); // 没有就获取 // 得到攻击槽位 slotInfo slotInfo = null; if (nowSlotList.Count > 0) { for (int j = 0; j < nowSlotList.Count; ++j) { slotInfo info = nowSlotList[j]; if (!info.isOccupy) { if (slotInfo == null) { slotInfo = info; } else { // 目标槽位距离 float targetDis = Vector3.Distance(attackInfo_.attackRole.position, slotInfo.attackPos); // 当前槽位距离 float currDis = Vector3.Distance(attackInfo_.attackRole.position, info.attackPos); // 找到和自己距离最短的攻击位 if (currDis < targetDis) { slotInfo = info; } } } } } // 设置占用 if (slotInfo != null) { slotInfo.isOccupy = true; } return(slotInfo != null ? slotInfo.attackPos : Vector3.zero); }
/// <summary> /// 测试工具函数-设置移动 /// </summary> private IEnumerator OnSetModelMove(attackRoleInfo obj_) { while (true) { if (Vector3.Distance(obj_.attackRole.position, obj_.targetPos) > 0.01f) { // 均速移动 obj_.attackRole.position = Vector3.MoveTowards(obj_.attackRole.position, obj_.targetPos, Time.deltaTime * 2f); } else { yield break; } yield return(new WaitForSeconds(0.01f)); } }
/// <summary> /// 寻找目标攻击点 /// </summary> private void OnSelectAttackPos() { // 攻击距离 float attackDist = 5f; for (int i = 0; i < attackList.Count; ++i) { attackRoleInfo attackInfo = attackList[i]; // 获取攻击位 Vector3 slotPos = OnGetAttackSlot(attackInfo); if (slotPos != Vector3.zero) { attackInfo.targetPos = slotPos; StartCoroutine(OnSetModelMove(attackInfo)); } } }