// --------------------------------------------------------------------------- #region Get Mouse Position on Grid (with or without snap) // --------------------------------------------------------------------------- // Converts a position on the grid object into a position snapped to the grid public static Vector3 GetPositionOnGridClosestToMousePointer() { Physics.queriesHitBackfaces = true; // Create a ray starting from the current point the mouse is Ray ray = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition); // Raycast to grid layer Visualizer.visualizerOnGrid = Physics.Raycast(ray.origin, ray.direction, out RaycastHit hit, Mathf.Infinity, theLayerTheGridIsOn); // Calculate closest grid position to hit float xPos, zPos; if (Settings.Data.placement.snapToGrid) { xPos = RoundToNearestGridCenter(hit.point.x); zPos = RoundToNearestGridCenter(hit.point.z); } // Return true position hit else { xPos = hit.point.x; zPos = hit.point.z; } // If raycast reached infinity *** Not sure if this will ever happen *** if (xPos == Mathf.Infinity || zPos == Mathf.Infinity) { // Set position to x=0 z=0 xPos = 0; zPos = 0; } // Calculate current placement position on the grid Vector3 placementPosition = new Vector3(xPos, Settings.Data.gui.grid.gridHeight * Settings.Data.gui.grid.yUnitSize, zPos); // Calculate placement position by raycast from current placement position if (PlacementRaycast.GetUseRaycast()) { placementPosition = GetRaycastPosition(placementPosition); } // Return the closest grid position return(placementPosition); }
// Get placement position based on raycast operation private static Vector3 GetRaycastPosition(Vector3 placementPosition) { // Get Raycast Direction Vector3 raycastDirection = new Vector3(); switch (PlacementRaycast.GetDirection()) { case DirectionVector.Down: raycastDirection = Vector3.down; break; case DirectionVector.Up: raycastDirection = Vector3.up; break; case DirectionVector.Left: raycastDirection = Vector3.left; break; case DirectionVector.Right: raycastDirection = Vector3.right; break; case DirectionVector.Forward: raycastDirection = Vector3.forward; break; case DirectionVector.Back: raycastDirection = Vector3.back; break; } // Create a layer mask that excludes the grid int rayCastLayers = ~(1 << Const.Grid.gridLayer | 1 << Const.Placement.visualizerLayer); // If Raycast from current placement position is successful if (Physics.Raycast(placementPosition + PlacementRaycast.GetStartOffset(), raycastDirection, out RaycastHit hit, Mathf.Infinity, rayCastLayers)) { // If the raycast distance did not reach infinity *** Not sure if this will ever happen *** if (hit.point.x != Mathf.Infinity && hit.point.y != Mathf.Infinity && hit.point.z != Mathf.Infinity) { // Get Placement Position from the raycast hit point placementPosition = hit.point; } } // Return with the Placement Position return(placementPosition); }