赞
踩
在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类自带的向量
第三种方法:比较麻烦,但是可以模拟产生加速的效果
第五种方法:最简单,省力。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。