这里素材全是网上找的。

教程看这里:

[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官方教程《秘密行动》(十二) 角色移动》的一些笔记和个人补充,解决角色在地形上移动时穿透问题。的更多相关文章

  1. 二十二、Hadoop学记笔记————Kafka 基础实战 :消费者和生产者实例

    kafka的客户端也支持其他语言,这里主要介绍python和java的实现,这两门语言比较主流和热门 图中有四个分区,每个图形对应一个consumer,任意一对一即可 获取topic的分区数,每个分区 ...

  2. Spring Security教程之基于方法的权限控制(十二)

    目录 1.1     intercept-methods定义方法权限控制 1.2     使用pointcut定义方法权限控制 1.3     使用注解定义方法权限控制 1.3.1    JSR-25 ...

  3. 源于《Unity官方实例教程 “Space Shooter”》思路分析及相应扩展

    教程来源于:Unity官方实例教程 Space Shooter(一)-(五)       http://www.jianshu.com/p/8cc3a2109d3b 一.经验总结 教程中步骤清晰,并且 ...

  4. Unity-2017.3官方实例教程Space-Shooter(二)

    由于初学Unity,写下此文作为笔记,文中难免会有疏漏,不当之处还望指正. Unity-2017.3官方实例教程Space-Shooter(一) 章节列表: 一.创建小行星Prefab 二.创建敌机和 ...

  5. Unity-2017.3官方实例教程Space-Shooter(一)

    由于初学Unity,写下此文作为笔记,文中难免会有疏漏,不当之处还望指正. Unity-2017.3官方实例教程Space-Shooter(二) 章节列表: 一.从Asset Store中下载资源并导 ...

  6. Unity-2017.2官方实例教程Roll-a-ball(二)

    声明: 本文系转载,由于Unity版本不同,文中有一些小的改动,原文地址:http://www.jianshu.com/p/97b630a23234 上一节Unity-2017.2官方实例教程Roll ...

  7. Unity-2017.2官方实例教程Roll-a-ball(一)

    声明: 本文系转载,由于Unity版本不同,文中有一些小的改动,原文地址:http://www.jianshu.com/p/6e4b0435e30e Unity-2017.2官方实例教程Roll-a- ...

  8. 2018年Unity结合Android SDK下载安装及配置教程

    原文:2018年Unity结合Android SDK下载安装及配置教程 首先声明: Unity版本2017.1f3        最近试着在Unity中利用网易做AR开发时,发布项目文件需要发布到An ...

  9. 微信应用号开发知识贮备之altjs官方实例初探

    天地会珠海分舵注:随着微信应用号的呼之欲出,相信新一轮的APP变革即将发生.从获得微信应用号邀请的业内人士发出来的一张开发工具源码截图可以看到,reacjs及其相应的FLUX框架altjs很有可能会成 ...

随机推荐

  1. UVALive 5888 Stack Machine Executor (栈+模拟)

    Stack Machine Executor 题目链接: http://acm.hust.edu.cn/vjudge/problem/26636 Description http://7xjob4.c ...

  2. HDU 1846 Brave Game(简单巴什博弈)

    Brave Game Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. PostQueuedCompletionStatus详解

    PostQueuedCompletionStatus函数,向每个工作者线程都发送—个特殊的完成数据包.该函数会指示每个线程都“立即结束并退出”.下面是PostQueuedCompletionStatu ...

  4. php中定义类

    <?php class Person{ //定义了一个Person类 public $name; //定义属性name public $age; //定义属性age function __con ...

  5. QA技能必备

    一 常用Linux命令 二 自动化工具

  6. Spring REST实践之Spring Boot

    Spring Boot基本描述 可以利用http://start.spring.io网站的进行Spring Boot的初始化构建.这个初始化构建器允许你输入工程基本信息.挑选工程支持的功能,最后会生成 ...

  7. mac 安装PIL

    PIL是python Image library 在mac终端中通过以下命令安装: # download curl -O -L http://effbot.org/media/downloads/Im ...

  8. 使用XCopy发布网页

    链接:https://documentation.devexpress.com/#eXpressAppFramework/CustomDocument113245 In this lesson, yo ...

  9. jqGrid初次使用遇到的问题及解决方法

    问题一:初始化定义翻页用的导航栏时,表中出现"undefined"方框: 解决:需要导入grid.locale-cn.js文件. 问题二:页面只有一页,无法翻页: 解决:初始化设置 ...

  10. 一条结合where、group、orderby的linq语法

    DataTable dt = (from x in dsResult.Tables[0].AsEnumerable() where DataTrans.CBoolean(x["IsCheck ...