欢迎光临散文网 会员登陆 & 注册

unity 放大镜

2023-03-05 20:57 作者:小森游戏制作  | 我要投稿

 

完整教程请移步公众号  小森游戏制作  查看!!


   同学们好,我是小森老师!本次给大家带来一个 放大镜 工具的制作教程

首先我们下载需要的图片,模型素材 导入unity 这里老师使用的是2021版本

原理介绍:

我们知道 当我们用透视相机来看物体的时候 会有近大远小的效果,可以调整相机和目标的距离 或者调整相机的fieldofview来控制远近。基于此 我们想要获取放大效果就要拉近相机,而我们主相机如果拉近了就会导致整个画面都拉近,所以这里需要一个单独的相机来渲染放大的效果

实现:

    按照原理  我们先创建一个相机,并作为主相机的子物体(保证位置),调整fieldofview或者拉远一点:

这个时候我们game还是显示的其中一个相机,那么作为放大镜的相机(后边称之为放大相机)渲染(看到)的内容就需要显示到一个媒介上,也就是rendertexture然后把该内容通过rawimage或者面片显示出来,asssets文件夹里右键创建rendertexture 并调整size(越大越清楚)

然后创建Rawiamge 并调整大小放置屏幕正中间,texture指定为刚才的rendertexture

并调整相机 渲染texture为刚才的rendertexture,并调整渲染的layer(只渲染需要的 背景去掉)

吧模型设置为目标layer 这时效果如下

这里为了效果和方便区分我们加一个边框和遮罩

创建一个iamge 并指定一个实心圆 添加一个mask组件 ,然后调整大小后吧rawiamge拖到下边作为它的子物体(只有mask的子物体才能遮罩)

拖动放大相机已经可以简单看到效果,下一步我们需要写脚本获取鼠标点击位置 放大指定位置:

 public Transform magnifierCam;    public Camera main;    // Update is called once per frame    void Update()    {        if(Input .GetMouseButton(0))//鼠标左键按压        {            Vector3 pos = Input.mousePosition;            pos.z = magnifierCam.position.z;//只同步鼠标的xy z使用相机自己的            Vector3 worldpos = main.ScreenToWorldPoint(pos);//鼠标点击位置映射到场景里                      magnifierCam.position = worldpos;//移动相机        }    }    

指定主相机和放大相机 运行拖动鼠标后效果如下;

到目前已经有简单的放大效果,但是还有一些问题,接下来进行优化:

1,添加边框 去除背景:取消mask的showmask

  创建iamge 使用一个放大镜的图来作为背景:

2,修改放大相机为正交模式(应该是让他再模型的前方 正视图正交的形式)

3,相机位置更新改为点击鼠标位置发射射线 检测模型 对应的点 来计算相机应该在的位置 完整代码如下:

using System.Collections;using System.Collections.Generic;using UnityEngine;
/// <summary>/// 放大镜/// </summary>public class Magnifier : MonoBehaviour{
   // Start is called before the first frame update    void Start()    {        ui.gameObject.SetActive(false);//默认隐藏    }    public Camera magnifierCam;    public Transform ui;    public float dis;//跟模型的距离    public LayerMask modelLayer;    // Update is called once per frame    void Update()    {        if(Input .GetMouseButton(0))//鼠标左键按压        {            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);            RaycastHit hit;            if(Physics .Raycast (ray, out hit, 100,modelLayer))            {                Vector3 dir = Camera.main.transform.position - hit.transform.position;                dir.y = 0;//取消高度                magnifierCam.transform.position = hit.point + dir * dis;                ui.position = Input.mousePosition;                ui.gameObject.SetActive(true);            }else            {                ui.gameObject.SetActive(false);//如果没有点到模型 就是不放大 就隐藏放大镜            }        }else if(Input .GetMouseButtonUp(0))        {            ui.gameObject.SetActive(false);//松开鼠标就隐藏放大镜        }
   }}

整体对象调整如下:

最后 给模型添加碰撞器,不添加没法点击交互!!

这个时候效果已经达到!!1



制作不易,期待您的点赞关注和转发!!!

         



需要源码可以加入会员,源码以更新至会员库!!


某宝搜索 小森会员:注意店铺名 谨防选错!!




unity 放大镜的评论 (共 条)

分享到微博请遵守国家法律