123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- using UnityEngine;
- using System;
- using System.Linq;
- using System.Collections;
- using System.Collections.Generic;
- using System.Text;
- public class UnitSelectionComponent : MonoBehaviour
- {
- bool isSelecting = false;
- Vector3 mousePosition1;
- public GameObject selectionCirclePrefab;
- void Update()
- {
- // If we press the left mouse button, begin selection and remember the location of the mouse
- if( Input.GetMouseButtonDown( 0 ) )
- {
- isSelecting = true;
- mousePosition1 = Input.mousePosition;
- foreach( var selectableObject in FindObjectsOfType<SelectableUnitComponent>() )
- {
- if( selectableObject.selectionCircle != null )
- {
- Destroy( selectableObject.selectionCircle.gameObject );
- selectableObject.selectionCircle = null;
- }
- }
- }
- // If we let go of the left mouse button, end selection
- if( Input.GetMouseButtonUp( 0 ) )
- {
- var selectedObjects = new List<SelectableUnitComponent>();
- foreach( var selectableObject in FindObjectsOfType<SelectableUnitComponent>() )
- {
- if( IsWithinSelectionBounds( selectableObject.gameObject ) )
- {
- selectedObjects.Add( selectableObject );
- }
- }
- var sb = new StringBuilder();
- sb.AppendLine( string.Format( "Selecting [{0}] Units", selectedObjects.Count ) );
- foreach( var selectedObject in selectedObjects )
- sb.AppendLine( "-> " + selectedObject.gameObject.name );
- Debug.Log( sb.ToString() );
- isSelecting = false;
- }
- // Highlight all objects within the selection box
- if( isSelecting )
- {
- var shader1 = Shader.Find("Outlined/Silhouetted Bumped Diffuse");
- var shader2 = Shader.Find("Standard");
- foreach ( var selectableObject in FindObjectsOfType<SelectableUnitComponent>() )
- {
- if( IsWithinSelectionBounds( selectableObject.gameObject ) )
- {
- if( selectableObject.selectionCircle == null )
- {
- selectableObject.selectionCircle = Instantiate( selectionCirclePrefab );
- selectableObject.selectionCircle.transform.SetParent( selectableObject.transform, false );
- selectableObject.selectionCircle.transform.eulerAngles = new Vector3( 90, 0, 0 );
- selectableObject.GetComponent<Renderer>().material.shader = shader1;
- }
- }
- else
- {
- if( selectableObject.selectionCircle != null )
- {
- Destroy( selectableObject.selectionCircle.gameObject );
- selectableObject.selectionCircle = null;
- selectableObject.GetComponent<Renderer>().material.shader = shader2;
- }
- }
- }
- }
- }
- public bool IsWithinSelectionBounds( GameObject gameObject )
- {
- if( !isSelecting )
- return false;
- var camera = Camera.main;
- var viewportBounds = Utils.GetViewportBounds( camera, mousePosition1, Input.mousePosition );
- return viewportBounds.Contains( camera.WorldToViewportPoint( gameObject.transform.position ) );
- }
- void OnGUI()
- {
- if( isSelecting )
- {
- // Create a rect from both mouse positions
- var rect = Utils.GetScreenRect( mousePosition1, Input.mousePosition );
- Utils.DrawScreenRect( rect, new Color( 0.8f, 0.8f, 0.95f, 0.25f ) );
- Utils.DrawScreenRectBorder( rect, 2, new Color( 0.8f, 0.8f, 0.95f ) );
- }
- }
- }
|