对《[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很有可能会成 ...
随机推荐
- 在VS2013中使用水晶报表
又遇到了在B/S系统中打印,打印格式要求比较高,打印出的效果要求高大上.用VS2013中微软自带的报表,实在难以实现应用的效果,主要问题表现在: 1.不能插入用Word做好的打印模板,自己按照模板来做 ...
- UI进阶 科大讯飞(2) 语音合成(文字转换成语音)
科大讯飞开放平台.SDK下载.添加静态库.初始化见UI进阶 科大讯飞(1) 语音听写(语音转换成文字) 实现语音合成 功能实现步骤: 导入头文件 创建文字识别对象 指定文字识别后的回调代理对象 开启文 ...
- spring中文乱码过滤器
中文乱码过滤器 在您通过表单向服务器提交数据时,一个经典的问题就是中文乱码问题.虽然我们所有的 JSP 文件和页面编码格式都采用 UTF-8,但这个问题还是会出现.解决的办法很简单,我们只需要在 we ...
- centOS安装openoffice
centOS安装openoffice的方法: yum install openoffice.org-writer yum install openoffice.org-calc yum install ...
- HttpRequest Get Post,WebClient Get
#region HttpRequestGet public string HttpRequestGet(string url) { return HttpRequestGet(url, WebRequ ...
- CountDownLatch和CyclicBarrier的区别
[CountDownLatch.CyclicBarrier和Semaphore]http://www.cnblogs.com/dolphin0520/p/3920397.html [CountDo ...
- Ubuntu ENet 的下载和编译
ENet的目的是提供一个相对轻便.简单和强大的网络通信层的UDP(用户数据报协议). 它提供的主要功能是可选的.可靠的.顺序的数据包发送. ENet省略了一些更高层次的网络功能,如身份验证.加密,尤其 ...
- 【转】深入浅出REST
转自:http://www.infoq.com/cn/articles/rest-introduction 不知你是否意识到,围绕着什么才是实现异构的应用到应用通信的“正确”方式,一场争论正进行的如火 ...
- PS-文字如何竖排版
单击文字输入工具“T”按钮,点住鼠标左键不要松手,会在“T”按钮的右边显示出其它形式的文字工具,拖动鼠标指向“直排文字”工具就可以了.
- C#调用C++ dll时,结构体引用传参的方法
写了一个C++的LogLog Logit 四参数等算法的接口dll,给C#调用,但是发现传参有问题 如 extern "C" _declspec(dllexport) bool ...