昨天改《降龙十八掌》项目反馈时经理要求我在项目中点击到手印时显示爆炸特效,昨天折腾了好一会没弄好就先弄其它项目反馈了,今天改完反馈后有时间来研究下这个功能。

昨天就简单的写了点代码进行测试,加了一个Image和一个Sphere,目的是想在Scene场景中拖动Image移动时,在Game场景中能看到黑色的球Sphere能跟白色的Image在同一位置,如图所示:

这是白色Image的Anchor

其中ImageObj就是白色的Image,SphereObj就是黑色的球。

我项目分辨率为1920*1080, 经过测试,屏幕坐标没问题,一开始Image在屏幕中心位置时打印出(960,540),不过移动Image时世界坐标worldPos一直没有变化,一直等于相机的世界坐标,这就让我无语了,所以昨天先不管这个了,改其它反馈去了。

今天我决定先从原理着手,于是去网上找了下资料。有篇博客里有段文字讲了一下道理让我明白了。首先,摄像机对游戏世界的渲染范围是一个平截头体,就是一个立体梯形,不理解就百度看unity的相机资料。

在屏幕上,某个像素点相对于屏幕矩形的位置,可以对应于游戏世界中的点相对于某个截面的位置,关键在于这个点在哪个截面上,也就是说,关键在于这个截面离摄像机有多远!

在ScreenToWorldPoint这个方法中,参数是一个三维坐标,而实际上,屏幕坐标只能是二维坐标。参数中的z坐标的作用就是:用来表示上述平面离摄像机的距离。

也就是说,给定一个坐标(X,Y,Z),

首先截取一个垂直于摄像机Z轴的,距离为Z的平面P,这样不管X,Y怎么变化,返回的点都只能在这个平面上;

然后,X,Y表示像素坐标,根据(X,Y)相对于屏幕的位置,得到游戏世界中的点相对于截面P的位置,我们也就将屏幕坐标转换为了世界坐标。

总之,我们需要给屏幕坐标的z坐标先赋值再进行转换。

于是我添加了2行代码,如图:

Camera uiCamera = GameObject.Find("UICamera").GetComponent<Camera>();//UI相机Vector3 ptScreen = RectTransformUtility.WorldToScreenPoint(uiCamera, ImageObj.transform.position);Debug.Log("ptScreen = " + ptScreen);ptScreen.z = 0;ptScreen.z = Mathf.Abs(Camera.main.transform.position.z - SphereObj.transform.position.z);Vector3 worldPos = Camera.main.ScreenToWorldPoint(ptScreen);Debug.Log("worldPos = " + worldPos);SphereObj.transform.position = worldPos;

经过测试后显示正常,随便Image处于什么位置,Game视图中球跟Image是在一块的。

最后只要把那段代码自己写进一个函数里适当改一下就能在项目中使用了。

/// <summary>/// 获取让目标物体跟UI物体看起来在一起的世界坐标/// </summary>/// <param name="uiObj">UI物体</param>/// <param name="targetObj">目标物体</param>/// <returns></returns>public Vector3 GetUIToWordPos(GameObject uiObj, GameObject targetObj){Camera uiCamera = GameObject.Find("UICamera").GetComponent<Camera>();//UI相机Vector3 ptScreen = RectTransformUtility.WorldToScreenPoint(uiCamera, uiObj.transform.position);Debug.Log("ptScreen = " + ptScreen);ptScreen.z = 0;ptScreen.z = Mathf.Abs(Camera.main.transform.position.z - targetObj.transform.position.z);Vector3 ptWorld = Camera.main.ScreenToWorldPoint(ptScreen);return ptWorld;}
void ShowClickEffect(){GameObject obj = Instantiate(m_BoomPrefab, new Vector3(0, 0, 1), m_BoomPrefab.transform.rotation);Vector3 pos = GetUIToWordPos(HandObj, obj);obj.transform.position = pos;Destroy(obj, 0.5f);}

Instantiate()函数中产生的位置你可以自己定,我相机的位置x坐标是0,如果爆炸粒子大了你就把产生位置调远点或者把粒子调小点。

这是最后成功的效果截图。

unity 点击UI显示3D爆炸特效相关推荐

  1. Unity报错但VS(代码编辑器)不报错,Unity提示需要继承自MonoBehavior,Unity提示缺少命名空间或者DLL,Unity点击UI或者GameObject无法在Hierarchy锁定

    Unity一些神奇的报错包括但不限于 在2021年10月1日到2021年10月31日遇到的一些神奇的Unity的报错. 继承了MonoBehavior 但是Unity提示没有继承 问题描述:提示创建的 ...

  2. Unity 点击UI(按钮)与点击屏幕冲突

    Unity 有点击屏幕进行移动操作,通过Input.GetMouseButtonDown(0).如果点击到了一些UI上面会触发点击屏幕事件. 引入UnityEngine.EventSystems,用函 ...

  3. Unity中如何通过UI显示3D模型解决方案?

    需求:实现将3D模型显示在2DUI上面,实现王者荣耀英雄商城之中英雄展示功能,3D模型可以旋转,添加特效等正常3D功能. 使用RenderTexture和RawImage做相机映射 使用ScreenS ...

  4. unity点击UI防止触碰UI后面物体

    if (Input.GetMouseButton(0) & !EventSystem.current.IsPointerOverGameObject()){Ray ray = Camera.m ...

  5. unity怎么在UI面板上显示出3D立体模型

    unity怎么在Ui面板上显示出3D模型! 1.创建Render texture 2.创建RawImage 3.创建摄像机 注意点:1,摄像机和RawImage上面要将Render texture拖上 ...

  6. android显示3d模型_使用Unity AR Foundation在增强现实中查看模型

    本文将分享麻省理工学院的教程-使用Unity AR Foundation在增强现实中查看模型. 在本教程中,我们将介绍如何把3D模型导入Unity,并使用Android设备或iOS设备在AR中查看模型 ...

  7. Unity 3D 环境特效||Unity 3D 游戏场景设计实例

    Unity 3D 环境特效 一般情况下,要在游戏场景中添加雾特效和水特效较为困难,因为需要开发人员懂得着色器语言且能够熟练地使用它进行编程. Unity 3D 游戏开发引擎为了能够简单地还原真实世界中 ...

  8. Android UI - 粒子爆炸特效

    Android UI - 粒子爆炸特效 效果 实现 分析 关键代码 源码 效果 实现 分析 首先动画效果需要在一个位于顶层的view上绘制,目的是不被其他控件遮挡. 添加点击事件,触发后给控件加一个抖 ...

  9. Unity读取图片并显示到UI中

    Unity读取图片并显示到UI中 方法一:将图片转换成字符串 代码 解释 效果图 方法二:将图片转换成字节数组 代码 解释 效果图 对比 在进行Unity开发时,经常会遇到将读取磁盘中图片显示到UI上 ...

最新文章

  1. XML(一)XML大揭秘
  2. springboot 的两种配置文件语法||配置文件占位符||@Value 读取配置文件及验证处理
  3. 关于DataGridView的数据源绑定字符串两个值得注意的问题
  4. ios11更新提示信任_iOS13.6.1正式版更新,主要修复两大问题
  5. Gym 101221I [WF2014]Sensor Network (二分图匹配)
  6. GitHub基本使用
  7. 再写单链表(不带头单链表)
  8. Forward Plus Rendering
  9. A Hierarchical Deep Temporal Model for Group Activity Recognition
  10. KMP--找子串2.0
  11. 万稞pw80线切割编程软件_Sodick 沙迪克慢走丝线切割机床,工件摆斜不校边加工步骤...
  12. 电工电子技术基础----multisim7使用及实验过程
  13. 在线作诗,做诗机,一键生成藏头诗,藏头诗在线制作,藏头诗生成器, 姓名藏头诗,姓名作诗
  14. 历史上最著名的十二个失身少女(转贴)
  15. 如何去掉华三交换日志中机烦人的 STP_NOTIFIED_TC
  16. 游戏开发者的成长之路:C++经典项目控制台贪吃蛇(在GitHub热门项目上增添功能及修改bug)
  17. SCRUM团队的三个角色
  18. 第四章 多维数组、字符串与广义表
  19. android free form,android freeform模式定制桌面系统
  20. Android加密和解密(DES,AES,MD5)

热门文章

  1. 什么是新零售电商系统?
  2. 随堂记录1--硬件-安装系统-重定向-cp-mv-rm-find-alias-显示20-30行-替换find+sed-selinux-iptables-LANG...
  3. 教学目标四个维度_基于物理学科核心素养的教学设计
  4. Java向上转型 向下转型
  5. NOI2015 Day1 T2 软件包管理器 树链剖分
  6. python连乘函数_(Python3) 连加 连乘 代码
  7. 云服务器ECS选购集锦之九云服务器选购常见FAQ
  8. 从viewport发现小米手机参数不一致
  9. 前端工程师 - 面试题 (最新,最全)
  10. b丅151组成的充电器电路_手机万能充电器电路原理与维修