/// <summary> /// Здесь вызваем обстрел врага с разными модификатора для каждого солдата /// </summary> public void archerAt(int NumReg, int NumRegTarg, bool togewer) { float distance = 0; // Расстояние до полка - цели distance = (mainStatic.regiment_stat[NumReg].regPosition - mainStatic.regiment_stat[NumRegTarg].regPosition).magnitude; // есть ли прямая видмость, пока есть, но потом добавить рейкасты bool DirectView = false; // кроме этого, надо понять по направлению Vector3 v, b; v = (mainStatic.regiment_stat[NumRegTarg].regPosition - mainStatic.regiment_stat[NumReg].regPosition).normalized; b = (mainStatic.regiment_stat[NumRegTarg].soldiers[0].transform.position + mainStatic.regiment_stat[NumRegTarg].soldiers[0].transform.forward).normalized; /// Если в зоне видимости нулевого солдата, то находится в прямлой видимости if (Mathf.Abs(Vector3.Angle(v, b)) < 45) { DirectView = true; } // Одно время для залпа float RegTipe = Random.Range(0, 1000) / 1000.0f * mainStatic.TACTICPERIOD;// +0.3f; for (int t = 0; t < mainStatic.regiment_stat[NumReg].soldiers.Count; t++) { ArchBuf temp = new ArchBuf(); if (mainStatic.regiment_stat[NumReg].soldiers[t].archer == true) // Если он стрелок, добавляем стрелу, производим выстрел { //Если стрелок - добавляем стрелу int r = 0; ///Атакованный человек r = Random.Range(0, mainStatic.regiment_stat[NumRegTarg].soldiers.Count); /// определяем три параметра для улетевшей стрелы temp.stPos = mainStatic.regiment_stat[NumReg].soldiers[t].gameObject.transform.position; temp.forw = Quaternion.LookRotation((mainStatic.regiment_stat[NumRegTarg].soldiers[r].gameObject.transform.position - mainStatic.regiment_stat[NumReg].soldiers[t].gameObject.transform.position).normalized + mainStatic.regiment_stat[NumReg].soldiers[t].gameObject.transform.up); float dis = (mainStatic.regiment_stat[NumRegTarg].soldiers[r].gameObject.transform.position - mainStatic.regiment_stat[NumReg].soldiers[t].gameObject.transform.position).magnitude; temp.speed = Mathf.Pow(2, 0.5f) * Mathf.Pow(dis * 9.8f / 2, 0.5f); //ArrowBuff.put(temp); if (archerCheme.makeBum(mainStatic.regiment_stat[NumReg].soldiers[t].FirstLine, mainStatic.regiment_stat[NumReg].soldiers[t].getObject().GetComponent <UnitArcher>().archerType, mainStatic.regiment_stat[NumReg].soldiers[t].getObject().GetComponent <UnitArcher>().archerSkill, distance, DirectView) == true) { // Если атака успешная if (Random.Range(0, 20) > (mainStatic.regiment_stat[NumRegTarg].soldiers[r].defence - mainStatic.regiment_stat[NumReg].soldiers[t].getObject().GetComponent <UnitArcher>().archerPower)) { // Если пробиты доспехи, то надо добавить DeathBuf p; p = new DeathBuf(); p.regNum = NumRegTarg; p.solNum = r; if (togewer == true) { /// Если стреляют все вместе p.time = RegTipe; DeadBuff.put(p); temp.time = RegTipe - dis / temp.speed; Debug.Log(temp.time); ArrowBuff.put(temp); } else { p.time = Random.Range(0, 1000) / 1000.0f * mainStatic.TACTICPERIOD; DeadBuff.put(p); temp.time = p.time - dis / temp.speed; Debug.Log(temp.time); ArrowBuff.put(temp); /// Если стреляют по очереди } } } } } Debug.Log("------"); for (int u = 0; u < ArrowBuff.archBuf.Count; u++) { //Debug.Log(ArrowBuff.archBuf[u].time); //Debug.Log(ArrowBuff.archBuf[u].speed); } Debug.Log("------"); }
static public void put(ArchBuf x) { archBuf.Add(x); }