一、创建用户输入类
(一)定义集合信息
1.辅助类 用于存储自定义轴的信息
public class fps_InputAxis
{
public KeyCode positive;//正向
public KeyCode negative;//负向
}
2.自定义键值对集合 键位名称与按键
public Dictionary<string,KeyCode> buttons=new Dictionary<string,KeyCode>();
3.自定义轴集合
public Dictionary<string, fps_InputAxis> axis = new Dictionary<string, fps_InputAxis>();
4.Unity自带的轴名称类
public List<string> unityAxis=new List<string>();
(二)定义添加按键、轴、Unity自带轴的方法
集合为Dictionary,用ContainsKey函数判断是否包含 ;
List集合用Contains判断
1.添加自定义按键方法
private void AddButton(string n,KeyCode k)
{
//若buttons集合中包含此按键名称 则重新附值
if (buttons.ContainsKey(n))
{
buttons[n] = k;
}
else//否则添加按键名称与值
{
buttons.Add(n, k);
}
}
2.添加自定义轴方法
private void AddAxis(string n,KeyCode pk,KeyCode nk)
{
if (axis.ContainsKey(n))
{
axis[n] = new fps_InputAxis() { positive = pk, negative = nk };
}
else
{
axis.Add(n, new fps_InputAxis() { positive = pk, negative = nk });
}
}
3.添加Unity自带轴方法
private void AddUnityAxis(string n)
{
if (!unityAxis.Contains(n))
{
unityAxis.Add(n);
}
}
(三)设置默认按键、轴
private void SetupDefaults(string type="")
{
//若类型为空或为buttons
if (type==""||type=="buttons")
{
//若buttons集合从未进行赋值
if (buttons.Count==0)
{
AddButton("Fire",KeyCode.Mouse0);
AddButton("Reload", KeyCode.R);
AddButton("Jump", KeyCode.Space);
AddButton("Crouch", KeyCode.C);
AddButton("Sprint", KeyCode.LeftShift);
}
}
//若类型为空或为axis
if (type == "" || type == "axis")
{
if (axis.Count==0)
{
AddAxis("Horizontal", KeyCode.W,KeyCode.S);
AddAxis("Vertical", KeyCode.A, KeyCode.D);
}
}
//若类型为空或为unityAxis
if (type == "" || type == "unityAxis")
{
if (unityAxis.Count == 0)
{
AddUnityAxis("Mouse X");
AddUnityAxis("Mouse Y");
AddUnityAxis("Horizontal");
AddUnityAxis("Vertical");
}
}
}
(四)获取输入
1.获取键值输入 分为当持续按下;按下 即执行
Input.GetKey表示持续按下执行
Input.GetKeyDown表示按下执行
public bool GetButton(string _button)
{
if (buttons.ContainsKey(_button))
{
return Input.GetKey(buttons[_button]);
}
return false;
}
public bool GetButtonDown(string _button)
{
if (buttons.ContainsKey(_button))
{
return Input.GetKeyDown(buttons[_button]);
}
return false;
}
2.获取轴输入 分为瞬时和过渡
GetAxis():可以根据获取信息做到立马反向
GetAxisRaw():反向则需要过渡
动画中使用GetAxis(Vertical)与GetAxisRaw(Vertical)来控制人物的前后行走,如果使用前者,再向前走时立马往后走,即按下上箭头立马按下下箭头,其传输的值是由1立马变为-1,但是后者则是由1先变为0,再变为-1
public float GetAxis(string _axis)
{
if (unityAxis.Contains(_axis))
{
return Input.GetAxis(_axis);
}
return 0;
}
public float GetAxisRaw(string _axis)
{
if (axis.ContainsKey(_axis))
{
float val = 0;
if (Input.GetKey(axis[_axis].positive))
return 1;
if (Input.GetKey(axis[_axis].negative))
return -1;
return val;
}else if (unityAxis.Contains(_axis))
{
return Input.GetAxisRaw(_axis);
}
else return 0;
}