zoukankan      html  css  js  c++  java
  • 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;
    }
    }

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



  • 相关阅读:
    eclipse卡死在search for main types 20 files to index
    多线程并发执行任务,取结果归集。终极总结:Future、FutureTask、CompletionService、CompletableFuture
    同步中的四种锁synchronized、ReentrantLock、ReentrantReadWriteLock、StampedLock
    根据CPU核心数确定线程池并发线程数
    将DataTable转换成CSV文件
    C#中DataTable转化为List<T>解析
    DotNet项目中的一些常用验证操作
    DotNet处理服务器路径的方法
    C#运用ThoughtWorks生成二维码
    C#枚举类型的常用操作总结
  • 原文地址:https://www.cnblogs.com/llguanli/p/7194038.html
Copyright © 2011-2022 走看看