对《[Unity官方实例教程 秘密行动] Unity官方教程《秘密行动》(十二) 角色移动》的一些笔记和个人补充,解决角色在地形上移动时穿透问题。
这里素材全是网上找的。
教程看这里:
[Unity官方实例教程 秘密行动] Unity官方教程《秘密行动》(九) 角色初始设定
一、模型设置:
1.首先设置模型的动作无限循环。
不设置的话就会出现类似跑步只跑了第一步有动作后面无动作直接滑过去的样子。
1.1.点选模型的动作文件。
1.2.在“Inspector”面板点击“Animations”。
1.3.勾上“Loop Time”。
2.设置模型的比例。
可以把模型调整到合适的大小。
1.1.点选模型的动作文件。
1.2.在“Inspector”面板点击“Model”。
1.3.调整“Scale Factor”里的数值。
2.角色(Rigidbody)的移动。
在视屏里的例子中,玩家的移动的模型里自带了位移的。
如果自己手里的模型只是原地动作的话,可以加入以下代码,实现前进并平滑转弯的效果。
2.1.在 PlayerMovement 类里,增加角色移动速度字段。
/// <summary>
/// 角色移动速度。
/// </summary>
public float _speedMove = 15f;
2.2.主要使用 rigidbody.MovePosition() 方法进行移动,具体查文档。
/// <summary>
/// 角色移动。
/// </summary>
/// <param name="horizontal">横向。</param>
/// <param name="vertical">纵向。</param>
private void Moving(float horizontal, float vertical)
{
//移动的目标位置。
var targetPosition = new Vector3(horizontal * this._speedMove, 0f, vertical * this._speedMove); //更新刚体位置为目标位置。
rigidbody.MovePosition(rigidbody.position + targetPosition * Time.deltaTime);
}
2.3.将 Moving() 方法在 MovementManagement 的最后面调用。
/// <summary>
/// 让角色移动,并且要让它动作平滑,有良好的手感。
/// </summary>
/// <param name="horizontal">横向。</param>
/// <param name="vertical">纵向。</param>
private void MovementManagement(float horizontal, float vertical)
{
//判断玩家是否在横向或者纵向移动。
if (Math.Abs(horizontal) > 0f || Math.Abs(vertical) > 0f)
{
//角色转向。
Rotating(horizontal, vertical); //角色速度。
this._animator.SetFloat(this._hash._speedFloat, 1f, this._speedDampTime, Time.deltaTime); //角色移动。
Moving(horizontal, vertical);
}
else
{
//如果没有获取到用户输入时,将速度设置成 0。
this._animator.SetFloat(this._hash._speedFloat, 0f);
}
}
现在,角色已经可以在 Unity3d 里自制的地形里移动了,但是有个问题,角色碰到斜坡等地方的时候,会直接穿过去。
3.角色(Character Controller)的移动。
Unity3d 里有专门针对角色移动的控制器CharacterController。
3.1.删除 Rigidbody 与 Collider 组件。
3.2.增加CharacterController。
通过修改 Center 的值来调整自带的碰撞器的位置。
修改 Radius 与 Height 来调整碰撞器的大小。
如下图:
3.3.代码调整。
3.3.1.Moving() 方法修改成如下
使用 CharacterController 的SimpleMove方法进行移动,参数则表示相对原坐标的偏移量。
/// <summary>
/// 角色移动。
/// </summary>
/// <param name="horizontal">横向。</param>
/// <param name="vertical">纵向。</param>
private void Moving(float horizontal, float vertical)
{
var controller = GetComponent<CharacterController>(); //设置移动向量。
var moveDirection = new Vector3(horizontal, , vertical); /*
* 参数:移动的偏移。
* 例:假如角色向前 5 步,向右 3 步。
* 则:相对原坐标的偏移量是:Z 轴是 5, X 轴是 3 。
*/
controller.SimpleMove(moveDirection * this._speedMove);
}
3.3.2.由于没有了Rigidbody,所以转向方法void Rotating(float horizontal, float vertical)也需要做调整。
rigidbody.rigidbody.rotation 修改成 transform.rotation。
var newRotation = Quaternion.Lerp(rigidbody.rotation, targetRotaion, this._turnSmoothing * Time.deltaTime);
rigidbody.MoveRotation(newRotation);
修改成
transform.rotation = newRotation;
完整Rotating()方法如下:
/// <summary>
/// 角色转向。
/// </summary>
/// <param name="horizontal">横向。</param>
/// <param name="vertical">纵向。</param>
private void Rotating(float horizontal, float vertical)
{
//目标方向。
var targetDirection = new Vector3(horizontal, 0f, vertical); /*
* 创建目标旋转值 并假设Y轴正方向为"上"方向。
* 函数参数解释: LookRotation(目标方向为"前方向", 定义声明"上方向")
*/
var targetRotaion = Quaternion.LookRotation(targetDirection, Vector3.up); /*
* 创建新旋转值 并根据转向速度平滑转至目标旋转值。
* 函数参数解释: Lerp(角色刚体当前旋转值, 目标旋转值, 根据旋转速度平滑转向)
*/
var newRotation = Quaternion.Lerp(transform.rotation, targetRotaion, this._turnSmoothing * Time.deltaTime); //更新游戏对象旋转角度为新旋转角度。
transform.rotation = newRotation;
}
对《[Unity官方实例教程 秘密行动] Unity官方教程《秘密行动》(十二) 角色移动》的一些笔记和个人补充,解决角色在地形上移动时穿透问题。的更多相关文章
- 二十二、Hadoop学记笔记————Kafka 基础实战 :消费者和生产者实例
kafka的客户端也支持其他语言,这里主要介绍python和java的实现,这两门语言比较主流和热门 图中有四个分区,每个图形对应一个consumer,任意一对一即可 获取topic的分区数,每个分区 ...
- Spring Security教程之基于方法的权限控制(十二)
目录 1.1 intercept-methods定义方法权限控制 1.2 使用pointcut定义方法权限控制 1.3 使用注解定义方法权限控制 1.3.1 JSR-25 ...
- 源于《Unity官方实例教程 “Space Shooter”》思路分析及相应扩展
教程来源于:Unity官方实例教程 Space Shooter(一)-(五) http://www.jianshu.com/p/8cc3a2109d3b 一.经验总结 教程中步骤清晰,并且 ...
- Unity-2017.3官方实例教程Space-Shooter(二)
由于初学Unity,写下此文作为笔记,文中难免会有疏漏,不当之处还望指正. Unity-2017.3官方实例教程Space-Shooter(一) 章节列表: 一.创建小行星Prefab 二.创建敌机和 ...
- Unity-2017.3官方实例教程Space-Shooter(一)
由于初学Unity,写下此文作为笔记,文中难免会有疏漏,不当之处还望指正. Unity-2017.3官方实例教程Space-Shooter(二) 章节列表: 一.从Asset Store中下载资源并导 ...
- Unity-2017.2官方实例教程Roll-a-ball(二)
声明: 本文系转载,由于Unity版本不同,文中有一些小的改动,原文地址:http://www.jianshu.com/p/97b630a23234 上一节Unity-2017.2官方实例教程Roll ...
- Unity-2017.2官方实例教程Roll-a-ball(一)
声明: 本文系转载,由于Unity版本不同,文中有一些小的改动,原文地址:http://www.jianshu.com/p/6e4b0435e30e Unity-2017.2官方实例教程Roll-a- ...
- 2018年Unity结合Android SDK下载安装及配置教程
原文:2018年Unity结合Android SDK下载安装及配置教程 首先声明: Unity版本2017.1f3 最近试着在Unity中利用网易做AR开发时,发布项目文件需要发布到An ...
- 微信应用号开发知识贮备之altjs官方实例初探
天地会珠海分舵注:随着微信应用号的呼之欲出,相信新一轮的APP变革即将发生.从获得微信应用号邀请的业内人士发出来的一张开发工具源码截图可以看到,reacjs及其相应的FLUX框架altjs很有可能会成 ...
随机推荐
- MBR所在位置
如果offset的000000000位置如下图所示(主要看红色框框位置是否出现NTFS字样),说明系统文件是NTFS "EB 52"至"55 AA"位置是MBR ...
- JSON如何序列图片
图片采用JSON格式传输的话,需要把图片转成Base64格式. 首先把图片转成流:Image1.Picture.Graphic.SaveToStream(ss);然后编码成base64格式的:Enco ...
- 使用UIGestureRecognizer监听屏幕事件
转载自 http://blog.csdn.net/samguoyi/article/details/7911499 如果只是想获取屏幕点击事件有一个最简单的办法,就是写一个透明的uibutton覆盖 ...
- 配置Synergy(Server : XP, client: Win7)
此文只是为了Mark一下配置方法,以防以后重装系统的时候,忘记. 首先,因为我的Server机器是XP,所以要求两台机器,都是安装的x86的版本,而不能是x64的版本. 我用的版本是1.4.11, ...
- Heritrix 3.1.0 源码解析(三十七)
今天有兴趣重新看了一下heritrix3.1.0系统里面的线程池源码,heritrix系统没有采用java的cocurrency包里面的并发框架,而是采用了线程组ThreadGroup类来实现线程池的 ...
- Oracle数据库编程:在JDBC中应用Oracle
9.在JDBC中应用Oracle: JDBC访问数据库基本步骤: 1.加载驱动 2.获取链接对象 3.创建SQL语句 4.提交S ...
- iOS多线程总结
1.不要同时开太多的线程(1~3条线程即可,不要超过5条) 2.线程概念 1> 主线程 : UI线程,显示.刷新UI界面,处理UI控件的事件 2> 子线程 : 后台线程,异步线程 3.不要 ...
- 使用struts dojo ajax源码案例
我这里使用的jar 包struts2-dojo-plugin-2.2.1.1.jar ===========jsp======================= <%@ taglib prefi ...
- IPv4&IPv6双重协议栈
IPV4 TCP客户与IPV6服务器之间的通信: 1 启动IPV6服务器,创建套接监听口,绑定通配地址 2 IPV4调用gethostbyname找到该服务器对应的A记录 3 调用connect,向服 ...
- ......那么Win8.1怎么去掉文件夹?
(从已经死了一次又一次终于挂掉的百度空间人工抢救出来的,发表日期2014-05-11) 细心的朋友会发现,在Win8.1这台电脑(计算机)中,除了我们最熟悉的磁盘外,还新增了视频.图片.文档.下载.音 ...