Example #1
0
        void CreateRing(Vector2 pos)
        {
            if (ring.Count == 0)
            {
                var b = Instantiate(BodyPrefab) as Transform;
                b.gameObject.SetActive(true);
                var cb = b.GetComponent <CelestialBody>();
                cb._transform.position = startRingPos;
                SetSizeFor(cb, 0.5f);
                cb.FindAndSetMostProperAttractor();
                cb.enabled = false;
                b.GetComponentInChildren <SpriteRenderer>().color = new Color(0.6f, 0.9f, 0, 9f);
                var cl = cb.GetComponentsInChildren <Collider2D>();
                for (int i = 0; i < cl.Length; i++)
                {
                    cl[i].enabled = false;
                }
                ring.Add(cb);
            }
            if (ring[0].Attractor == null)
            {
                return;
            }
            var  mouseDist  = (pos - startRingPos).magnitude;
            var  radius     = ring[0].Attractor._transform.position - ring[0]._transform.position;
            var  r          = radius.magnitude;
            var  cnt        = (int)(2 * Mathf.PI * r / Mathf.Max(mindist, mouseDist));
            bool countCange = false;

            while (ring.Count < cnt - 1)
            {
                var d = Instantiate(ring[0]) as CelestialBody;
                d.gameObject.SetActive(true);
                ring.Add(d);
                countCange = true;
            }
            while (ring.Count > cnt)
            {
                var d = ring[cnt];
                ring.RemoveAt(cnt);
                Destroy(d.gameObject);
                countCange = true;
            }
            for (int i = 0; i < ring.Count; i++)
            {
                ring[i]._transform.position = ring[i].Attractor._transform.position + new Vector3(Mathf.Cos(2 * Mathf.PI * ((float)i / (cnt - 1))) * r, Mathf.Sin(2 * Mathf.PI * ((float)i / (cnt - 1))) * r, 0);
                if (countCange)
                {
                    ring[i].MakeOrbitCircle();
                    if (CelestialBody.CrossProductZ(ring[i].Velocity, ring[i].RadiusVector) < 0)
                    {
                        ring[i].Velocity = -ring[i].Velocity;
                    }
                }
            }
        }