/// <summary> /// Determine any targets that are within the crosshairs raycast. /// </summary> private void Update() { var crosshairsColor = m_DefaultColor; var crosshairsRay = m_Camera.ScreenPointToRay(m_CenterRectTransform.position); Transform target = null; // Prevent the ray between the character and the camera from causing a false collision. if (!m_CharacterLocomotion.FirstPersonPerspective) { var direction = m_CharacterTransform.InverseTransformPoint(crosshairsRay.origin); direction.y = 0; crosshairsRay.origin = crosshairsRay.GetPoint(direction.magnitude); } var hitCount = Physics.SphereCastNonAlloc(crosshairsRay, m_CollisionRadius, m_RaycastHits, m_CameraController.LookDirectionDistance, m_CharacterLayerManager.IgnoreInvisibleLayers, QueryTriggerInteraction.Ignore); #if UNITY_EDITOR if (hitCount == m_MaxCollisionCount) { Debug.LogWarning("Warning: The crosshairs detected the maximum number of objects. Consider increasing the Max Collision Count on the Crosshairs Monitor."); } #endif if (hitCount > 0) { for (int i = 0; i < hitCount; ++i) { var closestRaycastHit = QuickSelect.SmallestK(m_RaycastHits, hitCount, i, m_RaycastHitComparer); var closestRaycastHitTransform = closestRaycastHit.transform; // The crosshairs cannot hit the character that is attached to the camera. if (closestRaycastHitTransform.IsChildOf(m_CharacterTransform)) { continue; } if (MathUtility.InLayerMask(closestRaycastHitTransform.gameObject.layer, m_CharacterLayerManager.EnemyLayers)) { target = closestRaycastHitTransform; crosshairsColor = m_TargetColor; } break; } } if (m_AimAssist != null) { m_AimAssist.SetTarget(target); } if (m_EquippedItem != null) { m_CurrentCrosshairsSpread = Mathf.SmoothDamp(m_CurrentCrosshairsSpread, m_TargetCrosshairsSpread, ref m_CrosshairsSpreadVelocity, m_EquippedItem.QuadrantSpreadDamping); } m_CenterCrosshairsImage.color = crosshairsColor; if (m_LeftCrosshairsImage != null && m_LeftCrosshairsImage.enabled) { m_LeftCrosshairsImage.color = crosshairsColor; PositionSprite(m_LeftRectTransform, -m_EquippedItem.QuadrantOffset - m_CurrentCrosshairsSpread, 0); } if (m_TopCrosshairsImage != null && m_TopCrosshairsImage.enabled) { m_TopCrosshairsImage.color = crosshairsColor; PositionSprite(m_TopRectTransform, 0, m_EquippedItem.QuadrantOffset + m_CurrentCrosshairsSpread); } if (m_RightCrosshairsImage != null && m_RightCrosshairsImage.enabled) { m_RightCrosshairsImage.color = crosshairsColor; PositionSprite(m_RightRectTransform, m_EquippedItem.QuadrantOffset + m_CurrentCrosshairsSpread, 0); } if (m_BottomCrosshairsImage != null && m_BottomCrosshairsImage.enabled) { m_BottomCrosshairsImage.color = crosshairsColor; PositionSprite(m_BottomRectTransform, 0, -m_EquippedItem.QuadrantOffset - m_CurrentCrosshairsSpread); } var enableImage = !m_Aiming || (m_EquippedItem != null && m_EquippedItem.ShowCrosshairsOnAim); if (enableImage != m_EnableImage) { m_EnableImage = enableImage; EnableCrosshairsImage(enableImage); } }
/// <summary> /// Determine any targets that are within the crosshairs raycast. /// </summary> private void Update() { var crosshairsColor = m_DefaultColor; var crosshairsRay = m_Camera.ScreenPointToRay(m_CenterRectTransform.position); Transform target = null; // Prevent the ray between the character and the camera from causing a false collision. if (!m_CharacterLocomotion.FirstPersonPerspective) { var direction = m_CharacterTransform.InverseTransformPoint(crosshairsRay.origin); direction.y = 0; crosshairsRay.origin = crosshairsRay.GetPoint(direction.magnitude); } #if UNITY_EDITOR // Visualize the direction of the look direction. if (m_DebugDrawLookRay) { Debug.DrawRay(crosshairsRay.origin, crosshairsRay.direction * m_CameraController.LookDirectionDistance, Color.white); } #endif var hitCount = Physics.SphereCastNonAlloc(crosshairsRay, m_CollisionRadius, m_RaycastHits, m_CameraController.LookDirectionDistance, m_CharacterLayerManager.IgnoreInvisibleLayers, m_TriggerInteraction); #if UNITY_EDITOR if (hitCount == m_MaxCollisionCount) { Debug.LogWarning("Warning: The crosshairs detected the maximum number of objects. Consider increasing the Max Collision Count on the Crosshairs Monitor."); } #endif if (hitCount > 0) { for (int i = 0; i < hitCount; ++i) { var closestRaycastHit = QuickSelect.SmallestK(m_RaycastHits, hitCount, i, m_RaycastHitComparer); var closestRaycastHitTransform = closestRaycastHit.transform; // The crosshairs cannot hit the character that is attached to the camera. if (closestRaycastHitTransform.IsChildOf(m_CharacterTransform)) { continue; } if (MathUtility.InLayerMask(closestRaycastHitTransform.gameObject.layer, m_CharacterLayerManager.EnemyLayers)) { target = closestRaycastHitTransform; crosshairsColor = m_TargetColor; } break; } } if (m_AutoAssignAimAssistTarget && m_AimAssist != null) { m_AimAssist.SetTarget(target); } // The crosshairs can move with the cursor position. if (m_MoveWithCursor && Cursor.visible) { m_RectTransform.position = new Vector3(m_PlayerInput.GetMousePosition().x, m_PlayerInput.GetMousePosition().y, 0); } // The spread of the crosshairs can change based on how quickly the character is moving. if (m_MovementSpread > 0) { var velocity = Mathf.Clamp01(m_CharacterLocomotion.LocalLocomotionVelocity.sqrMagnitude / m_MaxSpreadVelocitySqrMagnitude); m_SmoothedMovementVelocity = Mathf.SmoothStep(m_SmoothedMovementVelocity, velocity, m_MovementSpreadSpeed * Time.deltaTime); } if (m_EquippedItem != null) { var movementSpread = (((m_MovementSpread / 360) + m_SmoothedMovementVelocity) / 2) * m_EquippedItem.MaxQuadrantSpread; m_CurrentCrosshairsSpread = Mathf.SmoothDamp(m_CurrentCrosshairsSpread, Mathf.Clamp(m_TargetCrosshairsSpread + movementSpread, 0, m_EquippedItem.MaxQuadrantSpread), ref m_CrosshairsSpreadVelocity, m_EquippedItem.QuadrantSpreadDamping); } m_CenterCrosshairsImage.color = crosshairsColor; if (m_LeftCrosshairsImage != null && m_LeftCrosshairsImage.enabled) { m_LeftCrosshairsImage.color = crosshairsColor; PositionSprite(m_LeftRectTransform, -m_EquippedItem.QuadrantOffset - m_CurrentCrosshairsSpread, 0); } if (m_TopCrosshairsImage != null && m_TopCrosshairsImage.enabled) { m_TopCrosshairsImage.color = crosshairsColor; PositionSprite(m_TopRectTransform, 0, m_EquippedItem.QuadrantOffset + m_CurrentCrosshairsSpread); } if (m_RightCrosshairsImage != null && m_RightCrosshairsImage.enabled) { m_RightCrosshairsImage.color = crosshairsColor; PositionSprite(m_RightRectTransform, m_EquippedItem.QuadrantOffset + m_CurrentCrosshairsSpread, 0); } if (m_BottomCrosshairsImage != null && m_BottomCrosshairsImage.enabled) { m_BottomCrosshairsImage.color = crosshairsColor; PositionSprite(m_BottomRectTransform, 0, -m_EquippedItem.QuadrantOffset - m_CurrentCrosshairsSpread); } var enableImage = !m_Aiming || (m_EquippedItem != null && m_EquippedItem.ShowCrosshairsOnAim); if (enableImage != m_EnableImage) { m_EnableImage = enableImage; EnableCrosshairsImage(enableImage); } }