using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MyInput : MonoBehaviour
{
//移动方向枚举
enum MoveDir
{
None,//不动
Up,//上8
Down,//下2
Left,//左4
Right,//右6
UL,//左上7
UR,//右上9
DL,//左下1
DR,//右下3
}
//输入按键常量(之后走配置)
const KeyCode INPUT_UP = KeyCode.W;
const KeyCode INPUT_DOWN = KeyCode.S;
const KeyCode INPUT_LEFT = KeyCode.A;
const KeyCode INPUT_RIGHT = KeyCode.D;
//默认移动方向
private MoveDir moveDir = MoveDir.None;
//按压记录
private bool isUpPress = false;
private bool isDownPress = false;
private bool isLeftPress = false;
private bool isRightPress = false;
//是否可以移动
private bool canMove = true;
//右移动
private Vector3 MOVE_RIGHT = new Vector3(1, 0, 0);
//上移动
private Vector3 MOVE_UP = new Vector3(0, 0, 1);
//外部调控速度
public float speed = 2f;
//移动速度向量
private Vector3 move_speed_dir = Vector3.zero;
//移动距离
private Vector3 move_dis = Vector3.zero;
//控制目标
public Transform target;
void Update()
{
CheckInputKey();
CheckMoveDir();
}
void FixedUpdate()
{
CheckMove();
}
//检测输入按键
void CheckInputKey()
{
//检测单一输入
foreach (KeyCode kcode in System.Enum.GetValues(typeof(KeyCode)))
{
if (Input.GetKeyDown(kcode))
{
ChangeKeyPressState(kcode, true);
}
if (Input.GetKeyUp(kcode))
{
ChangeKeyPressState(kcode, false);
}
}
}
//记录按键的按压状态
void ChangeKeyPressState(KeyCode keycode, bool isPress)
{
switch (keycode)
{
case INPUT_UP:
isUpPress = isPress;
break;
case INPUT_DOWN:
isDownPress = isPress;
break;
case INPUT_LEFT:
isLeftPress = isPress;
break;
case INPUT_RIGHT:
isRightPress = isPress;
break;
}
}
//确定移动方向
void CheckMoveDir()
{
//确定方向
if (isUpPress && isLeftPress)
{
moveDir = MoveDir.UL;
}
else if (isUpPress && isRightPress)
{
moveDir = MoveDir.UR;
}
else if (isDownPress && isLeftPress)
{
moveDir = MoveDir.DL;
}
else if (isDownPress && isRightPress)
{
moveDir = MoveDir.DR;
}
else if (isUpPress)
{
moveDir = MoveDir.Up;
}
else if (isDownPress)
{
moveDir = MoveDir.Down;
}
else if (isLeftPress)
{
moveDir = MoveDir.Left;
}
else if (isRightPress)
{
moveDir = MoveDir.Right;
}
else
{
moveDir = MoveDir.None;
}
}
//检测是否可以移动
void CheckMove()
{
//某些情况下可能禁止移动 例如暂停 播放GC等
if (canMove && moveDir != MoveDir.None)
{
PlayerMove(target, speed);
}
}
//移动
void PlayerMove(Transform target, float speed)
{
move_dis = speed * Time.deltaTime * GetSpeedDir();
target.position += move_dis;
}
//速度向量
Vector3 GetSpeedDir()
{
switch (moveDir)
{
case MoveDir.Up:
move_speed_dir = MOVE_UP;
break;
case MoveDir.Down:
move_speed_dir = -MOVE_UP;
break;
case MoveDir.Left:
move_speed_dir = -MOVE_RIGHT;
break;
case MoveDir.Right:
move_speed_dir = MOVE_RIGHT;
break;
case MoveDir.UL:
move_speed_dir = MOVE_UP - MOVE_RIGHT;
break;
case MoveDir.UR:
move_speed_dir = MOVE_UP + MOVE_RIGHT;
break;
case MoveDir.DL:
move_speed_dir = -MOVE_UP - MOVE_RIGHT;
break;
case MoveDir.DR:
move_speed_dir = -MOVE_UP + MOVE_RIGHT;
break;
}
return move_speed_dir.normalized;
}
}