Пример #1
0
    private Species GetKey(Vector3 worldPos)
    {
        var sqr   = radius * radius;
        var nears = lifes
                    .Where(v => (v.transform.position - worldPos).sqrMagnitude < sqr);
        var count = nears.Count();

        int modelIndex = -1;
        int colorIndex = -1;

        if (count > 0 && !Interfered())
        {
            var modelTabs = new Tabulator <int, float>();
            foreach (var n in nears.Select(v => v.CurrentKey))
            {
                modelTabs[n.model]++;
            }

            var max = modelTabs.Values.Max();
            int valueIndex;
            if (RouletteWheelSelection.Sample(out valueIndex, 100, max, modelTabs.ValuesAsList))
            {
                modelIndex = modelTabs.KeysAsList[valueIndex];
            }

            var colors     = nears.Where(v => v.CurrentKey.model == modelIndex);
            var colorCount = colors.Count();
            if (colorCount > 0 && !Interfered())
            {
                var colorTabs = new Tabulator <int, float>();
                foreach (var n in colors.Select(v => v.CurrentKey))
                {
                    colorTabs[n.color]++;
                }

                var maxColor = colorTabs.Values.Max();
                int colorTabIndex;
                if (RouletteWheelSelection.Sample(out colorTabIndex, 100, maxColor, colorTabs.ValuesAsList))
                {
                    colorIndex = colorTabs.KeysAsList[colorTabIndex];
                }
            }
        }

        if (modelIndex < 0)
        {
            modelIndex = Random.Range(0, LifeStrage.Instance.models.Length);
        }
        var model = LifeStrage.Instance.GetModel(modelIndex);

        if (colorIndex < 0)
        {
            colorIndex = Random.Range(0, model.colors.Length);
        }

        var spec = new Species(modelIndex, colorIndex);

        Debug.LogFormat("Chosen key={0} neighbors={1}", spec, count);
        return(spec);
    }