private void DrawAsteroids(Vector2Int chunkCoord, InfiniteChunks.Chunk chunk) { List <Vector3> points = chunk.GetPoints(); System.Random prng = new System.Random(seed + chunk.GetCoordPairingNumber()); int carrotIndex = prng.Next(0, points.Count); for (int i = 0; i < points.Count; i++) { Vector3 point = points[i]; int size = (int)point.z; int variant = prng.Next(0, asteroidPool.GetVariantCountFor(size)); GameObject asteroid = asteroidPool.GetFromPool(size, variant); if (asteroid != null) { asteroid.transform.position = (new Vector2(point.x, point.y) - regionSize / 2) + chunk.GetChunkOffset(); asteroid.SetActive(true); if (carrotIndex == i && !carrotsPicked.ContainsKey(chunkCoord)) { DrawCarrot(chunkCoord, chunk, asteroid, size); } if (simulateAsteroids) { var body = asteroid.GetComponent <Rigidbody2D>(); body.bodyType = RigidbodyType2D.Dynamic; body.drag = 0f; body.mass = 40f * size; body.AddForce(new Vector2(Random.value * body.mass / 3, Random.value * body.mass / 3), ForceMode2D.Impulse); } chunk.AddObject(asteroid); } } chunk.SetVisible(true); }
private void DrawCarrot(Vector2Int chunkCoord, InfiniteChunks.Chunk chunk, GameObject asteroid, int asteroidSize) { GameObject carrot = carrotPool.GetFromPool(0); if (carrot == null) { return; } Vector2 dir = Random.insideUnitCircle.normalized * (asteroidSize + 1); carrot.transform.position = asteroid.transform.position + asteroid.transform.TransformDirection(dir); Vector3 targetRotateDir = asteroid.transform.position - carrot.transform.position; float angle = (Mathf.Atan2(targetRotateDir.y, targetRotateDir.x) * Mathf.Rad2Deg) - 90f; carrot.transform.rotation = Quaternion.AngleAxis(angle, Vector3.forward); FixedJoint2D joint = carrot.GetComponent <FixedJoint2D>(); joint.connectedBody = asteroid.GetComponent <Rigidbody2D>(); Carrot script = carrot.GetComponent <Carrot>(); script.SetPickupCallback(CarrotPickup, chunkCoord); carrot.SetActive(true); chunk.AddCarrot(carrot); }
void OnChunksReceived(Dictionary <Vector2Int, InfiniteChunks.Chunk> chunks) { foreach (Vector2Int chunkCoord in chunks.Keys) { InfiniteChunks.Chunk chunk = chunks[chunkCoord]; if (!chunk.IsVisible()) { DrawAsteroids(chunkCoord, chunk); } } }
public void CarrotPickup(Vector2Int chunkCoord) { if (!carrotsPicked.ContainsKey(chunkCoord)) { carrotsPicked.Add(chunkCoord, true); InfiniteChunks.Chunk chunk = infiniteChunks.GetChunkAt(chunkCoord); if (chunk != null) { chunk.PickUpCarrot(); } } }