首页 > 代码库 > Unity中做放大镜 效果
Unity中做放大镜 效果
孙广东 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中做放大镜 效果
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。