Unity 之第一人称无重力控制器

本文介绍了在Unity中创建第一人称无重力控制器时遇到的相机穿墙问题及其解决方法。通过分析,发现直接改变物体transform值导致物体不遵循物理学运动,从而相机穿越墙壁。解决方案是修改Unity的第一人称控制器代码,利用AddForce施加力来移动物体,并调整StickToGroundHelper方法,实现无重力效果。同时提到了视角旋转速度的调整和防止穿墙的其他措施。
摘要由CSDN通过智能技术生成

最近在项目中遇到一个需求,要求软件中人物的操作为第一人称视角,并且不包含重力。要求用户可以自定义重力。

在经过一番思考之后,我想到了一种解决方案,那就是通过控制相机物体的transform属性,来对相机进行移动。至于相机的视角,我参考了unity自带的第一人称视角控制器的代码来实现。经过一番折腾是实现了,但是在测试过程中发现了一个问题。
那就是

在移动过程中,相机穿越了墙壁!!!!

就算给相机物体添加一个立方体gameobject作为父物体,并且给该父物体添加刚体,也还是没有用。墙壁的碰撞器虽然会触发碰撞事件。但是并没有作用,相机还是会穿越墙壁。这样完全不符合实际的使用需求。经过一番思考,猜测,验证。并参考了系统的FirstPersonController文件,终于找到了原因。原因是对于相机的移动,我是直接了对物体的transform值进行更改来使物体移动,这样我虽然给物体添加了刚体,但是物体并有进行物理学运动,因此物体不会遵循物理学运动现象。

知道了原因,那么就好结局了,既然是因为我对物体进行移动的操作方式有问题,那就换一种操作方式。unity有提供定义好的第一人称控制器,那我去修改一下控制器的代码,变成我需要的代码即可。

在研究了unity自带的控制器代码之后,我发现unity对于移动物体的方式是,对需要移动的物体施加力来进行移动。通过获取物体的rigidbody属性,然后通过AddForce的方式,来对物体进行移动。并且找到了控制器是通过StickToGroundHelper方法将物体固定在地板上,原理是物体向下发射一条射线,如果射线的长度不为0,物体会向下运动。那么是要将StickToGroundHelper方法去除,剩下的代码进行保留,那么就可以实现最基本的无重力第一人称视角。再通过自定义按键,给物体添加向上或者向下的力,来控制物体的向上或者向下运动,就能实现第一人称无重力控制器。

最终的实现代码如下:


    public Transform target; 
    private float sliderMouseValue = 0.5f;

    public bool isScaleFabric = false;

    public float keyboardSpeed = 2f;
    [Serializable]
    public class MovementSettings
    {
        public float ForwardSpeed = 2.0f;   // Speed when walking forward
        public float BackwardSpeed = 2.0f;  // Speed when walking backwards
      
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值