【Unity3D基础】让物体动起来②--UGUI鼠标点击逐帧移动

背景

上一篇通过鼠标移动的代码很简单,所以看的人也不多,但是还是要感谢“武装三藏”在博客园给出的评论和支持,希望他也能看到第二篇,其实可以很简单,而且是精灵自控制,关键是代码少是我喜欢的方式,也再次印证了Unity3d的复杂性(同样的功能多次封装),代码如下:

public class DebugTest : MonoBehaviour
{
RectTransform m_Rect;void Start ()
{
m_Rect = GetComponent<RectTransform>();
}void Update()
{
if(Input.GetMouseButtonUp(0))
{
m_Rect.position = Input.mousePosition;
}}}

  

效果如下(由于效果基本相似,接上一篇的预览图):

run

这一篇主要解决上一篇最后提出的问题,也就是通过这样鼠标移动物体时不够平滑的,不管有多远都是瞬移过去的,视觉体验不够优秀。

本文旨在通过Update中逐帧移动。达到平滑移动的效果

原理

1、记录鼠标点击的点,这个点是如果是屏幕坐标
2、将这个屏幕坐标转换成世界坐标
3、使用鼠标的世界坐标-精灵的世界坐标||也可以使用鼠标的本地坐标-精灵的本地坐标
4、通过3获得移动方向,做插值在Update里面移动精灵
5、移动精灵可以使用世界坐标移动,也可以通过local本地坐标移动

实现1

通过UGUI 事件系统中的IPointerClickHandler实现鼠标点击,然后在Update中逐帧移动,所有坐标使用LocalPosition,原理很简单这里代码不啰嗦

   private RectTransform childPlayTransform;private float speed =10.0f;private Vector2 pointClickPostion;private Vector3 currentLocalPostion;private Vector3 moveDirect;// Use this for initializationvoid Start (){//获得Image的TransformchildPlayTransform = transform.Find("Image").GetComponent<RectTransform>();}// Update is called once per framevoid Update (){currentLocalPostion = childPlayTransform.localPosition;Vector3 targetPosition = moveDirect * speed + currentLocalPostion;childPlayTransform.localPosition = Vector3.Lerp(currentLocalPostion, targetPosition, Time.deltaTime*4f);}public void OnPointerClick(PointerEventData eventData){Vector2 localPoint;//在矩形范围内检测,全局鼠标点击点,到local点的转换RectTransformUtility.ScreenPointToLocalPointInRectangle(transform.GetComponent<RectTransform>() , eventData.position,eventData.enterEventCamera, out localPoint);pointClickPostion = localPoint;moveDirect = new Vector3(pointClickPostion.x, pointClickPostion.y, 0) - currentLocalPostion;moveDirect.z = 0;moveDirect.Normalize();}

  

实现2

通过Unity3d 输入系统Input输入得鼠标位置,然后再Update中使用世界坐标进行精灵的逐帧平移,代码如下:

private Transform spriteTransform;Vector3 direction;Vector3 spriteCurentPoistion;Vector3 targetPosition;float speed = 2.0f;void Start () {spriteTransform = transform.Find("Image") as Transform;}// Update is called once per framevoid Update () {spriteCurentPoistion = spriteTransform.position;//向量加法(向鼠标方向)targetPosition = direction * speed + spriteCurentPoistion;spriteTransform.position = targetPosition;}public void OnPointerClick(PointerEventData eventData){Vector3 mouseWorldPointer = new Vector3(eventData.position.x, eventData.position.y, 0);//屏幕坐标转换成世界坐标//Vector3 mouseWorldPointer = Camera.main.ScreenToWorldPoint(mouseScreenPointer);//向量减法获得指向鼠标点的方向direction = mouseWorldPointer - spriteTransform.position;direction.z = 0;direction.Normalize();Debug.Log(string.Format("x:{0},y:{1}-- {2},{3}", mouseWorldPointer.x, mouseWorldPointer.y, eventData.position.x, eventData.position.y));}

  

问题记录

在试验的时候遇到一些小问题,特此记录,也希望高手路过慷慨回答

1、关于进行显性插值函数

Vector3.Lerp(currentLocalPostion, targetPosition, Time.deltaTime*4f);

实际这是一个公式也很简单,就是我看教程(Unity3d)的时候Time.deltaTime这个值很大,而实际中发现这个值很小,造成插值的时候很微量的移动,不知为何只能乘以一个系数

2、关于Unity3d的Input输入的函数提示很弱

比如 eventData.position和Input.mousePosition到底是什么坐标是屏幕坐标还是世界坐标,文档模棱两可并没有说明

总结

在实现一个如此小的功能,给人深刻影响的可以使用的方法很多,遇到一些知识点,原理也很简单,但你不深入却得不到答案。这个世界就像快餐,变得太快。

转载于:https://www.cnblogs.com/IlidanStormRage/p/5993772.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292518.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一个有趣的Go项目,3D界面管理k8s集群,真好玩!

大家好&#xff0c;我是小碗汤&#xff0c;今天分享一个用Golang开发&#xff0c;很好玩的工具KubeCraftAdmin[1]&#xff1a;用Minecraft方式管理k8s的工具&#xff0c;感兴趣的兄弟不妨玩一玩。文末有视频&#xff0c;供您鉴赏~Minecraft&#xff1a;我的世界&#xff0c;是微…

java 数组拼接_打印Java数组最优雅的方式是什么?这波操作闪瞎我

在 Java 中&#xff0c;数组虽然是一个对象&#xff0c;但并未明确的定义这样一个类&#xff0c;因此也就没有覆盖 toString() 方法的机会。如果尝试直接打印数组的话&#xff0c;输出的结果并不是我们预期的结果。那有没有一些简单可行的方式呢&#xff1f;如果大家也被这个问…

AmazeUI基本样式

2019独角兽企业重金招聘Python工程师标准>>> AmazeUI是一个轻量级、Mobile first的前端框架&#xff0c;基于开源社区流行的前端框架编写。 Normalize AmazeUI使用了normalize.css&#xff0c;但做了些调整&#xff1a;html添加了-webkit-font-smoothing:antialiase…

Oracle基础中的基础视频讲座录像(西安)供免费下载

下载地址播放器也在上述目录中。记得那年园博会&#xff0c;培训中间有一天参观&#xff1a;转载于:https://blog.51cto.com/botang/1323099

她13岁自己造飞机,17岁进麻省理工,3篇黑洞论文被霍金引用......

全世界只有3.14 % 的人关注了爆炸吧知识13岁的时候&#xff0c;你在干嘛&#xff1f;我想&#xff0c;绝大多数人都没有萨布丽娜这么硬核——独自组装飞机。之后&#xff0c;16岁的萨布丽娜完成了生涯首飞&#xff0c;历史第一年轻。17岁时&#xff0c;她考上麻省理工&#xff…

Windows 10 2022 年更新来了!

面向 Release Preview 频道的 Windows 10 预览体验成员&#xff0c;微软现已发布 Windows 10 Build 19044.1499。主要修复1.微软修复了阻止某些环绕声音频在 Microsoft Edge 中播放的问题。2.微软修复了使用中文输入法时&#xff0c;一些应用停止工作的意外错误。3.微软修复了在…

当代成年人的生活状态......

1 小喵咪举起了它的狙击枪▼2 简直有毒...▼3 哈哈哈哈哈▼4 电焊既视感▼5 请问需要小猫咪吗&#xff1f;▼6 哈哈哈哈哈▼7 一物降一物▼7 数学能有多好玩&#xff1f;▼你点的每个赞&#xff0c;我都认真当成了喜欢

c++ why can't class template hide its implementation in cpp file?

类似的问题还有&#xff1a; why cant class template use Handle Class Pattern to hide its implementation? || why there are linker problems (undefined reference) to my class template? 我出现问题的源码&#xff08;见main.cpp,Stack.h,Stack.cpp&#xff09;&…

C# using static 声明

许多实际的扩展可以通过扩展方法来实现&#xff0c;并非所有实际的扩展都有可以扩展的类型。对于某些场景&#xff0c;简单的静态方法比较适合。为了更容易调用这些方法&#xff0c;可以使用 using static 声明除去类名。例如&#xff0c;如果打开了 System.Console using stat…

PHP性能追踪及分析工具xhprof的安装与使用

PHP性能追踪及分析工具xhprof的安装与使用 对于本地开发环境来说&#xff0c;进行性能分析xdebug是够用了&#xff0c;但如果是线上环境的话&#xff0c;xdebug消耗较大&#xff0c;配置也不够灵活&#xff0c;因此线上环境建议使用xhprof进行PHP性能追踪及分析。 我们今天就简…

C 语言 int 型乘法溢出问题

2019独角兽企业重金招聘Python工程师标准>>> long l; int a, b; l a*b; 因为 a*b 的结果仍然以 int 型保存, 所以即使 l 为long,仍然会有溢出,并且截去了部分数据.出现问题. 转载于:https://my.oschina.net/simon203/blog/175885

Android插件化开发基础之Java类加载器与双亲委派模型

类加载器 Java虚拟机类加载过程是把Class类文件加载到内存&#xff0c;并对Class文件中的数据进行校验、转换解析和初始化&#xff0c;最终形成可以被虚拟机直接使用的java类型的过程。 在加载阶段&#xff0c;java虚拟机需要完成以下3件事&#xff1a; a.通过一个类的全限定名…

将k8s制作成3D射击游戏,好玩到停不下来,附源码

点击上方蓝字 关注【我的小碗汤】大家好&#xff0c;我是小碗汤&#xff0c;今天演示一个项目&#xff0c;利用Unity做场景、用C#做交互逻辑&#xff0c;将k8s制作成一个3D射击游戏。正好最近在学习Unity&#xff0c;所以利用这个项目开始上手挺合适的。源码、可执行文件可以自…

JavaJVM之ClassLoader源码分析

层次结构和类图 ClassLoader层次结构&#xff1a;UML类图&#xff1a;sun.misc.Launcher.ExtClassLoader sun.misc.Launcher.AppClassLoader 显式加载类 在代码中显式加载某个类&#xff0c;有三种方法&#xff1a;this.getClass().getClassLoader().loadClass()Class.forName(…

ASP.NET Core Web API使用静态swagger.json文件

前言ASP.NET Core Web API默认集成了Swashbuckle&#xff0c;可以在运行时显示Swagger UI&#xff1a;而Swagger UI实际上是解析的动态生成的swagger.json&#xff1a;app.UseSwagger(); app.UseSwaggerUI(c > c.SwaggerEndpoint("/swagger/v1/swagger.json", &qu…

XenApp共享桌面打开文件警告与桌面文件由于Internet文件安全设置无法打开解决办法...

问题现象 1. 在使用了UPM与文件夹重定向后&#xff0c;个人的桌面路径就会变成一个UNC路径&#xff0c;这个时候如果用户登录共享桌面的话可以看到桌面与快速启动栏的文件与快捷方式&#xff0c;但是打开的时候就会遇到以下错误 这种情况是由于我们放的文件是一个网络路径所导致…

周选特辑|一些超棒的开源项目!

编程导航 每周新增资源优选特辑 02编程导航 致力于推荐优质编程资源 &#x1f48e;项目开源仓库&#xff1a;https://github.com/liyupi/code-nav跪求一个 star ⭐️哈喽大家好&#xff01;我是编程导航的小编火宝。美好的一周又过去了&#xff0c;大家有没有认真学习呢&#x…