RectTransform SpawnDot(int i)
    {
        GameObject dot = new GameObject("DotImage_" + i.ToString());

        float   index    = ((float)i / (float)dotN) * Mathf.PI * 2.0f;
        Vector3 localPos = new Vector3(Mathf.Sin(index), Mathf.Cos(index), 0.0f) * rayLength;

        RectTransform dotTransform = dot.AddComponent <RectTransform>();

        dotTransform.SetParent(pivot, false);
        dotTransform.localPosition = localPos;
        dotTransform.sizeDelta     = new Vector2(dotSize, dotSize);

        dotPositionInfo[i] = new PositionAnimationInfo
        {
            minDotPosition = dotTransform.localPosition,
            maxDotPosition = dotTransform.localPosition * 1.3f
        };

        Image dotImage = dot.AddComponent <Image>();

        dotImage.sprite         = dotSprite;
        dotImage.color          = Color.black;
        dotImage.preserveAspect = true;
        dotImage.raycastTarget  = false;

        return(dotTransform);
    }
    void Awake()
    {
        pivot = GetComponent <RectTransform>();

        dots            = new RectTransform[dotN];
        dotPositionInfo = new PositionAnimationInfo[dotN];

        for (int i = 0; i < dotN; i++)
        {
            dots[i] = SpawnDot(i);
        }

        minDotScale = new Vector3(0.55f, 0.55f, 0.55f);
        maxDotScale = new Vector3(1.15f, 1.15f, 1.15f);
        minRotSpeed = rotationAnimSpeed * 0.5f;
        maxRotSpeed = rotationAnimSpeed * 4f;

        endScale = pivot.localScale;
    }