丝路设计培训学校-专注CG行业人才培养

搜索课程
  • 24小时免费客服热线
  • 025-6957-6046

当前位置:丝路教育>设计教程>游戏美术>unity>Unity3d中放大镜的效果怎么制作

Unity3d中放大镜的效果怎么制作

2018-12-13 10:37 来源: 丝路设计培训 分类: unity
182 作者:丝路设计培训

[导读] 在unity中可以简单的实现放大镜效果啊 . 那么现在就来一步一步实现这个: 1.创建一个摄像机对象,设置 projection 类型为 perspective 或者 orthographic. 2.设置相机的 orthographicSize 或者 fieldO

  在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世界点。

  你能看到最终的效果图:

Unity3d中放大镜的效果

  下面的 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();

  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;

  }

  }

  好了,本篇unity3d教程关于在unity3d中实现放大镜的介绍到此结束。以下是unity3d常见问题及解答:

  1、问题:unity3d虚拟现实的设计流程?

  答复:max 制作模型,导出fbx,导入unity,设计相机代码,设计ui,build 。

  2、问题:DDS格式怎么不显示?

  答复:Unity不支持DDS格式,Unity会将除DDS外的其他格式图片具有为DDS同样的优化。

  3、问题:Unity如何动态载入外部模型等文件?

  答复:可以使用AssetBundle。

  4、问题:脚本编辑器有语法提示吗?

  答复:有的,Win版使用Ctrl+I,Mac版使用Ctrl+>。

  5、问题:如何使用烘焙贴图(多重纹理)?

  答复:不要使用Shell贴图,直接将烘焙图赋予贴图的"自发光"通道之上。

  6、问题:为什么水面没有实时反射效果?

  答复:只有专业版才支持这种反射效果。

  7、问题:怎么做摄像机漫游动画?

  答复:Max正常制作摄像机漫游动画,倒到Unity中后,将Unity的Camea拖拽到Max导出的摄像机Gameobject物体之上,作为其子物体即可。

  8、问题:如何自定义Webplayer载入Logo及进度条?

  答复:< param name="progressbarimage" value="进度条名" />,< param name="progressframeimage" value="进度条外框名" />。

  9、问题:GUI上怎么使用中文字?

  答复:导入任意中文字体,然后定义GUISkin字体为该字体即可。

  10、问题:购买一个授权可以安装几台电脑?

  答复:可以安装于2个系统之上比如一个Win版一个Mac版。

  11、问题:Max文件扔到Unity中怎么说导入失败?

  答复:下载最新版Fbx插件,用Max导出Fbx文件然后扔Unity中。

  12、问题:如何不让摄像头穿透模型,离模型近了就像模型露面了?

  答复:设置相机的Near clip plane,调小一点,但是不要给负数。

  13、问题:怎么用双面贴图?

  答复:Unity中可设置双面Shader,最简单有效的办法是直接做成双面的实体模型,复杂一点的方法可以在材质脚本中的相应的SubShader中的一个Pass块中加入cull off,即关闭反面裁剪。

  14、问题:导入的Fbx模型尺寸小于Max中的尺寸?

  答复:在Unity中该文件的导入设置中设置缩放因子为1。

  15、问题:如何给相机添加Glow效果?

  答复:选中相机对象,在菜单中选中Component-Image Effects-Glow赋予该组件即可(专业版才支持此特效)。

  16、问题:怎么设置Webplayer默认尺寸?

  答复:到菜单Edit-Project Settings-Player中设置Default Web Screen尺寸即可。

  17、问题:怎么设置可执行文件的启动Banner?

  答复:到菜单Edit-Project Settings-Player中设置Resolution Dialog Banner。

  18、问题:如何设置雾效?

  答复:到菜单Edit-Render Settings中开启Fog及设置Fog Color等即可。

  19、问题:如何设定默认Skybox天空盒?

  答复:到菜单Edit-Render Settings中设置Skybox Material即可

  20、问题:如何下载Unity3d游戏开发工具?

  答复:Unity3D下载软件开发工具和游戏引擎套件(Unity) v4.1.3 下载Unity3d 4.1.3下载是一个让你轻松创作的多平台的游戏开发工具,是一个全面整合的专业游戏引擎综合编辑通过Unity简单的用户界面


版权声明:

本文由丝路设计培训学校的编辑人员所撰写,未经同意严禁转载,否则将严肃追究相关法律责任。文章原始链接:http://www.silusheji.com/yxdhjc/unity/1208.html

unity相关文章 您可能感兴趣

点击这里给我发消息