转载:http://www.manew.com/thread-42935-1-1.html?_dsign=4597a598
其实和 小地图都差不多了。 还是要借助 另一个相机
目的: 这篇文章的主要目的是 要给你一个想法 如何做放大境效果 。
在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 脚本: 添加到一个空的游戏对象。
[C#]
纯文本查看
复制代码
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
|
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;
}
}
|
相信你可以通过这个 做的更好!