这里素材全是网上找的。

教程看这里:

[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. C#实现office文档转换为PDF或xps的一些方法( 转)

    源博客http://blog.csdn.net/kable999/article/details/4786654 代码支持任意office格式 需要安装office 2007 还有一个office20 ...

  2. hdu 5655 CA Loves Stick

    CA Loves Stick Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) ...

  3. python svn

    svn 0.3.36 Downloads ↓ Intuitive Subversion wrapper. Introduction svn is a simple Subversion library ...

  4. POJ1014Dividing(DP)

    http://poj.org/problem?id=1014 最简单之多重背包 #include <map> #include <set> #include <stack ...

  5. C# JackLib系列之如何获取地球上两经纬度坐标点间的距离

    获取地球上两经纬度坐标点间的距离,利用[大圆距离公式]   A diagram illustrating great-circle distance (drawn in red) between tw ...

  6. JedisPool使用原理和源代码

    1,JedisPool的使用 <!-- 连接池的配置信息 --><beanid="jedisConfig"class="redis.clients.je ...

  7. Gartner: Hype Cycle for Emerging Technologies-2012 (技术成熟度曲线) [转]

      英文稿: The “Hype Cycle for Emerging Technologies” report is the longest-running annual Hype Cycle, p ...

  8. 4.接口隔离原则(Interface Segregation Principle)

    1.定义 客户端不应该依赖它不需要的接口: 一个类对另一个类的依赖应该建立在最小的接口上. 2.定义解读 定义包含三层含义: 一个类对另一个类的依赖应该建立在最小的接口上: 一个接口代表一个角色,不应 ...

  9. 分布式文件系统FastDFS设计原理

    原文地址: http://blog.chinaunix.net/uid-20196318-id-4058561.html FastDFS是一个开源的轻量级分布式文件系统,由跟踪服务器(tracker ...

  10. Trapping Messages Sent to an Application

    http://www.delphicorner.f9.co.uk/articles/apps7.htm Trapping Messages Sent to an Application I wrote ...