【Unity3D】简单常用的功能实现1——鼠标点击实现移动
【鼠标点击实现移动】
第一步,在要移动的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——鼠标点击实现移动的更多相关文章
- 【Unity3D】简单常用的功能实现2——视角的跟随、旋转、缩放
[视角的跟随.旋转.缩放实现] 首先,在实现这些功能之前,我们给Hierarchy面板中的主摄像机额外包装几层Empty Object,形成一个新的摄像机结构,如下图(当然这些空物体的命名大家按自己方 ...
- 【Unity3D基础】让物体动起来②--UGUI鼠标点击逐帧移动
背景 上一篇通过鼠标移动的代码很简单,所以看的人也不多,但是还是要感谢“武装三藏”在博客园给出的评论和支持,希望他也能看到第二篇,其实可以很简单,而且是精灵自控制,关键是代码少是我喜欢的方式,也再次印 ...
- 【Unity3D基础】让物体动起来①--UGUI鼠标点击移动
背景 首先还是先声明自己是比较笨的一个人,总是找不到高效的学习方法,目前自己学习Unity3D的方式主要是两种,一种是直接看高质量的源码,另一种是光看不行还要自己动手,自己写一些有代表性的小程序,这也 ...
- Unity3D事件顺序与功能
Unity3D中所有控制脚本的基类MonoBehaviour有一些虚函数用于绘制中事件的回调,也可以直接理解为事件函数,例如大家都很清楚的Start,Update等函数,以下做个总结. Awake 当 ...
- ASP.NET MVC 学习4、Controller中添加SearchIndex页面,实现简单的查询功能
参考:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/examining-the-edit-method ...
- iOS常用小功能
CHENYILONG Blog 常用小功能 技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilong ...
- iOS 常用小功能 总结
常用小功能 iOS中的很多小功能都是非常简单的,几行代码就搞定了,比如打电话.打开网址.发邮件.发短信等 打电话 方法一(不被采用): 拨号之前会弹框询问用户是否拨号,拨完后能自动回到原应用 NSUR ...
- Unity UGUI 实现简单拖拽功能
说到拖拽,那必然离不开坐标,UGUI 的坐标有点不一样,它有两种坐标,一种是屏幕坐标,还有一种就是 UI 在Canvas内的坐标(暂时叫做ugui坐标),这两个坐标是不一样的,所以拖拽就需要转换. 因 ...
- 一步一步学Silverlight 2系列(5):实现简单的拖放功能
述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...
随机推荐
- 四层发现-TCP发现
直接向目标ip发送一个ACK数据包,正常情况下up状态的目标ip会返回一个SRT数据包. 使用scapy构造TCP数据包: 然后在将一些数据类型设置好就可以发送了. 实用脚本实现批量扫描: #!/us ...
- JavaWEB实现qq邮箱发送验证码——qq1692700664
// 随机验证码public String achieveCode() { String[] beforeShuffle = new String[] { "2", "3 ...
- 重学ASP.NET Core 中的标记帮助程序
标记帮助程序是什么 标记帮助程序使服务器端代码可以在 Razor 文件中参与创建和呈现 HTML 元素. 例如,内置的 ImageTagHelper 可以将版本号追加到图片名称. 每当图片发生变化时 ...
- 前端开发神器Charles从入门到卸载
前言 本文将带大家学习使用前端开发神器-charles,从基本的下载安装到常见配置使用,为大家一一讲解. 一.花式夸奖Charles 截取 Http 和 Https 网络封包. 支持重发网络请求,方便 ...
- SpringBoot--使用socket搭建聊天室
1.添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- python计算图像信息熵
import cv2 import numpy as np import math import time def get_entropy(img_): x, y = img_.shape[0:2] ...
- 《UNIX环境高级编程》(APUE) 笔记第五章 - 标准I/O库
5 - 标准I/O库 Github 地址 1. 标准 I/O 库作用 缓冲区分配 以优化的块长度执行 I/O 等 使用户不必担心如何选择使用正确的块长度 标准 I/O 最终都要调用第三章中的 I/O ...
- docker 运行镜像
docker run -e "环境变量=值“ --nam 别名 -v /etc/localtime:/etc/localtime:ro [时区保持跟宿主机器一致]-d -p 21021:80 ...
- Linux 安装Anaconda/Miniconda以后无法识别conda命令
注意:遇到无法识别conda命令时,可以先用步骤3试一下重启环境变量后conda命令是否能够识别 1. 修改环境变量 $ vim ~/.bashrc 2. 在最后添加: $ export PATH=~ ...
- MSIL入门(一)C#代码与IL代码对比
基础概念 Microsoft中间语言(MSIL),也成为通用中间语言(CIL),是一组与平台无关的指令,由特定于语言的编译器从源代码生成.MSIL是独立于平台的,因此,他可以在任何公共语言基础架构支持 ...