【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;
}

}

}

  

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

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

本文旨在通过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 initialization
    void Start ()
    {
       //获得Image的Transform
        childPlayTransform = transform.Find("Image").GetComponent<RectTransform>();
       }

    // Update is called once per frame
    void 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 frame
  void 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到底是什么坐标是屏幕坐标还是世界坐标,文档模棱两可并没有说明

总结

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

时间: 2024-10-28 07:52:25

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

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

背景 首先还是先声明自己是比较笨的一个人,总是找不到高效的学习方法,目前自己学习Unity3D的方式主要是两种,一种是直接看高质量的源码,另一种是光看不行还要自己动手,自己写一些有代表性的小程序,这也是本文的由来. 诚然,现在已经不是Unity3D发展的黄金期了,很多知识点已经有很多朋友总结分享了,但由于Unity3D的客观性就是依赖插件很厉害,这样就会照成插件满天飞,通用性不强,还有过时的风险,还有就是网上很多朋友发的帖子很多并不是学习总结,只是对于Unity3D IDE的使用及一些API的罗

时光煮雨 Unity3D让物体动起来③—UGUI DoTween&amp;Unity Native2D实现

本文首发蛮牛,次发博客园.接系列 第一篇,第二篇,本文为第三篇,再次感谢“武装三藏”在前两篇无私且精彩的问题解答 写在最前,时光煮雨,为了怀念 以下引用曾今读过的一些教程文章 其实这3种动画都有它特定的使用场合. 第一种动画适合创建简单的对象位移及直接性质的属性更改(在后面的教程中,我还将更深入的挖掘Storyboard动画的潜力,动态创建更复杂的基于KeyFrame的关键帧动画). 第二种动画适合全局属性的时时更改,例如我们后面要讲到的敌人或NPC以及地图等全体性的相对位移及属性更改时就要用到

Pygame中鼠标点击之后,物体逐渐移动到鼠标点击坐标的方法

1 import pygame 2 from pygame.locals import * 3 from pygame.math import * 4 import sys 5 6 pygame.init() 7 size = width, height = 1600, 900 8 screen = pygame.display.set_mode(size) 9 color = (0, 0, 0) # 设置颜色 10 ball = pygame.image.load('dabai_new.gif

css基础 outline:none 取消input的 鼠标点击时蓝色的框框 效果

礼悟:    公恒学思合行悟,尊师重道存感恩.叶见寻根三返一,江河湖海同一体.          虚怀若谷良心主,愿行无悔给最苦.读书锻炼养身心,诚劝且行且珍惜.              ide:visual studio 2017             browser:Chrome                     os:win7 代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8&qu

Unity3D基础教程】(四):通过制作Flappy Bird了解Native 2D...

[狗刨学习网] 引子 在第一篇文章[Unity3D基础教程]给初学者看的Unity教程(一):GameObject,Compoent,Time,Input,Physics我已经讲过了一些关于刚体和碰撞的关系,这次我们就通过Flappy Bird这个事例来讲解一下刚体和碰撞体在游戏中的具体应用.相关代码可以参考Flappy Bird的源码. 认识RigidBody 当RigidBody2D的质量属性被设置为0时,刚体的质量变为无限大,此时刚体相当于静态刚体,永远一动不动.但是在Unity中你是无法

【Unity3D基础教程】给初学者看的Unity教程(三):通过制作Flappy Bird了解Native 2D中的Sprite,Animation

作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 引子 上一次我们讲了MonoBehaviour的前世今生,了解了游戏中的每一个GameObjec都是由脚本控制的,这一次我们开始将Unity中Native 2D中的Sprite,并且使用Animation来让Sprite动起来. 在接下来的几篇博客里,我会通过做一个Flappy Bird来讲解Unity中各个组件的使用,项目的源代码在这里:U

Android开发 Unity3D基础 Android Development

开发环境 Window 7 Unity3D 3.3.0 MB525 defy Android 2.1-update1 本次学习: 1.认识Unity 2.Unity3D环境搭建与Android软件生成 3.Unity3D基本使用方法 1.认识Unity3D Unity3D是一个让开发者能够在多平台制作同一款游戏的游戏开发工具,有专业的图像处理和游戏引擎,能做出各式各样的游戏. 羽化以前认为Android游戏开发只能在Eclipse里面死活敲代码,也许是自己阅历不够,不知道游戏引擎能给游戏开发带来

【Unity3D基础教程】给初学者看的Unity教程(四):通过制作Flappy Bird了解Native 2D中的RigidBody2D和Collider2D

作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 引子 在第一篇文章[Unity3D基础教程]给初学者看的Unity教程(一):GameObject,Compoent,Time,Input,Physics我已经讲过了一些关于刚体和碰撞的关系,这次我们就通过Flappy Bird这个事例来讲解一下刚体和碰撞体在游戏中的具体应用.相关代码可以参考Flappy Bird的源码. 认识RigidBo

unity3d基础01

Unity3d 五大视图: 1 Scene:存放hierarchy中创建的游戏对象,但实际只能看到一部分 *Scene浏览: ①右键进入“飞行模式”,方便查看整个场景 ②选中摄像机,按ALT进入浏览的模式,便于查看摄像机的的视野范围,再用移动旋转之类的调整.和右键一样 ③鼠标滚轮缩放场景 ④选中一个游戏对象,点GameObject下 //快速调整对象 Move to view:shift the selected object to the center of the view port Ali