找回密码
 注册帐号

扫一扫,访问微社区

入门教程 【Unity入门实例教程】第五章 人物移动及平滑旋转

3
回复
1289
查看
[ 复制链接 ]
排名
21326
昨日变化

6

主题

18

帖子

70

积分

Rank: 2Rank: 2

UID
292365
好友
1
蛮牛币
589
威望
0
注册时间
2018-8-3
在线时间
18 小时
最后登录
2018-9-26
2018-8-9 16:38:07 显示全部楼层 阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 阿莱克斯 于 2018-8-9 16:40 编辑

关于人物移动,用transform.translate就可以轻松实现,现在,我们想要他一边走还能一边转(大约就是像手游那样平滑的手感)
就用到了四元数旋转。原理太复杂,不解释,本章节只放代码
特别注意update()里的那句if,因为h与v是GetAxias(),它的值从0到1,是连续量。问题就出在这里,当键盘抬起时,h和v会从原来的值逐渐回到0所以角度也会转回去别忘了添加刚体组件
[C#] 纯文本查看 复制代码
using UnityEngine;
using System.Collections;
using System.Linq;
public class Walk_Controller : MonoBehaviour
{
    public float speed = 3.0f;            //玩家移动速度

    Vector3 movement;                   // 玩家移动临时变量
    Animator anim;                      //玩家身上动画控制器
    Rigidbody playerRigidbody;          //玩家身上刚体组件


    void Awake()
    {
        // 获取玩家身上各组件
        anim = GetComponent<Animator>();
        playerRigidbody = GetComponent<Rigidbody>();
    }

    void Update()
    {
        //每帧获取玩家输入的虚拟轴,水平垂直值
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");

        // 根据水平垂直输入量移动玩家
        Move(h, v);

        //旋转玩家
        
        //特别注意下面这个地方,这一句我想了一个晚上
        //因为h与v是GetAxias(),它的值从0到1,是连续量
        //问题就出在这里,当键盘抬起时,h和v会从原来的值逐渐回到0
        //所以角度也会转回去
        if(h!=0||v!=0)  
        {
            Rotating(h, v);
        }

        // 根据输入的值播放相应状态动画
        Animating(h, v);
    }

    void Move(float h, float v)
    {
        //根据输入的虚拟轴值设置变量
        movement.Set(h, 0f, v);

        // 单位化位移向量并根据速度得到需要移动的向量
        movement = movement.normalized * speed * Time.deltaTime;

        // 根据移动向量 移动玩家到相应位置
        playerRigidbody.MovePosition(transform.position + movement);
    }

    void Animating(float h, float v)
    {
        // 获取是否有唯一的bool
        bool walking = (h != 0f) || (v != 0f);

        //设置对应状态机的值
        anim.SetBool("IsWalking", walking);
    }
    
    void Rotating(float hor, float ver)
     {
         //获取方向
         Vector3 dir = new Vector3(hor, 0, ver);
         //将方向转换为四元数
         Quaternion quaDir = Quaternion.LookRotation(dir, Vector3.up);
        //缓慢转动到目标点
        Quaternion newRotation = Quaternion.Lerp(transform.rotation, quaDir, Time.deltaTime * 3.0f);
        // 更新刚体旋转值为 新旋转值
         playerRigidbody.MoveRotation(newRotation);
    }
}


参考资料:【Unity技巧】四元数(Quaternion)和旋转
       unity中旋转和移动的几个方法


回复

使用道具 举报

排名
39857
昨日变化

0

主题

57

帖子

79

积分

Rank: 2Rank: 2

UID
286498
好友
0
蛮牛币
48
威望
0
注册时间
2018-6-20
在线时间
16 小时
最后登录
2019-5-10
2018-9-4 14:04:44 显示全部楼层
看起来确实有点难啊
回复 支持 反对

使用道具 举报

3偶尔光临
154/300
排名
15023
昨日变化
1

0

主题

60

帖子

154

积分

Rank: 3Rank: 3Rank: 3

UID
190426
好友
0
蛮牛币
44
威望
0
注册时间
2016-12-7
在线时间
42 小时
最后登录
2019-2-8
2018-9-19 15:13:58 显示全部楼层
感谢分享
回复

使用道具 举报

排名
23062
昨日变化

0

主题

63

帖子

99

积分

Rank: 2Rank: 2

UID
143888
好友
0
蛮牛币
123
威望
0
注册时间
2016-3-29
在线时间
18 小时
最后登录
2018-9-27
2018-9-27 06:09:22 显示全部楼层
6666666666666666666
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则