unity3d之角色的移动篇 -- 俯视视角下的键盘移动番外篇

这是一个来自unity官网实例的行走脚本,经过我的简单整理后发布在这里,写的非常好,条理分明,一目了然,运行起来很有操作手感。

这个脚本是在animator系统下运行的,所以在写这个脚本前需要先对animator controller进行一些简单的设置:

1. idle状态(默认)和run状态(blend tree,混合了walk和run)

2.定义一个float类型的参数,idle->run(speed>0.1), run->idle(speed<0.1)

3.在run的blend tree里将speed作为过渡动画的参数自动匹配阀值(方法:Compute Thresholds,选择speed)

4.为主角添加刚体和碰撞器

5.勾选Apply Root Montion,使用模型行走的步伐来计算行走距离

using UnityEngine;
using System.Collections;

public class test : MonoBehaviour {

    public Animator anim;
    public Rigidbody rb;

    public float turnSmoothing = 15f;   // 玩家平滑转向的速度
    public float speedDampTime = 0.1f;  // 速度缓冲时间

    void FixedUpdate ()
    {
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");     

        MovementManagement(h, v);
    }

    void MovementManagement (float horizontal, float vertical)
    {
        // 如果横向或纵向按键被按下 也就是说角色处于移动中
        if(horizontal != 0f || vertical != 0f)
        {
            // 设置玩家的旋转 并把速度设为5.5
            Rotating(horizontal, vertical);
            //函数参数解释 anim.SetFloat (当前速度,  最大速度, 加速缓冲时间, 增量时间)
            anim.SetFloat("speed", 5.5f, speedDampTime, Time.deltaTime);
        }
        else
            // 否则 设置角色速度为0
            anim.SetFloat("speed", 0);
    }

    void Rotating (float horizontal, float vertical)
    {
        // 创建角色目标方向的向量
        Vector3 targetDirection = new Vector3(horizontal, 0f, vertical);

        // 创建目标旋转值
        //对应参数分别是 1.四元数看向的目标 2.需要沿着旋转的轴
        Quaternion targetRotation = Quaternion.LookRotation(targetDirection, Vector3.up); 

        // 创建新旋转值 并根据转向速度平滑转至目标旋转值
        Quaternion newRotation = Quaternion.Lerp(rb.rotation, targetRotation, turnSmoothing * Time.deltaTime);

        // 更新刚体旋转值为 新旋转值
        rb.MoveRotation(newRotation);
    }
}

PS:

处理物理效果的代码需要写在FixedUpdate函数内;

完整行走的三要素分别是动画、旋转、移动, 这个实例把动画和旋转分别写在2个方法里,移动使用模型的步伐自动计算;

时间: 2024-11-03 21:45:00

unity3d之角色的移动篇 -- 俯视视角下的键盘移动番外篇的相关文章

unity3d之角色的移动篇 -- 45&#176;视角下的键盘移动

这个知识点我想分成几个章节来写,分别记录不同情况下不同的移动方式. 首先是在45度角摄像机下的键盘控制角色移动(如下图), 先写一个最简单的移动脚本吧(这个脚本也可以用于平常的小测试) 在这之前先得为角色挂上character controller组件,然后获取它. void move(){ //首先获取横纵轴的方向 float h = Input.GetAxis ("Horizontal"); float v = Input.GetAxis("Vertical")

unity3d之角色的移动篇 -- 俯视视角下的鼠标移动

类似DOTA游戏的移动方法, 其余没什么好说的了. using UnityEngine; using System.Collections; public class gogogogo : MonoBehaviour { public float moveSpeed; public Vector3 newPosition; public CharacterController charactercontroller; //public AnimationClip idle; //public A

unity3d之角色的移动篇 -- 追尾视角下的键盘移动

所谓追尾就是只能看到角色的背部,比较典型的有刺客型条,真三国无双一类. 本功能是在aniamtor系统下完成的,在完成这个行走效果需要先准备以下几个步骤:1.拖入idle动作和blend tree,blend tree下混合左跑,直线跑,右跑3个动作. 2.定义一个float类型的变量Speed作为动作的切换条件: idle ->blend tree(speed>0.1), blend tree -> idle (speed<0.1) 3.为混合树的3个动作设置一个float类型的

[uboot] (番外篇)uboot 驱动模型(转)重要

[uboot] uboot流程系列:[project X] tiny210(s5pv210)上电启动流程(BL0-BL2)[project X] tiny210(s5pv210)从存储设备加载代码到DDR[uboot] (第一章)uboot流程——概述[uboot] (第二章)uboot流程——uboot-spl编译流程[uboot] (第三章)uboot流程——uboot-spl代码流程[uboot] (第四章)uboot流程——uboot编译流程[uboot] (第五章)uboot流程——u

(apache+tomcat集群+memcached番外篇)单台tomcat的session信息的2种持久化方式

为什么要实现搭建tomcat集群环境呢?主要因为单个tomcat无论从吞吐量和并发数上,会达到一定的极限.如果访问量超过单个tomcat的承受能力的话,tomcat一般要么拒绝提供服务,要么直接宕掉.所以,必须要依靠tomcat集群技术.举个最简单的例子,拿"送快件"比喻,如果一个人,5分钟送一件,一小时之内,送10个,一个人完全能胜任这项工作.假设现在到了双十一,要求1小时,送100个, 那怎么办?只能安排更多的人加入"送快件"这项工作中来.这其实和集群一个道理.

【喵&quot;的Android之路】【番外篇】有关于null的一些知识点

[喵"的Android之路][番外篇]有关于null的一些知识点 1.首先,到底什么是null? null是Java中的一个关键字,用于表示一个空对象引用,但其本身并不是任何类型也不是属于任何对象.因此,下面的做法是错误的: int a = null; 但: Object obj = null; 是可以的,因为null表示Object类型的一个空对象引用,符合其用意. [注1]引用类型使用null声明对象变量后,无法使用该变量访问对象的成员.例如上述obj对象如果使用obj.toString()

可视化(番外篇)

本篇主要介绍如何在SWT下构建一个应用,如何安装SWT Designer并破解已进行SWT的可视化编程,Display以及Shell为何物.有何用,SWT中的常用组件.面板容器以及事件模型等. 1.可视化环境搭建(SWT Designer): (1).首先下载SWT Designer插件包SWT Designer 6.9.5 for Eclipse.rar: (2).将解压好的插件包extplugins\swt\eclipse下的features和plugins导入Myeclipse的dropi

《Mycat学习笔记》 番外篇一.客户端使用latin1字符集,后端MySQL为UTF8字符集,MyCat日志分析。

其实这个番外篇比较无聊——即客户端为lantin字符集,后面MySQL为U8字符集,MyCat在中间到底会起什么作用. 再说下本次验证的环境: Mac OS 10.11.2 MySQL 5.6 MyCat 1.5 OK,开始我们的验证工作. 1) 由于数据库与操作系统已被默认设置为U8编码,计划通过修改Mysql  “character_set_client” 参数调整客户端字符集配置进行验证. 关于MYSQL字符集较全面的介绍,请参考 <mysql_query("set names gb

【喵&quot;的Android之路】【番外篇】关于==和equals

[喵"的Android之路][番外篇]关于==和equals 在实际的编程当中,经常会使用==和equals来判断变量是否相同.但是这两种比较方式也常常让人搞得云里雾里摸不着头脑.下面是我个人做的总结,希望能起到拨云见日的作用. [讲前普及] 请阅读 [喵"的Android之路][基础篇(一)][Java面向对象基础]数据类型与运算符 了解Java基本数据类型和引用数据类型 1."=="运算符 通俗点讲,==运算符比较的是两个变量在栈中的内容是否相同. 以a ==