Пример #1
0
 public void DestroyObject(AttackableObject a)
 {
     toDestroy.Add(a);
     if (!a.isMovable)
     {
         staticObjects.RemoveAt(a.GetFloatArray());
     }
 }
Пример #2
0
 public void RemoveUnit(AttackableObject a)
 {
     units[a.TeamCode].Remove(a);
     if (!a.isMovable)
     {
         staticObjects.RemoveAt(a.GetFloatArray());
     }
 }
Пример #3
0
    public void AddUnit(AttackableObject a)
    {
        if (!unitCodes.Contains(a.TeamCode))
        {
            unitCodes.Add(a.TeamCode);
            units[a.TeamCode] = new List <AttackableObject>();
            units[a.TeamCode].Add(a);
        }
        else
        {
            units[a.TeamCode].Add(a);
        }

        if (!a.isMovable)
        {
            staticObjects.Add(a.GetFloatArray(), a);
            GameManager.instance.players[a.TeamCode].buildings.Add(a);
        }
        else
        {
            GameManager.instance.players[a.TeamCode].units.Add(a);
        }
    }
Пример #4
0
    IEnumerator HandleSearch()
    {
        float timeBeg   = 0;
        float timeInter = 0;

        int hitUnits = 0;

        timeInter = Time.realtimeSinceStartup;
        while (true)
        {
            hitUnits = 0;
            timeBeg  = Time.realtimeSinceStartup;
            Dictionary <int, KdTree <float, AttackableObject> > unitTrees = new Dictionary <int, KdTree <float, AttackableObject> >();
            for (int i = 0; i < unitCodes.Count; i++)
            {
                unitTrees[i] = new KdTree <float, AttackableObject>(2, new FloatMath());
                for (int j = 0; j < units[unitCodes[i]].Count; j++)
                {
                    AttackableObject u = units[unitCodes[i]][j];
                    unitTrees[i].Add(u.GetFloatArray(), u);
                    if (u.startSearch)
                    {
                        if (!u.onTargetSearch)
                        {
                            u.onTargetSearch = true;
                        }
                        u.startSearch = false;
                    }

                    if (Time.realtimeSinceStartup - timeInter > 0.005f)
                    {
                        //yield return new WaitForSeconds(0.1f * (Time.realtimeSinceStartup - timeInter) + 0.05f);
                        yield return(null);

                        timeInter = Time.realtimeSinceStartup;
                    }
                }
            }

            for (int i = 0; i < unitCodes.Count; i++)
            {
                for (int j = 0; j < units[unitCodes[i]].Count; j++)
                {
                    AttackableObject searcher = units[unitCodes[i]][j];
                    if (!searcher.onTargetSearch)
                    {
                        continue;
                    }
                    AttackableObject closest = null;
                    if (searcher.canAttack)
                    {
//                        Debug.Log("Can attack: " + searcher.canAttack);
                        for (int k = 0; k < unitCodes.Count; k++)
                        {
                            if (k == i)
                            {
                                continue;
                            }

                            if (unitTrees[unitCodes[k]].Count == 0)
                            {
                                continue;
                            }

                            AttackableObject temp = unitTrees[unitCodes[k]].GetNearestNeighbours(searcher.GetFloatArray(), 1)[0].Value;
                            if (temp != null && (closest == null || Vector3.Distance(searcher.transform.position, closest.transform.position) > Vector3.Distance(searcher.transform.position, temp.transform.position)))
                            {
                                closest = temp;
                            }
                        }
                    }
                    else if (searcher.isCollector)
                    {
                        //                        Debug.Log("Searcher is collector");

                        /*int searchCount = 1;
                         * while (closest == null && searchCount < resources.Count)
                         * {
                         *
                         * }*/
                        //                        Debug.Log("Resource node is null: " + (resources.GetNearestNeighbours(searcher.GetFloatArray(), 1)[0].Value == null));
                        KdTreeNode <float, ResourceNode>[] temp = resources.GetNearestNeighbours(searcher.GetFloatArray(), 1);
                        if (temp.Length > 0 && temp[0] != null)
                        {
                            closest = resources.GetNearestNeighbours(searcher.GetFloatArray(), 1)[0].Value;
                        }
                    }
                    else
                    {
                        Debug.Log("Nothing");
                    }

                    if (closest != null)
                    {
//                        if (searcher.TeamCode == 0 && closest.TeamCode == searcher.TeamCode) Debug.Log("Closest is on the same team");

                        float distance = Vector3.Distance(searcher.transform.position, closest.transform.position);

                        if (searcher.isMovable && searcher.searchRange >= distance)
                        {
                            if (searcher.overrideMovement)
                            {
//                                Debug.Log("Unit found target while overriding movement");
                                searcher.target         = closest;
                                searcher.onTargetSearch = false;
                                searcher.isAttacking    = true;
                            }
                            else
                            {
                                searcher.target         = closest;
                                searcher.onTargetSearch = false;
                                searcher.startApproach  = true;
                            }
                        }
                        else if (searcher.idealRange >= distance)
                        {
                            searcher.target         = closest;
                            searcher.onTargetSearch = false;
                            searcher.isAttacking    = true;
                        }

                        /*else if(searcher.TeamCode == 0)
                         * {
                         *  Debug.Log(distance + " > " + searcher.searchRange + " : " + searcher.gameObject.name);
                         * }*/

                        /*if (searcher.isMovable && !searcher.overrideMovement)
                         * {
                         *  searcher.target = closest;
                         *  searcher.onTargetSearch = false;
                         *  searcher.startApproach = true;
                         * }
                         * else if(Vector3.Distance(searcher.transform.position, closest.transform.position) <= searcher.idealRange)
                         * {
                         *  searcher.target = closest;
                         *  searcher.onTargetSearch = false;
                         *  searcher.startAttack = true;
                         * }*/
                    }

                    if (Time.realtimeSinceStartup - timeInter > 0.005f)
                    {
                        //yield return new WaitForSeconds(0.1f * (Time.realtimeSinceStartup - timeInter) + 0.05f);
                        yield return(null);

                        timeInter = Time.realtimeSinceStartup;
                    }
                }
            }
            deltaSearchTime.text = "DST: " + ((Time.realtimeSinceStartup - timeBeg)) + " TU: " + hitUnits;
            yield return(new WaitForSeconds(0.5f + 1.0f * (Time.realtimeSinceStartup - timeBeg)));
        }
    }