同时按住两个键,物体也能正常移动

本文介绍如何在Unity中编写脚本,使游戏物体能够在玩家同时按下多个按键时正常移动,提高游戏控制的灵活性。

把该脚本直接托给要移动的物体即可

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

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值