[Unity] 如何在unity3d中做放大境效果

查看:1102 |回复:15 | 2015-11-12 16:50:55

您需要 登录 才可以下载或查看,没有账号?注册

x
这篇文章的主要目的是 要给你一个想法 如何在unity3d中做放大境效果 。
在unity中可以简单的实现放大镜效果啊 . 那么现在就来一步一步实现这个:
1.创建一个摄像机对象,设置 projection 类型为 perspective 或者 orthographic.
2.设置相机的 orthographicSize 或者 fieldOfView (依赖于相机的 projection 类型 ).
3.设置其 pixelrect . 例如如果您想要在你鼠标位置显示放大境 和其大小是 100 x 100 , 然后设置pixelrect 为 :magnifyCamera.pixelRect = new Rect (Input.mousePosition.x – 100f / 2.0f, Input.mousePosition.y – 100f / 2.0f, 100f, 100f);
4.设置相机的位置。 例如 如果你想在 你的鼠标位置显示放大镜效果 ,那么设置相机的位置为 mousePosition世界点。
你能看到最终的效果图
16395C914-0.jpg 下面的 C# 脚本将创建一个 MagnifyGlass,并将它移动到 mousePosition位置 。
MagnifyGlass 脚本: 添加到一个空的游戏对象。
using Unity Engine;
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();
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();
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;
}
}

2015-11-12 16:50:55  
 赞 赞 1

使用道具 登录

15个回答,把该问题分享到群,邀请大神一起回答。
2#
元素帖子强,满满正能量
回复 收起回复
2015-11-15 20:11:54   回复
 赞 赞 1

使用道具 登录

3#
先围观,再马克,回复攒币,最后入手
回复 收起回复
2016-12-29 22:01:39   回复
 赞 赞 1

使用道具 登录

4#
{:1_144:}
回复 收起回复
2017-1-3 19:21:16   回复
 赞 赞 1

使用道具 登录

5#
为了元素币{:1_145:}
回复 收起回复
2017-1-7 13:22:39   回复
 赞 赞 1

使用道具 登录

6#
感谢楼主分享
回复 收起回复
2017-1-8 21:54:39   回复
 赞 赞 1

使用道具 登录

7#
首发必须微元素,挖矿撩妹两不误!
回复 收起回复
2017-1-13 21:40:54   回复
 赞 赞 1

使用道具 登录

8#
搬运工也辛苦了
回复 收起回复
2017-1-14 23:24:38   回复
 赞 赞 1

使用道具 登录

9#
我们先定一个能达到的小目标,先赚它一亿元素币
回复 收起回复
2017-2-6 15:39:43   回复
 赞 赞 1

使用道具 登录

10#
我们先定一个能达到的小目标,先赚它一亿元素币
回复 收起回复
2017-2-19 17:41:21   回复
 赞 赞 1

使用道具 登录

11#
看看
回复 收起回复
2018-10-18 00:15:20   回复
 赞 赞 1

使用道具 登录

12#
额外热无热无
回复 收起回复
2018-10-18 00:29:03   回复
 赞 赞 1

使用道具 登录

13#
写谢楼主分享~!辛苦辛苦
回复 收起回复
2018-10-18 10:29:06   回复
 赞 赞 1

使用道具 登录

14#
现在很多教程贴啊
回复 收起回复
2018-10-19 11:15:48   回复
 赞 赞 1

使用道具 登录

15#
感谢分享
回复 收起回复
2018-10-19 11:30:19   回复
 赞 赞 1

使用道具 登录

16#
中间有一句代码提示过时了!!!!
回复 收起回复
2020-1-1 09:38:28   回复
 赞 赞 1

使用道具 登录

CG 游戏行业专业问题

Unity3D技术手机游戏引擎手游引擎
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表