zoukankan      html  css  js  c++  java
  • unity 第三人称控制移动

    键盘WSAD控制行走

    最简单的就是使用Input.GetKeyDown()函数接收键盘
    值输入,但在这里还有更简单的方法去实现。

    利用Input.GetAxis()来获取坐标轴的改变。在InputManager中有许多参数,对应目前的需求只要HorizontalVertical这两个,前者对应坐标系的左右,后者对应前后。

    float H = Input.GetAxis("Horizontal");
    float V = Input.GetAxis("Vertical");
    //Debug.Log("H: " + H + " V: " + V);
    Vector3 direction = H * m_transform.right + V * m_transform.forward;
    Vector3 NewPosition = m_rigidbody.position + direction;
    m_rigidbody.MovePosition(NewPosition);
    

    摄像机固定在主角的后上方

    代码需要绑定在主摄像机上,基本思想就是在Update()中检测主角的坐标轴,然后根据主角的坐标算出摄像机应该所在的位置,在利用LookAt()函数使摄像机角度转向主角。

    这里为了使摄像机的转向趋于平滑,可以使用Lerp()函数。

    Vector3 NextPos = target.forward * -1 * distance + target.up * high + target.position;
    m_trans.position = Vector3.Lerp(this.transform.position, NextPos, smoothSpeed);     // 平滑跟进
    m_trans.LookAt(target);
    

    鼠标控制主角在水平方向旋转

    目前采用的方法是Input.GetAxis()来获取鼠标的Mouse X参数值,再配合Rotate()函数可以实现旋转效果。

    float h = 10.0f * Input.GetAxis("Mouse X");
    transform.Rotate(0, h, 0);
    

    添加鼠标控制摄像机上下旋转功能

    想要添加这个功能,我差不多要把前面的代码全部重构一遍。因为之前的代码为了让摄像机跟随人物,我使用了LookAt()函数;而左右旋转只是主角的操作,摄像机只需要跟随就好。

    但涉及摄像机上下旋转之时,我们不可能也给主角添加一个上下旋转的功能。LookAt()是不可以使用的了,但为了让摄像机跟随主角,我们需要用其他方式实现同样的功能。

    我在网上看到一个很巧妙的解决方式,利用的是三角函数:

    // 通过camera的Y轴旋转角度(即左右偏转角)及确定的直角斜边distance,计算直角三角形的两条直角边(分别对应x, z的后移量)
    // 该方法可保证相机位置永远在player后方,但相机镜头需要对准player或与之朝向一致
    float angle = m_transform.eulerAngles.y;
    
    float distance_X = distance * Mathf.Sin(angle * Mathf.PI / 180);
    float distance_Z = distance * Mathf.Cos(angle * Mathf.PI / 180);
    
    Vector3 newPosition = new Vector3(player.position.x - distance_X, player.position.y + high, player.position.z - distance_Z);
    // 平滑移动
    m_transform.position = Vector3.Lerp(m_transform.position, newPosition, smoothMoveTime);
    

    此处有两个坑需要注意:
    其一,用这种计算的方式找到位置,对性能消耗可能比较大;
    其二,就这几天上网搜索的结果看,简单的移动有太多方法了,而且这些方法还涉及到性能的问题,emmm,以后填吧。

    上面说到需要借助camera的Y偏转角来实现跟随,其实也可以通过player的偏转角来实现。两者间的性能差距我看不出来。

    下面是利用GetAxis()来获得鼠标的偏移量,从而实现偏转。

    float Mouse_X = Input.GetAxis("Mouse X") * smoothRotateAmount;
    float Mouse_Y = Input.GetAxis("Mouse Y") * smoothRotateAmount;
    
    rotation.x -= Mouse_Y;
    rotation.y += Mouse_X;   // 使之与鼠标移动方向一致
    rotation.z = 0;          // 固定z轴
    
    //m_transform.Rotate(rotation, Space.Self);     // Rotate()会产生天翻地覆的效果,原因不知,猜测是它太快了
    m_transform.eulerAngles = rotation;             // 会有卡顿现象,可能性能消耗大,但是在本项目中离奇有用
    
    // 放在PlayController上比较好,因为不能基于camera来计算偏转角
    //float horizontal = smoothRotateAmount * Input.GetAxis("Mouse X");
    //player.eulerAngles = new Vector3(0, horizontal, 0);
    

    这里有坑,已经踩了很久了。暂时先这样,等下次再遇到的时候解决,附上一篇还看得不是很懂的文章:Unity学习笔记10——旋转(四元数和欧拉角)

  • 相关阅读:
    dljd_008_jdbc中调用Statement的execute()执行DQL,DDL,DML
    dljd_007_jdbc编程中的statement执行DML/DDL
    【数据结构】可持久化线段树
    【数据结构】可持久化并查集
    【图论】TarjanLCA算法
    【图论】KruskalMST算法
    【基础】标准模板
    【数学】位运算
    【数据结构】Trie
    【数据结构】线段树(名次树)
  • 原文地址:https://www.cnblogs.com/ChanWunsam/p/10018315.html
Copyright © 2011-2022 走看看