IEnumerator CreateMouseOrder() { // Get order type RaycastHit2D hit = Physics2D.Raycast(new Vector2(_debug_mainCamera.ScreenToWorldPoint(Input.mousePosition).x, _debug_mainCamera.ScreenToWorldPoint(Input.mousePosition).y), Vector2.zero, 0f); if (hit.collider != null && hit.collider.tag == "unit") { // Impulse or link // Debug.Log("Impulse/Link order started"); UnitSystem startUnit = hit.collider.gameObject.GetComponent <UnitSystem>(); if (startUnit == null) { startUnit = hit.collider.transform.GetComponentInParent <UnitSystem>(); } _drag[0] = startUnit.transform.position; _drag[0].z = 1; Feedback_SetDragColor(startUnit); // Check if the start unit can execute an order if (!startUnit.IsReadyToExecuteOrder()) { // Otherwise, cancel order creation // Reset input feedback _drag = new Vector3[2] { Vector3.zero, Vector3.zero }; yield break; } for (;;) { // Check if start unit is still aviable if (startUnit == null) { // Otherwise, cancel order creation // Reset input feedback _drag = new Vector3[2] { Vector3.zero, Vector3.zero }; yield break; } // Feedback_UpdateDragColor(startUnit); // _drag[1] = _debug_mainCamera.ScreenToWorldPoint(Input.mousePosition); _drag[1].z = _drag[0].z; _drag[1] = _drag[0] + (_drag[1] - _drag[0]).normalized * Mathf.Clamp(Vector3.Distance(_drag[1], _drag[0]), 0, startUnit._currentMaxImpulse * 0.5f); if (Input.GetMouseButtonUp(0)) { hit = Physics2D.Raycast(new Vector2(_debug_mainCamera.ScreenToWorldPoint(Input.mousePosition).x, _debug_mainCamera.ScreenToWorldPoint(Input.mousePosition).y), Vector2.zero, 0f); if (/*debug*/ false /* hit.collider != null && hit.collider.tag == "unit" */) { // Link } else { // Impulse Vector3 dragEnd = _debug_mainCamera.ScreenToWorldPoint(Input.mousePosition); dragEnd = startUnit.transform.position + (startUnit.transform.position - dragEnd).normalized * Mathf.Clamp(Vector3.Distance(startUnit.transform.position, dragEnd), startUnit._minImpulse, startUnit._currentMaxImpulse); Vector3 dragDelta = Vector2.zero; Vector2 impulse = -new Vector2((startUnit.transform.position - dragEnd).x, (startUnit.transform.position - dragEnd).y); // Check if the start unit can execute an order if (!startUnit.IsReadyToExecuteOrder()) { // Otherwise, cancel order creation // Reset input feedback _drag = new Vector3[2] { Vector3.zero, Vector3.zero }; yield break; } startUnit.RecieveDirectOrder(new OrderImpulse(impulse * _debug_speed)); // Debug.Log("Impulse sent"+ impulse); } // Reset input feedback _drag = new Vector3[2] { Vector3.zero, Vector3.zero }; yield break; } yield return(null); } } else { // Camera drag Vector3 dragStart = _debug_mainCamera.ScreenToWorldPoint(Input.mousePosition); Vector3 cameraStart = _debug_mainCamera.transform.position; // Debug.Log("Camera drag order started"); for (;;) { Vector3 dragEnd = _debug_mainCamera.ScreenToWorldPoint(Input.mousePosition); Vector3 dragDelta = dragStart - dragEnd; dragDelta.z = 0; _debug_mainCamera.transform.position = cameraStart + dragDelta * _debug_cameraDragSpeed; if (Input.GetMouseButtonUp(0)) { yield break; } yield return(null); } yield return(null); } }