标签:unity unity3d camera unity5.1 ui
孙广东 2015.8.16
其实和 小地图都差不多了。 还是要借助 另一个相机
目的: 这篇文章的主要目的是 要给你一个想法 如何做放大境效果 。
在unity中可以简单的实现放大镜效果啊 . 那么现在就来一步一步实现这个:
创建一个摄像机对象,设置 projection 类型为 perspective 或者 orthographic.
设置相机的 orthographicSize 或者 fieldOfView (依赖于相机的 projection 类型 ).
设置其 pixelrect . 例如如果您想要在你鼠标位置显示放大境 和其大小是 100 x 100 , 然后设置pixelrect 为 :
magnifyCamera.pixelRect = new Rect (Input.mousePosition.x – 100f / 2.0f, Input.mousePosition.y – 100f / 2.0f, 100f, 100f);
设置相机的位置。 例如 如果你想在 你的鼠标位置显示放大镜效果 ,那么设置相机的位置为 mousePosition世界点。
你能看到最终的效果图:
下面的 C# 脚本将创建一个 MagnifyGlass,并将它移动到 mousePosition位置 。
MagnifyGlass 脚本: 添加到一个空的游戏对象。
using UnityEngine; using System.Collections; public class MagnifyGlass : MonoBehaviour { private Camera magnifyCamera; private GameObject magnifyBorders; private LineRenderer LeftBorder, RightBorder, TopBorder, BottomBorder; // Reference for lines of magnify glass borders private float MGOX,MG0Y; // Magnify Glass Origin X and Y position private float MGWidth = Screen.width/5f,MGHeight = Screen.width/5f; // Magnify glass width and height private Vector3 mousePos; void Start () { createMagnifyGlass (); } void Update () { // Following lines set the camera‘s pixelRect and camera position at mouse position magnifyCamera.pixelRect = new Rect (Input.mousePosition.x - MGWidth / 2.0f, Input.mousePosition.y - MGHeight / 2.0f, MGWidth, MGHeight); mousePos = getWorldPosition (Input.mousePosition); magnifyCamera.transform.position = mousePos; mousePos.z = 0; magnifyBorders.transform.position = mousePos; } // Following method creates MagnifyGlass private void createMagnifyGlass() { GameObject camera = new GameObject("MagnifyCamera"); MGOX = Screen.width / 2f - MGWidth/2f; MG0Y = Screen.height / 2f - MGHeight/2f; magnifyCamera = camera.AddComponent<Camera>(); magnifyCamera.pixelRect = new Rect(MGOX, MG0Y, MGWidth, MGHeight); magnifyCamera.transform.position = new Vector3(0,0,0); if(Camera.main.isOrthoGraphic) { magnifyCamera.orthographic = true; magnifyCamera.orthographicSize = Camera.main.orthographicSize / 5.0f;//+ 1.0f; createBordersForMagniyGlass (); } else { magnifyCamera.orthographic = false; magnifyCamera.fieldOfView = Camera.main.fieldOfView / 10.0f;//3.0f; } } // Following method sets border of MagnifyGlass private void createBordersForMagniyGlass() { magnifyBorders = new GameObject (); LeftBorder = getLine (); LeftBorder.SetVertexCount(2); LeftBorder.SetPosition(0,new Vector3(getWorldPosition(new Vector3(MGOX,MG0Y,0)).x,getWorldPosition(new Vector3(MGOX,MG0Y,0)).y-0.1f,-1)); LeftBorder.SetPosition(1,new Vector3(getWorldPosition(new Vector3(MGOX,MG0Y+MGHeight,0)).x,getWorldPosition(new Vector3(MGOX,MG0Y+MGHeight,0)).y+0.1f,-1)); LeftBorder.transform.parent = magnifyBorders.transform; TopBorder = getLine (); TopBorder.SetVertexCount(2); TopBorder.SetPosition(0,new Vector3(getWorldPosition(new Vector3(MGOX,MG0Y+MGHeight,0)).x,getWorldPosition(new Vector3(MGOX,MG0Y+MGHeight,0)).y,-1)); TopBorder.SetPosition(1,new Vector3(getWorldPosition(new Vector3(MGOX+MGWidth,MG0Y+MGHeight,0)).x,getWorldPosition(new Vector3(MGOX+MGWidth,MG0Y+MGHeight,0)).y,-1)); TopBorder.transform.parent = magnifyBorders.transform; RightBorder = getLine (); RightBorder.SetVertexCount(2); RightBorder.SetPosition(0,new Vector3(getWorldPosition(new Vector3(MGOX+MGWidth,MG0Y+MGWidth,0)).x,getWorldPosition(new Vector3(MGOX+MGWidth,MG0Y+MGWidth,0)).y+0.1f,-1)); RightBorder.SetPosition(1,new Vector3(getWorldPosition(new Vector3(MGOX+MGWidth,MG0Y,0)).x,getWorldPosition(new Vector3(MGOX+MGWidth,MG0Y,0)).y-0.1f,-1)); RightBorder.transform.parent = magnifyBorders.transform; BottomBorder = getLine (); BottomBorder.SetVertexCount(2); BottomBorder.SetPosition(0,new Vector3(getWorldPosition(new Vector3(MGOX+MGWidth,MG0Y,0)).x,getWorldPosition(new Vector3(MGOX+MGWidth,MG0Y,0)).y,-1)); BottomBorder.SetPosition(1,new Vector3(getWorldPosition(new Vector3(MGOX,MG0Y,0)).x,getWorldPosition(new Vector3(MGOX,MG0Y,0)).y,-1)); BottomBorder.transform.parent = magnifyBorders.transform; } // Following method creates new line for MagnifyGlass‘s border private LineRenderer getLine() { LineRenderer line = new GameObject("Line").AddComponent<LineRenderer>(); line.material = new Material(Shader.Find("Diffuse")); line.SetVertexCount(2); line.SetWidth(0.2f,0.2f); line.SetColors(Color.black, Color.black); line.useWorldSpace = false; return line; } private void setLine(LineRenderer line) { line.material = new Material(Shader.Find("Diffuse")); line.SetVertexCount(2); line.SetWidth(0.2f,0.2f); line.SetColors(Color.black, Color.black); line.useWorldSpace = false; } // Following method calculates world‘s point from screen point as per camera‘s projection type public Vector3 getWorldPosition(Vector3 screenPos) { Vector3 worldPos; if(Camera.main.isOrthoGraphic) { worldPos = Camera.main.ScreenToWorldPoint (screenPos); worldPos.z = Camera.main.transform.position.z; } else { worldPos = Camera.main.ScreenToWorldPoint (new Vector3 (screenPos.x, screenPos.y, Camera.main.transform.position.z)); worldPos.x *= -1; worldPos.y *= -1; } return worldPos; } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:unity unity3d camera unity5.1 ui
原文地址:http://blog.csdn.net/u010019717/article/details/47702623