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中做放大镜 效果的更多相关文章
- 关于jQuery中实现放大镜效果
1.1.1 摘要 相信大家都见过或使用过放大镜效果,甚至实现过该效果,它一般应用于放大查看商品图片,一些电商网站(例如:凡客,京东商城,阿里巴巴等)都有类似的图片查看效果. 在接下来的博文中,我们将向 ...
- 关于Unity中红外线瞄准的效果实现
今天做一个FPS游戏的时候,由于我做的是第三人称的射击,所以需要一个枪的红外线瞄准的效果. 一开始我在枪上挂一个很细很长的聚光灯,瞄准远处物体的时候,看起来有点红外线的样子,但是靠近之后光线就变成一个 ...
- ShapeDrawable做放大镜效果
引用一下ShapeDrawable的类的说明: java.lang.Object ? android.graphics.drawable.Drawable ? android.grap ...
- js---电商中常见的放大镜效果
js中的放大镜效果 在电商中,放大镜效果是很常见的,如下图所示: 当鼠标悬浮时,遮罩所在区域在右侧进行放大. 在动手写之前,我们要先理清思路,分析需求,所需知识点,再将每一块进行组装,最后进行功能的完 ...
- Unity中实现网格轮廓效果,选中边框效果
问题背景: 最近要实现选中实体的高亮效果,要那种类似于unity中Outline的效果,网格轮廓高亮效果. 效果图: 具体代码: OutlineEffect.cs 实体高亮效果类: 轮廓边总控制类,该 ...
- 基于Jquery的商城商品图片的放大镜效果(非组件)
在开发商城的时候,往往会用到图片的放大功能,这里把自己在近期项目中使用的放大镜特效做一下总结(非插件). 放大镜效果 常用的js组件jquery.imagezoom,jquery.jqzoom,jqu ...
- 照着别人的demo自己试着做了个放大镜效果
原理: A:放大镜 B:小图片 C:大图片可视区域 D:大图片 鼠标的位置应该在放大镜的中央,所以鼠标位置为:clientX=A.offsetLeft()+B.offsetLeft+1/2*A.o ...
- WPF中利用RadialGradient模拟放大镜效果
原文:WPF中利用RadialGradient模拟放大镜效果 --------------------------------------------------------------------- ...
- Unity中利用柏林噪声(perlinnoise)制作摇摆效果
perlinnoise是unity中Mathf下的一个函数,需要两个float参数x和y进行采样,返回一个0-1的float型. 项目里经常要随机摇摆某些东西,比如摄像机,某个随机运动的目标等等,都可 ...
随机推荐
- rpm---rpm包管理
rpm命令是RPM软件包的管理工具.rpm原本是Red Hat Linux发行版专门用来管理Linux各项套件的程序,由于它遵循GPL规则且功能强大方便,因而广受欢迎.逐渐受到其他发行版的采用.RPM ...
- mysql允许外部连接设置
错误信息: SQL Error (1130): Host ‘192.168.1.88’ is not allowed to connect to this MySQL server 说明所连接的用户帐 ...
- linux新安装后root密码设置
linux在安装过程中未设置root密码 导致在使用中无法su 解决方法是设置root密码: 输入: sudo passwd root [sudo] password for you: ---> ...
- 每位iOS开发者不容错过的10大有用工具
内容简单介绍 1.iOS简单介绍 2.iOS开发十大有用工具之开发环境 3.iOS开发十大有用工具之图标设计 4.iOS开发十大有用工具之原型设计 5.iOS开发十大有用工具之演示工具 6.iOS开发 ...
- 【剑指Offer面试题】九度OJ1384:二维数组中的查找
下决心AC全部剑指offer面试题. 九度OJ面试题地址:http://ac.jobdu.com/hhtproblems.php 书籍:何海涛--<剑指Offer:名企面试官精讲典型编程题> ...
- 安装 VNC 和 XRDP
安装 VNC 和 XRDPapt-get install vnc4server tightvncserver xrdp fluxbox xtermcat >vncstop.sh << ...
- RFID的工作流程
工作流程 1.阅读器通过发射天线发送一定频率的射频信号, 2.当射频卡进入发射天线工作区域时产生感应电流,射频卡获得能量被激活: 3.射频卡将自身编码等信息通过卡内置发送天线发送出去 4.系统接收天线 ...
- Activity启动过程源代码分析
事实上写分析源代码文章总会显得非常复杂非常乏味,可是梳理自己看源代码时的一些总结也是一种提高. 这篇博客分析下Activity启动过程源代码,我会尽量说得简单点. 个人的观点是看源代码不能看得太细,否 ...
- teamviewer连接不上的原因及解决方法有哪些
teamviewer连接不上的原因及解决方法有哪些 一.总结 一句话总结:这里说的就是版本问题,高版本可以连接低版本,低版本无法连接高版本. 1.TeamViewer官方检测使用环境是否为商用的标准是 ...
- 14.inline与namespace使用
#include <iostream> using namespace std; namespace all { //inline作用为默认调用 inline namespace V201 ...