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;
}
}

相信你能够通过这个 做的更好。

时间: 2024-08-06 17:10:48

Unity中做放大镜 效果的相关文章

关于jQuery中实现放大镜效果

1.1.1 摘要 相信大家都见过或使用过放大镜效果,甚至实现过该效果,它一般应用于放大查看商品图片,一些电商网站(例如:凡客,京东商城,阿里巴巴等)都有类似的图片查看效果. 在接下来的博文中,我们将向大家介绍通过jQuery实现放大镜效果. 目录 实现原理 mousemove事件 相对坐标 background-position属性 mousewheel事件 1.1.2 正文 实现原理 首先,我们讲解一下放大镜效果的实现方式: 方法一:准备一张高像素的大图,当鼠标放到原图上,加载显示大图的对应位

Oculus Home安装的一些坑和如何使用Oculus Rict CV1在unity中做开发。

Oculus Home的安装和如何使用Oculus Rift CV1在unity中开发使用 By:zscjob 最近因工作需要适配了一下Oculus CV1,真是踩坑无数.了解一下步骤, 1. 到oculus官方网站下载Oculus Home的Setup文件,目前官方下载地址:https://www.oculus.com/en-us/setup/.安装oculus Home 必须卸载之前的Oculus RunTime;如果你之前有安装过就需要卸载掉它, 2. 如果你下载链接打不开的话,你需要一个

关于用暴风SDK在unity中加入VR效果和利用暴风手柄进行操作

首先在暴风魔镜开发平台下载SDK.地址:http://open.mojing.cn/sdk/download?pid=2  下载unity的工具 MojingSDK., 然后我用的是unity5.42的版本然后将SDK导入unity中.文件夹中包含 接口说明文档说的也比较清楚. 在unity中搭建一个简单的场景需要放入Prefab的MojingMain.并将场景摄像机放入其中并挂上MojingEye脚本 Eye枚举选项为Center 并且添加prefab Overlay. 如果要进行手柄UI交互

关于Unity中红外线瞄准的效果实现

今天做一个FPS游戏的时候,由于我做的是第三人称的射击,所以需要一个枪的红外线瞄准的效果. 一开始我在枪上挂一个很细很长的聚光灯,瞄准远处物体的时候,看起来有点红外线的样子,但是靠近之后光线就变成一个手电筒的那种光,不是我想要的效果. 后来我用粒子特效,虽然远处近处都是一条射线,但是效果很粗糙,不是那种细细的有穿透的感觉,而是像激光一样,而且感觉不断生成粒子,性能消耗会很大. 最后在网上看到有人用Unity3.5自带的例子AngryBots里面有红外瞄准效果,但是代码有点问题,就改了一下,感觉效

Unity中实现网格轮廓效果

问题背景: 最近要实现选中实体的高亮效果,要那种类似于unity中Outline的效果,网格轮廓高亮效果. 效果图: 具体代码: OutlineEffect.cs 实体高亮效果类: 轮廓边总控制类,该脚本需要挂载到场景相机上 1 using UnityEngine; 2 using System.Collections.Generic; 3 using UnityEngine.Rendering; 4 5 namespace Tx3d.Framework 6 { 7 [DisallowMulti

照着别人的demo自己试着做了个放大镜效果

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"> <head><meta http-equiv="Content-Ty

如何在unity中实现拖尾效果

在制作游戏过程中会出现鼠标滑动的实现,而为啦增强视觉效果,往往会添加拖尾或者鼠标点击的特效,接下来就说说在unity中如何实现拖尾效果,首先unity中有个组件,叫TrailRenderer,在Component ——> Effect——>TrailRenderer中添加,根据自己需要的效果设置自己需要的颜色,然后还有相应的曲线和拖尾长度,来实现自己需要的效果,接下来上代码 public TrailRenderer m_CollectTrail = null; #if UNITY_EDITOR

【Unity技巧】Unity中的优化技术

写在前面 这一篇是在Digital Tutors的一个系列教程的基础上总结扩展而得的~Digital Tutors是一个非常棒的教程网站,包含了多媒体领域很多方面的资料,非常酷!除此之外,还参考了Unity Cookie中的一个教程.还有很多其他参考在下面的链接中. 这篇文章旨在简要地说明一下常见的各种优化策略.不过对每个基础有非常深入地讲解,需要的童鞋可以自行去相关资料. 还有一些我认为非常好的参考文章: Performance Optimization for Mobile Devices

unity中mesh属性的uv坐标讨论

http://blog.sina.com.cn/s/blog_427cf00b0102vp0j.html 之前在做连连看游戏中,也用到贴图坐标,当时我们讲到,不管是平铺(Tiling)还是偏移(Offset),我们参考的基准都是原始的那张图,Tiling配合Offset,Tiling负责截取,Offset负责移动,最终实现截取贴图的任一部分?,但是这种方法弄出的图形形状都是方块的,无法实现任意的贴图 而下面要讨论的方法和上面的方法会大不一样,会从UV坐标的角度去讨论,从而实现想怎么贴就怎么贴的效