美文网首页
初学Unity的第一个坑 CharacterController

初学Unity的第一个坑 CharacterController

作者: 涛涛涛涛涛涛涛涛涛 | 来源:发表于2017-12-05 22:41 被阅读0次

    这几天一直加班,回来也只是看看视频,都没心情整理资料了。。

    =============================================================

    好,先把第一个坑写上来

    一开始边看视频边照着写代码,结果没注意看,在角色移动的代码上把SimpleMove写成了Move,爬坡以后由于视角问题并没有发现角色悬空了,只是看到角色可以穿透一些比较矮的围栏。 (花了2个小时在网上找资料,自己写重力代码。。。此处省略500字)后来才发现是没有重力效果,再反复查看视频才发现代码写错了。

    那么SimpleMove和Move到底有什么区别呢?

    先看看官方解释

    SimpleMove

    Moves the character with speed.

    Velocity along the y-axis is ignored. Speed is in meters/s. Gravity is automatically applied. Returns if the character is grounded. It is recommended that you make only one call to Move or SimpleMove per frame.

    =============================================================

    Move

    A more complex move function taking absolute movement deltas.

    Attempts to move the controller by motion, the motion will only be constrained by collisions. It will slide along colliders. CollisionFlags is the summary of collisions that occurred during the Move. This function does not apply any gravity.

    看不懂没关系,我们有Google翻译!!

    SimpleMove

    以速度移动角色。

    沿y轴的速度被忽略。 速度以米/秒为单位。 重力是自动应用的。 如果角色接地,则返回。 建议您只对每帧的Move或SimpleMove进行一次调用。

    ==============================================================

    Move

    一个更复杂的移动功能,绝对移动三角洲。

    试图通过运动来移动控制器,运动只会受到碰撞的限制。 它会沿着对撞机滑动。 CollisionFlags是移动过程中发生的碰撞概要。 此功能不适用于任何重力。

    直接看字面意思可以得到:

    SimpleMove

    1、SimpleMove不受Y轴速度影响,只有X轴和Z轴方向的有效,且自带重力效果。

    2、SimpleMove有返回值(BOOL类型),角色接触地面则返回true,否则返回false。

    Move

    1、Move可以理解为对一个角色的绝对控制,意思就是在XYZ轴上都不给值的时候,角色不管在什么位置都会静止不动,唯一会影响移动的就是各种障碍物的刚体碰撞,他会沿着刚体滑动,所以说这个是没有自带重力效果的。

    2、Move方法有返回值(CollisionFlags对象),可以返回一些角色与任何物体碰撞的信息。

    看到这里,这个坑应该算是填上啦!

    所以说各位跟我一样的初学的朋友们,看视频要仔细咯!!

    =============================================================

    另外在填坑的过程中产生了一些疑问也记录一下吧~

    上面有提到我自己查资料,自己写重力代码,发现一个问题,网上很多兄弟都是用以角色为起点,放出一条垂直向下的,突出角色的,突出长度为0.1的射线(这里也把我坑惨了,射线起点是在角色的中心,也就是一个半径为1的球形角色,要发出一条突出角色且突出长度为0.1的射线,则射线的长度应该是1.1),那么问题来了,射线是垂直向下的,角色又是一个球体,那么在不规则的地形中,球在爬坡时,射线会射不到地面

    但是角色是可以在这个地形上停留的,也就是说,角色应该是已经落地了

    但是由于射线并没有被挡住,那么就会一直在执行向下的降落的代码,由于我写的重力代码是有重力加速度的,也就是下落速度是变化的,那么这样就会造成下落速度不清零。

    我想出来的解决办法是

    1、如果能获取到球与地面碰撞的相对于球的位置,那么用球中心向该碰撞点的方向发射一条射线x。

    2、获取到角色的爬坡角度,也就是可以在多大的角度上停留。

    3、创建一条垂直向下的射线y,计算射线x和射线y的夹角,大于爬坡角度的话角色还会继续下落,反之则角色可以停留在该地形上,则判断已经落地了。

    这是我想的解决办法,但是水平不够,暂时还是没办法写出代码来。

    ===============================================================

    以上就是我遇到的问题啦,如果有小伙伴们发现上面有任何错误,请您给我留个言,我会尽快修正,免得误人子弟,谢谢。

    关于最后的问题,有大神懂的也请帮帮忙,发个代码上来,大家互相学习!!谢谢啦!!!

    相关文章

      网友评论

          本文标题:初学Unity的第一个坑 CharacterController

          本文链接:https://www.haomeiwen.com/subject/nbubbxtx.html