/// <summary> /// //计算英雄探索某一野外的收益 /// </summary> /// <param name="heroData">英雄数据</param> /// <param name="heroPos">英雄位置</param> /// <param name="fieldData">野外数据</param> /// <param name="fieldPos">野外位置</param> /// <returns></returns> public float Calculate(HeroData heroData, Vector3 heroPos, FieldData fieldData, Vector3 fieldPos) { //收益 //经验 + 金钱 + 声望 float exp = CalculateExp(heroData, fieldData, fieldData.resRemain); float gold = CalculateGold(heroData, fieldData, fieldData.resRemain); float fame = CalculateFame(heroData, fieldData, fieldData.resRemain); //时间 float time = CalculateExploreTime(heroData, fieldData, fieldData.resRemain); //路途时间 float travelTime = EUtilityHelperL.CalcDistanceIn2D(heroPos, fieldPos) / heroData.moveSpeed; return((exp + gold + fame) / (time + travelTime + Mathf.Epsilon)); }
//获取一个随机的野外位置 private Vector3 GetFieldPos(Transform city) { Vector3 randPos = Vector3.zero; //每次随机查找位置可以随机的机会,越大则越可能让世界摆放的相对分散,计算时间也越长 int chance = randomChance; //是否找到了合适的位置 bool findOut = false; List <Transform> temp = null; m_fieldClonesAroundCity.TryGetValue(city, out temp); while (chance > 0 && !findOut) { findOut = true; --chance; //在m_cityRadiusRange.x ~ m_cityRadiusRange.y半径范围内随机一个位置 //注意这里随机的位置是相对于当前city空间的 var randV2 = Random.insideUnitCircle.normalized * Random.Range(m_cityRadiusRange.x, m_cityRadiusRange.y); randPos.x = randV2.x; randPos.z = randV2.y; if (temp != null) { //计算与其他野外的位置关系 foreach (var item in temp) { //距离有点近呢 //需要将空间位置进行一次转换 if (EUtilityHelperL.CalcDistanceIn2D(city.InverseTransformPoint(item.transform.position), randPos) < m_fieldDensity) { findOut = false; break; } } } } //提醒一下 if (!findOut) { Debug.LogWarning("没有找到合适的野外位置,凑合一下吧~"); } return(randPos); }
/// <summary> /// 获得随机的野外位置 /// </summary> /// <param name="density">密度系数</param> /// <param name="minRadius">最小半径</param> /// <param name="maxRadius">最大半径</param> /// <returns></returns> private Vector3 GetFieldPos(float density, float minRadius, float maxRadius) { Vector3 randPos = Vector3.zero; //每次随机查找位置可以随机的机会,越大则越可能让世界摆放的相对分散,计算时间也越长 int chance = EGameConstL.FIELD_RAND_CHANCE; //是否找到了合适的位置 bool findOut = false; while (chance > 0 && !findOut) { findOut = true; --chance; //在m_cityRadiusRange.x ~ m_cityRadiusRange.y半径范围内随机一个位置 //注意这里随机的位置是相对于当前city空间的 var randV2 = Random.insideUnitCircle.normalized * Random.Range(minRadius, maxRadius); randPos.x = randV2.x; randPos.z = randV2.y; //计算与其他野外的位置关系 foreach (var item in m_roundFields) { //距离有点近呢 //需要将空间位置进行一次转换 if (EUtilityHelperL.CalcDistanceIn2D(transform.InverseTransformPoint(item.transform.position), randPos) < density) { findOut = false; break; } } } //提醒一下 if (!findOut) { Debug.LogWarning("Can not find out optimum random position for field..."); } return(randPos); }
//获取一个随机的城市位置 private Vector3 GetCityPos() { Vector3 randPos = new Vector3(0f, 1.01f, 0f); //每次随机查找位置可以随机的机会,越大则越可能让世界摆放的相对分散,计算时间也越长 int chance = EGameConstL.CITY_RAND_CHANCE; //是否找到了合适的位置 bool findOut = false; while (chance > 0 && !findOut) { findOut = true; --chance; //随机一个位置 randPos.x = Random.Range(-m_mapSize.x * 0.5f, m_mapSize.x * 0.5f); randPos.z = Random.Range(-m_mapSize.y * 0.5f, m_mapSize.y * 0.5f); //计算与其他城市间的位置关系 foreach (var item in m_allCities) { //距离有点近呢 if (EUtilityHelperL.CalcDistanceIn2D(item.transform.localPosition, randPos) < m_cityDensity) { findOut = false; break; } } } //提醒一下 if (!findOut) { Debug.LogWarning("Can not find out optimum random position for city..."); } return(randPos); }