双键齐按,物体移动

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;
    }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值