private void UpdateSelect(Vector2 mousePosition) { Ray ray = camera.ScreenPointToRay(new Vector3(mousePosition.x, camera.pixelHeight - mousePosition.y, 0)); Vector3 startPos = ray.origin + halfSpaceSize; Vector3 dir = ray.direction; if (selectBlockStage == SelectBlockStage.SelectStart) { RayCastRestult rlt = rtm.rayCast(startPos, dir, 200, RayCastBlockType.All); bShowPreview = rlt.bHit; if (rlt.bHit) { normalIndex = (Face)rlt.hitFaceIndex; Vector3 hitPos = startPos + dir * (rlt.hitLength + 0.001f); float gx = (int)(hitPos.x / Const.BlockSize); float gy = (int)(hitPos.y / Const.BlockSize); float gz = (int)(hitPos.z / Const.BlockSize); if (curOperator == Operator.AddBlock) { selectedBlockPosStart = new Vector3(gx, gy, gz); selectedBlockPosEnd2D = selectedBlockPosStart; previewBlockPosStart = new Vector3(gx, gy, gz) + Const.getFaceNormal(rlt.hitFaceIndex) * Const.BlockSize; previewBlockPosEnd2D = previewBlockPosStart; previewBlockPosEnd3D = previewBlockPosEnd2D; } else if (curOperator == Operator.DeleteBlock) { selectedBlockPosStart = new Vector3(gx, gy, gz); selectedBlockPosEnd2D = selectedBlockPosStart; selectedBlockPosEnd3D = selectedBlockPosEnd2D; } } else { normalIndex = Face.FNI_y1; Vector3 faceNormal = Vector3.up; //表面法线 float camToFace = startPos.y - halfSpaceSize.y; //摄像机到表面的垂直线 float factor = Vector3.Dot(-faceNormal, dir); if (factor > 0.0001) { Vector3 hitPos = startPos + dir * (camToFace / factor + 0.001f); float gx = (int)(hitPos.x / Const.BlockSize); float gy = (int)(hitPos.y / Const.BlockSize); float gz = (int)(hitPos.z / Const.BlockSize); if (curOperator == Operator.AddBlock) { previewBlockPosStart = new Vector3(gx, gy, gz) + Vector3.up * Const.BlockSize; previewBlockPosEnd2D = previewBlockPosStart; previewBlockPosEnd3D = previewBlockPosEnd2D; } else if (curOperator == Operator.DeleteBlock) { selectedBlockPosStart = new Vector3(gx, gy, gz); selectedBlockPosEnd2D = selectedBlockPosStart; selectedBlockPosEnd3D = selectedBlockPosEnd2D; } bShowPreview = true; } else { bShowPreview = false; } } } else if (selectBlockStage == SelectBlockStage.SelectEnd2D) { if (curOperator == Operator.AddBlock) { //计算摄像机在操作平面上的投影点 Vector3 camToStart = previewBlockPosStart - startPos; //摄像机到开始点 Vector3 faceNormal = Const.getFaceNormal((int)normalIndex); //表面法线 float camToFace = Vector3.Dot(camToStart, -faceNormal) + 0.49999f; //摄像机到表面的垂直线 float factor = Vector3.Dot(-faceNormal, dir); if (factor > 0.0001) { previewBlockPosEnd2D = startPos + dir * (camToFace / factor); previewBlockPosEnd3D = previewBlockPosEnd2D; //Debug.Log(previewBlockPosEnd.ToString()); bShowPreview = true; } else { bShowPreview = false; } } else if (curOperator == Operator.DeleteBlock) { //计算摄像机在操作平面上的投影点 Vector3 camToStart = selectedBlockPosStart - startPos; //摄像机到开始点 Vector3 faceNormal = Const.getFaceNormal((int)normalIndex); //表面法线 float camToFace = Vector3.Dot(camToStart, -faceNormal) + 0.49999f; float factor = Vector3.Dot(-faceNormal, dir); if (factor > 0.0001) { selectedBlockPosEnd2D = startPos + dir * (camToFace / factor); selectedBlockPosEnd3D = selectedBlockPosEnd2D; bShowPreview = true; } else { bShowPreview = false; } } } else if (selectBlockStage == SelectBlockStage.SelectEnd3D) { if (curOperator == Operator.AddBlock) { //计算摄像机在操作平面上的投影点 Vector3 camToStart = previewBlockPosEnd2D - startPos; //摄像机到开始点 Vector3 faceNormal = Const.getFaceNormal((int)normalIndex); //击中法线 Vector3 right = Vector3.Cross(faceNormal, dir).normalized; Vector3 forward = Vector3.Cross(right, faceNormal); //操作平面的法线 float factor = Vector3.Dot(dir, forward); if (factor > 0.0001) { bShowPreview = true; Vector3 hitPos = startPos + dir * Vector3.Dot(camToStart, forward) / factor; Vector3 offset = faceNormal * Vector3.Dot((hitPos - previewBlockPosEnd2D), faceNormal); previewBlockPosEnd3D = previewBlockPosEnd2D + offset; } else { bShowPreview = false; } } else if (curOperator == Operator.DeleteBlock) { //计算摄像机在操作平面上的投影点 Vector3 camToStart = selectedBlockPosEnd2D - startPos; //摄像机到开始点 Vector3 faceNormal = Const.getFaceNormal((int)normalIndex); //击中法线 Vector3 right = Vector3.Cross(faceNormal, dir).normalized; Vector3 forward = Vector3.Cross(right, faceNormal); //操作平面的法线 float factor = Vector3.Dot(dir, forward); if (factor > 0.0001) { bShowPreview = true; Vector3 hitPos = startPos + dir * Vector3.Dot(camToStart, forward) / factor; Vector3 offset = faceNormal * Vector3.Dot((hitPos - selectedBlockPosEnd2D), faceNormal); selectedBlockPosEnd3D = selectedBlockPosEnd2D + offset; } else { bShowPreview = false; } } } }