Unity3d_FPS游戏(人物控制篇)

在FPS游戏中,人物控制十分重要。人物控制包括,人物行走,跳跃,人物跟随镜头旋转,人物的右手(持枪部位)根据鼠标旋转而旋转。

首先,我们来看看如何使人物进行移动,在这里我使用了Sphere和Capsule作为身体,将摄像头放在Character的对象下,位置放在身体里面。


人物移动有许许多多多的方法,这里我简单介绍几种。

我们统一设定移动的速度为mMoveSpeed,移动的距离distance为Time.deltatime*mMoveSpeed.

第一种:通过transform.Translate(new Vector3(X,X,X))

第一种方法实现所有的行走模式,之后的方法只用向前(A)作为演示。

这种方法最简单,也最普遍

例如向前走

if(Input.GetKey(KeyCode.W))

{

transform.Translate(new Vector3(0,0,distance);

return true;

}

 // 后
        if (Input.GetKey(KeyCode.S)) {
            transform.Translate(new Vector3(0, 0, -distance));
            return true;
        }


        // 左
        if (Input.GetKey(KeyCode.A)) {
           transform.Translate(new Vector3(-distance, 0, 0));
            return true;
        }


        // 右
        if (Input.GetKey(KeyCode.D)) {
            transform.Translate(new Vector3(distance, 0, 0));
            return true;
        }

//左前方移动
        if (Input.GetKey(KeyCode.W) && Input.GetKey(KeyCode.A))
        {
            transform.Translate(new Vector3(-distance, 0, distance));
            return true;
        }
        //右前方
        if (Input.GetKey(KeyCode.W) && Input.GetKey(KeyCode.D))
        {
            transform.Translate(new Vector3(distance,0,distance));
            return true;
        }
        //左下方
        if(Input.GetKey(KeyCode.A)&&Input.GetKey(KeyCode.S))
        {
            transform.Translate(new Vector3(-distance,0,-distance));
            return true;
        }
        //右下方
        if(Input.GetKey(KeyCode.S)&&Input.GetKey(KeyCode.D))
        {
            transform.Translate(new Vector3(distance,0,-distance));
            return true;
        }
        //前后不动
        if(Input.GetKey(KeyCode.W)&&Input.GetKey(KeyCode.S))
        {
            return true;
        }
        //左右不动
        if(Input.GetKey(KeyCode.A)&&Input.GetKey(KeyCode.D))
        {
            return true;
        }
       这里实现了,总共八个方向的移动,并且在同时按住前进和后退,以及向左和向右键,保持不动,大家可以对照自己玩过的FPS游戏,是不是所有的移动方法都已经包括了。

第二种方法:

使用系统给的Vector.forward等方法。

例如

//向前

if(XXXX)

{

     transform.Translate(Vector.forward*distance);

return true;

}

其他同样的道理,向右是Vector.right,向上时Vector.up.

Vector没有向后和向左,但很简单,-Vector.forward 就是向后,向左也一样,加个符号。

Vector.forward实际上就是(0,0,1),是一个Z轴上长度为1的向量,是系统给定的。

第三种方法:

以上两种方法,移动的速度都是mMoveSpeed,距离都是distance,可以说移动的速度是不变的(这里的Time.deltaTime会有细微的变化)

第三种方法事实上有一种加速的效果,就是速度从慢到快

例如

//向前

if(XXX)

{

transform.Translate(Input.GetAxis("Horizontal")*distance);

return true;

};

这段代码最重要的就是Input.GetAxis("Horizontal")这个方法。

这个方法用于获得键盘输入在当前X轴上的变化量。



在Edit->project Setting->Input中修改和查看

它以你当前所在X轴为中心,当你按住A键,人物向左移动,Input.GetAxis("Horizontal")返回的是移动的量,从0到-1,D键向右,value从0到1.

所以,当我们按住向左的A键时,速度是从0*distance,上升到1*distance的,所以产生了一个加速效果。

第四种方法:

        // 前
        if (Input.GetKey(KeyCode.W)) {
          float x = Mathf.Sin(transform.eulerAngles.y * Mathf.Deg2Rad) * distance;
            float z = Mathf.Cos(transform.eulerAngles.y * Mathf.Deg2Rad) * distance;
            transform.Translate(new Vector3(x,0,z), Space.World);
            return true;
        }

这是网上一个教材的源代码,这种实现方法我也看不太懂,但的确可以实现。原理还是通过transform.Translate。

至于为什么用正弦函数用来赋值给X不清楚原作者的用意。不排除像第三种方法那样实现了某种特殊的加速效果。

第五种也是最简单的一种方法:

private Vector3 move = Vector3.zero;

move = new Vector3(Input.GetAxis("Horizontal"),0,Input.GetAxis("Vertical"));

transform.Translate(move*distance);

使用move变量时时获取物体在X轴和Z轴上的变化量,通过transform.Translate函数时时变化。

总结:

第一种方法:最自由,可以根据自己的意愿来修改任意的行走速度

第二种方法:与第一种类似,只是使用了Vector类自带的向量

第三种方法:比较麻烦,但是可以模拟产生加速的效果

第五种方法:最简单,省力。



  • 7
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值