游戏蛮牛学习群(纯技术交流,不闲聊):539178957
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

教程分享

关注:780

当前位置:游戏蛮牛 技术专区 教程分享

查看: 155|回复: 0

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

[复制链接]  [移动端链接]
排名
22655
昨日变化
1183

6

主题

18

帖子

58

积分

Rank: 2Rank: 2

UID
292365
好友
1
蛮牛币
312
威望
0
注册时间
2018-8-3
在线时间
16 小时
最后登录
2018-8-15
发表于 7 天前 | 显示全部楼层 |阅读模式

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

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

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中旋转和移动的几个方法


[发帖际遇]: 阿莱克斯 在论坛发帖时没有注意,被小偷偷去了 2 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表