diff --git a/Assets/Boid.cs b/Assets/Boid.cs index 78f4ae3..54366e0 100644 --- a/Assets/Boid.cs +++ b/Assets/Boid.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using UnityEditor; using UnityEngine; using Random = UnityEngine.Random; @@ -49,9 +50,15 @@ public class Boid : MonoBehaviour { ScreenWrap(); } + void OnDrawGizmos() { + Handles.color = _isWrappingX || _isWrappingY ? Color.red : Color.white; + Vector3 viewportPosition = _parent.cam.WorldToViewportPoint(transform.position); + Handles.Label(transform.position, $"{(Vector2) viewportPosition} {(_isWrappingX ? "Y" : "N")} {(_isWrappingY ? "Y" : "N")}"); + } + void ScreenWrap() { - foreach (var _renderer in _renderers) - if (_renderer.isVisible) { + foreach (var trenderer in _renderers) + if (trenderer.isVisible) { _isWrappingX = false; _isWrappingY = false; return; @@ -62,14 +69,16 @@ public class Boid : MonoBehaviour { // Activate Wrap, Move Vector2 newPosition = transform.position; - Vector3 viewportPosition = _parent._cam.WorldToViewportPoint(newPosition); + Vector3 viewportPosition = _parent.cam.WorldToViewportPoint(newPosition); if (!_isWrappingX && (viewportPosition.x > 1 || viewportPosition.x < 0)) { + print($"{transform.name} - Boid Wrapped on X Axis ({viewportPosition.x})"); newPosition.x = -newPosition.x; _isWrappingX = true; } if (!_isWrappingY && (viewportPosition.y > 1 || viewportPosition.y < 0)) { + print($"{transform.name} - Boid Wrapped on Y Axis ({viewportPosition.y})"); newPosition.y = -newPosition.y; _isWrappingY = true; } diff --git a/Assets/BoidController.cs b/Assets/BoidController.cs index edcba9b..18b2ab0 100644 --- a/Assets/BoidController.cs +++ b/Assets/BoidController.cs @@ -5,7 +5,7 @@ using Random = UnityEngine.Random; public class BoidController : MonoBehaviour { // Controller Attributes - [NonSerialized] public Rect space; + [NonSerialized] public Rect Space; // Swarm Attributes public int boidCount = 50; @@ -26,27 +26,35 @@ public class BoidController : MonoBehaviour { [HideInInspector] public List boids = new List(); // Used for wrapping - internal Camera _cam; + public Camera cam; private void OnDrawGizmos() { - Gizmos.DrawWireCube(space.center, space.size); + // Draw a Wire Cube for the Rectangle Area + Gizmos.DrawWireCube(Space.center, Space.size); + + // Draw a Wire Cube for the Cam's Viewport Area + Vector3 screenBottomLeft = cam.ViewportToWorldPoint(new Vector3(0, 0, transform.position.z)); + Vector3 screenTopRight = cam.ViewportToWorldPoint(new Vector3(1, 1, transform.position.z)); + var screenWidth = screenTopRight.x - screenBottomLeft.x; + var screenHeight = screenTopRight.y - screenBottomLeft.y; + Gizmos.DrawWireCube(cam.transform.position, new Vector3(screenWidth, screenHeight, 1)); } private void Start() { // Setup Camera - _cam = Camera.main; + cam = Camera.main; // Size the Rectangle based on the Camera's Orthographic View - float height = 2f * _cam.orthographicSize; - Vector2 size = new Vector2(height * _cam.aspect, height); - space = new Rect((Vector2) transform.position - size / 2, size); + float height = 2f * cam.orthographicSize; + Vector2 size = new Vector2(height * cam.aspect, height); + Space = new Rect((Vector2) transform.position - size / 2, size); // Add in Boid Objects / Spawn Boid Prefabs for (int i = 0; i < boidCount; i++) { // Generate a new position within the Rect boundaries (minus a little) var position = new Vector2( - Random.Range(-space.size.x, space.size.x) / 2 * 0.95f, - Random.Range(-space.size.y, space.size.y) / 2 * 0.95f); + Random.Range(-Space.size.x, Space.size.x) / 2 * 0.95f, + Random.Range(-Space.size.y, Space.size.y) / 2 * 0.95f); // Spawn a new Boid prefab GameObject boid = Instantiate(boidObject, position, Quaternion.identity);