这里素材全是网上找的。

教程看这里:

[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. webrtc--AudioProcessing的使用

    1.AudioProcessing的实例化和配置: AudioProcessing* apm = AudioProcessing::Create(0); apm->level_estimator ...

  2. Codeforces Round #368 (Div. 2) B. Bakery (模拟)

    Bakery 题目链接: http://codeforces.com/contest/707/problem/B Description Masha wants to open her own bak ...

  3. ESB 客户端调用 处理类

    esb package com.isoftstone.synchronize.entrance; import java.io.File; import java.text.SimpleDateFor ...

  4. 常见的mongo shell命令

    启动mongo shell 在windows下,双击mongo.exe可以启动mongo shell 查询库.表及选择库 查询所有库命令: show dbs 应用某一个db use jxs_datab ...

  5. hdu 5655 CA Loves Stick

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

  6. IOC知识

    1.两个基本概念 IOC(Inversion of Control ):反转控制,即将控制权反转出去. DI(Dependency Injection):依赖注入,根据依赖关系进行注入. DI是实现I ...

  7. DNS原理及其解析过程(转)

    转自(http://369369.blog.51cto.com/319630/812889) 网络通讯大部分是基于TCP/IP的,而TCP/IP是基于IP地址的,所以计算机在网络上进行通讯时只能识别如 ...

  8. C语言中字符数组和字符串指针分析

    这几天搞Unix上的C程序,里面用到了很多字符数组和字符串指针,我记得在学完C语言后相当一段时间里,对指针这个东西还是模模糊糊,后来工作也没怎么 用到过C,虽然网上这类的文章也有很多,还是决定自己在这 ...

  9. react native 网络get请求方式参数不可为undefined或null

    react native 网络get请求方式参数不可为undefined(为空的话默认变为)或null 错误写法: export function addToCartAction(isRefreshi ...

  10. iOS摄像头和相册-UIImagePickerController-浅析

    转载自:http://blog.sina.com.cn/s/blog_7b9d64af0101cfd9.html 在一些应用中,我们需要用到iOS设备的摄像头进行拍照,视频.并且从相册中选取我们需要的 ...