예제 #1
0
    /// <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("------");
    }
예제 #2
0
 static public void put(ArchBuf x)
 {
     archBuf.Add(x);
 }