【鼠标点击实现移动】

第一步,在要移动的GameObject的Inspector面板中添加角色控制器组件并调整参数。

参数的调整可以依照Scene面板,如下图的绿色线框(角色控制器组件是一种胶囊形状的特殊刚体,这里我把Height调整为了0所以是球体的样子):

第二步,在 要移动的GameObject 的 脚本 中先声明下面的变量:

 private CharacterController m_CharacterController;    //角色控制器组件的引用
private Vector3 targetPosition = Vector3.zero; //用于存放要到达位置的坐标,归零表示暂时不需要移动
private RaycastHit hitInfo;           //存放碰撞检测信息(点击射线与地面的碰撞的信息)

第三步,在脚本的Update方法里实现鼠标点击获取目的地坐标(当然把下述代码封装在一个方法里,再在Update方法中调用也可以):

         if (Input.GetMouseButtonUp())//参数0是左键,1是右键
{ //生成由一道 由主Camera至屏幕点击处 的射线
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
4 //检测射线与地面是否碰撞并额外返回碰撞信息至hitInfo变量,第三个参数确定射线长度,第四个参数确定开启检测的layer(在本例子里地面处于defaul层,即第0层)
if (Physics.Raycast(ray, out hitInfo,Mathf.Infinity,<<))
{//讲hitInfo中关于碰撞点的位置存贮至targetPosition变量中
targetPosition = hitInfo.point;
} }
//空格键停止移动
if (Input.GetKeyUp(KeyCode.Space)) {targetPosition = Vector3.zero;}

最后一步,在脚本的Update方法中实现物体的移动(下述代码也可以封装在一个方法里,然后在Update方法中调用也可以,但注意,在调用这段代码前,targetPosition要先获取的目的地坐标):

 //坐标归零则不需要移动
if (targetPosition == Vector3.zero) { return; }
//先检测物体与坐标与目的坐标,大于0.1f则继续朝向移动,注意:这里不能判断条件不可以写>0,因为实际运行时两的点的距离通常不会为零,而是零点几
if (Vector3.Distance(transform.position, targetPosition) > 0.1f){
Vector3 direction = targetPosition - transform.position; //获得方向向量
direction = direction.normalized; //方向向量归一化
transform.LookAt(new Vector3(targetPosition.x,transform.position.y, targetPosition.z)); //物体Z轴指向目的地坐标
m_CharacterController.Move(direction *Time.deltaTime* ); //调用组件移动方法,方向向量作为参数传入
}
else
{ //到达目的地则targetPosition归零
targetPosition = Vector3.zero;
}

Last but not least,再强调一下比较重要的三个地方。

1、第二段代码第5行:

if (Physics.Raycast(ray, out hitInfo,Mathf.Infinity,1<<0))
方法的第二个参数添加额外返回值,第四个参数开启指定图层的碰撞检测。

2、第三段代码第4行的判断条件: 

Vector3.Distance(transform.position, targetPosition) > 0.1f
这里判断条件不要写>0,因为实际运行时,两点距离为一个小数,写>0的话,物体到达目的地后不会停下,而是围着目的地转。

3、第三段代码第6行:

direction = direction.normalized;
 方向向量的归一化。 

【Unity3D】简单常用的功能实现1——鼠标点击实现移动的更多相关文章

  1. 【Unity3D】简单常用的功能实现2——视角的跟随、旋转、缩放

    [视角的跟随.旋转.缩放实现] 首先,在实现这些功能之前,我们给Hierarchy面板中的主摄像机额外包装几层Empty Object,形成一个新的摄像机结构,如下图(当然这些空物体的命名大家按自己方 ...

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

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

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

    背景 首先还是先声明自己是比较笨的一个人,总是找不到高效的学习方法,目前自己学习Unity3D的方式主要是两种,一种是直接看高质量的源码,另一种是光看不行还要自己动手,自己写一些有代表性的小程序,这也 ...

  4. Unity3D事件顺序与功能

    Unity3D中所有控制脚本的基类MonoBehaviour有一些虚函数用于绘制中事件的回调,也可以直接理解为事件函数,例如大家都很清楚的Start,Update等函数,以下做个总结. Awake 当 ...

  5. ASP.NET MVC 学习4、Controller中添加SearchIndex页面,实现简单的查询功能

    参考:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/examining-the-edit-method ...

  6. iOS常用小功能

    CHENYILONG Blog 常用小功能 技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilong  ...

  7. iOS 常用小功能 总结

    常用小功能 iOS中的很多小功能都是非常简单的,几行代码就搞定了,比如打电话.打开网址.发邮件.发短信等 打电话 方法一(不被采用): 拨号之前会弹框询问用户是否拨号,拨完后能自动回到原应用 NSUR ...

  8. Unity UGUI 实现简单拖拽功能

    说到拖拽,那必然离不开坐标,UGUI 的坐标有点不一样,它有两种坐标,一种是屏幕坐标,还有一种就是 UI 在Canvas内的坐标(暂时叫做ugui坐标),这两个坐标是不一样的,所以拖拽就需要转换. 因 ...

  9. 一步一步学Silverlight 2系列(5):实现简单的拖放功能

    述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

随机推荐

  1. 使用word2016发有代码高亮的博客

    复制使用notepad++,eclipse这类有高亮的编辑器编写的代码到word中是默认有高亮的. 测试有没有代码高亮(eclipse代码): package p_day1; public class ...

  2. Python 简明教程 --- 18,Python 面向对象

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 代码能借用就借用. -- Tom Duff 目录 编程可分为面向过程编程和面向对象编程,它们是两种不 ...

  3. docx.opc.exceptions.PackageNotFoundError: Package not found at '文件名.docx' 问题解决

    编译源程序时,提示:docx.opc.exceptions.PackageNotFoundError: Package not found at '文件名.docx' . 源文件明明存在啊,难道是用的 ...

  4. 小师妹学JVM之:逃逸分析和TLAB

    目录 简介 逃逸分析和栈上分配 TLAB简介 TLAB详解 设置TLAB空间的大小 TLAB中大对象的分配 TLAB空间中的浪费 总结 简介 逃逸分析我们在JDK14中JVM的性能优化一文中已经讲过了 ...

  5. Java synthetic

    读完这篇文章你将会收获到 synthetic fields synthetic method synthetic class 概述 上一篇 Java 枚举 提及到编译成 class 文件之后.编译器会 ...

  6. rhel7 rpmbuild 制作二进制程序安装包(.rpm) 简单示例

    下载rpm-build: # yum install rpm-build 如果上述方式无法安装(没配置网络源,虚拟机下是安装媒介源) 可以用下列方式下载后再安装(实践结果可能版本问题引起的缺少太多的* ...

  7. 20 个 CSS高级样式技巧汇总

    使用技巧会让人变的越来越懒,没错,我就是想让你变懒.下面是我收集的CSS高级技巧,希望你懒出境界. 1. 黑白图像 这段代码会让你的彩色照片显示为黑白照片,是不是很酷? img.desaturate ...

  8. vx小程序(1)

    一.程序配置 app.json 1. pages字段——用于描述当前小程序的页面路径. 2.window字段——定义小程序所有页面的顶部背景颜色,文字颜色等. 注意:可以在pages/logs目录下的 ...

  9. 重学 Java 设计模式:实战策略模式「模拟多种营销类型优惠券,折扣金额计算策略场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 文无第一,武无第二 不同方向但同样努力的人,都有自身的价值和亮 ...

  10. [JAVA]标准IO流操作

    import java.io.*; /** * @Description: * @projectName:JavaTest * @see:PACKAGE_NAME * @author:郑晓龙 * @c ...