InputManage与GetKey(),GetButton(),GetAxis()的联系,和三个方法详细说明!

目录

InputMagager

添加、删除和复制虚拟轴

InputManager面板参数解释

按下 GetButton 按键执行流程(自己推理),有错请指正,谢谢!

GeyKey()方法

public static bool GetKey (string name);

public static bool GetKey (KeyCode key);

public static bool GetButton (string buttonName);

public static float GetAxis (string axisName);

深入解析:


InputMagager

解释:在Input Manager中你可以自定义输入轴及其相关的操作,什么意思呢,简单的来说就是你可以自己定义操作按键,实现游戏对象的跑跳。

Input Manager支持下列的控件(操作形式)

  1. 指物理键盘上的任何键,例如 W、Shift 键或空格键。
  2. 按钮指物理控制器(例如游戏手柄)上的任何按钮,例如 Xbox One 控制器上的 X 按钮
  3. 虚拟轴被映射到控件(例如按钮或键)。用户激活控件后,该轴会收到 [–1..1] 范围中的某个值。您可以将该值用于您的脚本
添加、删除和复制虚拟轴

要添加虚拟轴,请增加 Size 字段中的数值。这样就会在列表底部创建一个新轴。新轴将复制列表中前一个轴的属性。

要删除虚拟轴,可执行以下操作之一:

  • 减小 Size 字段中的数值。这样将删除列表中的最后一个轴。
  • 右键单击任何轴,然后选择 Delete Array Element
    注意:无法撤消此操作。

要复制虚拟轴,请右键单击该轴并选择 Duplicate Array Element

InputManager面板参数解释

参数解释:

  • Name:轴名,该String将可作为 Input.GetAxis() Input.GetButton() 的传入参数。轴名可以自定义,跟脚本对上即可。
  • Descriptive Name, Descriptive Negative Name 弃用
  • Negative Button, Positive Button:用于分别沿负向和正向推动轴的控件。这些控件可以是键盘上的键,也可以是游戏杆或鼠标上的按钮。一般配合 Input.GetAxis() 方法使用,参数值由unity定义,可填入的值,参考手册Unity - Manual: Input Manager,或者搜索InputManager.
  • Alt Negative Button,Alt Positive Button: 备用按键,按钮。
  • Gravity: 用于Input.GetAxis()方法归0的变化过程,参数设置越大,GetAxis 函数归0越快
  • Dead: 用于轴游戏手柄的摇杆或扳机等),不希望感受到手柄轻微摇晃的影响,设置这个值为忽略手柄摇晃的范围。
  • Sensitivity:用于Input.GetAxis()方法增减值的变化过程,参数设置越大,GetAxis 函数去到1或 -1越快
  • Snap:同时按下正负按钮时值归0
  • type: 用于轴游戏手柄的摇杆或扳机等),还没用过
  • Axis: 鼠标移动的轴。还没用过
  • JoyNum: 用于轴游戏手柄的摇杆或扳机等),还没用过
按下 GetButton 按键执行流程(自己推理),有错请指正,谢谢!

GeyKey()方法

 需要讲解两个方法重载,才能理解这个方法!

public static bool GetKey (string name);

解释:在用户按下 name 标识的键时返回 true。

name 参数能填什么? unity 规定了键盘中的每个键都有一个字符串表示,比如 左方向键用 “left” 表示,所以可输入“left” 表示按下左方向键时传递参数给GetKey函数。

字母键

a, b, c…

数字键

1, 2, 3…

箭头键

up, down, left, right

小键盘按键

[1], [2], [3], [+], [equals]…

修饰键

right shift, left shift, right ctrl, left ctrl, right alt, left alt, right cmd, left cmd

特殊键

backspace, tab, return, escape, space, delete, enter, insert, home, end, page up, page down

功能键

f1, f2, f3…

实际运用:

if (Input.GetKey("left")) 
        {
            transform.Translate(movement * Time.deltaTime);
        }

注意:GetKey 返回bool ,InputManager中定义了这个键,使用(Input.GetKey("left"),当左方向键被按下,就返回 true

注意:InputManager中的Negative button 和 Positive Button 是双向控制,在GetAixs 方法中才有作用。

public static bool GetKey (KeyCode key);

解释:在用户按下 key KeyCode 枚举参数标识的键时返回 true。

API中查 KeyCode,能查出所有枚举。

实际运用:

  void Update()
    {
        if (Input.GetKey(KeyCode.A)) 
        {
            transform.Translate(movement * Time.deltaTime);
        }
    }

public static bool GetButton (string buttonName);

解释:用于检测 InputManager 定义的轴是否被输入,返回bool

参数说明:

传递一个InputManager 中的 Name 值

实际运用:

void Update()
    {
        Vector3 movement = new Vector3(0, 1, 0);
        if (Input.GetButton("jump")) 
        {
            transform.Translate(movement * Time.deltaTime);
        }
    }

public static float GetAxis (string axisName);

解释:返回由 axisName 标识的虚拟轴的值。对于键盘和游戏杆输入设备,该值将处于 -1...1 的范围内。

对于游戏杆的水平轴,值为 1 表示游戏杆向右推到底,值为 -1 表示游戏杆向左推到底;值为 0 表示游戏杆处于中性位置。

将轴映射到鼠标不会在 -1...1 的范围内。此时,该值为当前鼠标增量乘以轴灵敏度。通常,正值表示鼠标向右/向下移动,负值表示鼠标向左/向上移动。

参数说明:

实际应用:

void Update()
    {

        float speedMovement = Input.GetAxis("Horizontal");
        Vector3 movement = new Vector3(speedMovement, 0, 0);
        {
            transform.Translate(movement * Time.deltaTime);
        }
        Debug.Log(speedMovement);
    }
深入解析:

按下按键时,方法返回值逐渐增加或减少到 1或-1,这个逐渐变化的过程由什么决定?

答:Unity中的输入系统会根据玩家的输入设备和设置的参数(例如Input Manager中的Gravity和Sensitivity)来决定输入值的变化速度和平滑程度。增加的速率受到Input Manager中的Sensitivity(灵敏度)参数的影响。Gravity参数定义了轴值从非零状态过渡到零状态的速度。较大的Gravity值会使值更快地回到零。

Input.GetAxisRaw("Horizontal") 则没有平滑过程,直接返回整数值。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
import java.awt.BorderLayout; import java.awt.Container; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.InputEvent; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import javax.swing.BorderFactory; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.KeyStroke; import javax.swing.ScrollPaneConstants; import javax.swing.SwingConstants; public class JNotePadUI extends JFrame { private JMenuItem menuOpen; private JMenuItem menuSave; private JMenuItem menuSaveAs; private JMenuItem menuClose; private JMenu editMenu; private JMenuItem menuCut; private JMenuItem menuCopy; private JMenuItem menuPaste; private JMenuItem menuAbout; private JTextArea textArea; private JLabel stateBar; private JFileChooser fileChooser; private JPopupMenu popUpMenu; public JNotePadUI() { super("新建文本文件"); setUpUIComponent(); setUpEventListener(); setVisible(true); } private void setUpUIComponent() { setSize(640, 480); // 菜单栏 JMenuBar menuBar = new JMenuBar(); // 设置「文件」菜单 JMenu fileMenu = new JMenu("文件"); menuOpen = new JMenuItem("打开"); // 快捷键设置 menuOpen.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_O, InputEvent.CTRL_MASK)); menuSave = new JMenuItem("保存"); menuSave.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_S, InputEvent.CTRL_MASK)); menuSaveAs = new JMenuItem("另存为"); menuClose = new JMenuItem("关闭"); menuClose.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_Q, InputEvent.CTRL_MASK)); fileMenu.add(menuOpen); fileMenu.addSeparator(); // 分隔线 fileMenu.add(menuSave); fileMenu.add(menuSaveAs); fileMenu.addSeparator(); // 分隔线 fileMenu.add(menuClose); // 设置「编辑」菜单 JMenu editMenu = new JMenu("编辑"); menuCut = new JMenuItem("剪切"); menuCut.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_MASK)); menuCopy = new JMenuItem("复制"); menuCopy.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK)); menuPaste = new JMenuItem("粘贴"); menuPaste.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_MASK)); editMenu.add(menuCut); editMenu.add(menuCopy); editMenu.add(menuPaste); // 设置「关于」菜单 JMenu aboutMenu = new JMenu("关于"); menuAbout = new JMenuItem("关于JNotePad"); aboutMenu.add(menuAbout); menuBar.add(fileMenu); menuBar.add(editMenu); menuBar.add(aboutMenu); setJMenuBar(menuBar); // 文字编辑区域 textArea = new JTextArea(); textArea.setFont(new Font("宋体", Font.PLAIN, 16)); textArea.setLineWrap(true); JScrollPane panel = new JScrollPane(textArea, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); Container contentPane = getContentPane(); contentPane.add(panel, BorderLayout.CENTER); // 状态栏 stateBar = new JLabel("未修改"); stateBar.setHorizontalAlignment(SwingConstants.LEFT); stateBar.setBorder( BorderFactory.createEtchedBorder()); contentPane.add(stateBar, BorderLayout.SOUTH); popUpMenu = editMenu.getPopupMenu(); fileChooser = new JFileChooser(); } private void setUpEventListener() { // 按下窗口关闭钮事件处理 addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { closeFile(); } } ); // 菜单 - 打开 menuOpen.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { openFile(); } } ); // 菜单 - 保存 menuSave.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { saveFile(); } } ); // 菜单 - 另存为 menuSaveAs.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { saveFileAs(); } } ); // 菜单 - 关闭文件 menuClose.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { closeFile(); } } ); // 菜单 - 剪切 menuCut.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { cut(); } } ); // 菜单 - 复制 menuCopy.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { copy(); } } ); // 菜单 - 粘贴 menuPaste.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { paste(); } } ); // 菜单 - 关于 menuAbout.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { // 显示对话框 JOptionPane.showOptionDialog(null, "程序名称:\n JNotePad \n" + "程序设计:\n \n" + "简介:\n 一个简单的文字编辑器\n" + " 可作为验收Java的实现对象\n" + " 欢迎网友下载研究交流\n\n" + " /", "关于JNotePad", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null); } } ); // 编辑区键盘事件 textArea.addKeyListener( new KeyAdapter() { public void keyTyped(KeyEvent e) { processTextArea(); } } ); // 编辑区鼠标事件 textArea.addMouseListener( new MouseAdapter() { public void mouseReleased(MouseEvent e) { if(e.getButton() == MouseEvent.BUTTON3) popUpMenu.show(editMenu, e.getX(), e.getY()); } public void mouseClicked(MouseEvent e) { if(e.getButton() == MouseEvent.BUTTON1) popUpMenu.setVisible(false); } } ); } private void openFile() { if(isCurrentFileSaved()) { // 文件是否为保存状态 open(); // 打开 } else { // 显示对话框 int option = JOptionPane.showConfirmDialog( null, "文件已修改,是否保存?", "保存文件?", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, null); switch(option) { // 确认文件保存 case JOptionPane.YES_OPTION: saveFile(); // 保存文件 break; // 放弃文件保存 case JOptionPane.NO_OPTION: open(); break; } } } private boolean isCurrentFileSaved() { if(stateBar.getText().equals("未修改")) { return false; } else { return true; } } private void open() { // fileChooser 是 JFileChooser 的实例 // 显示文件选取的对话框 int option = fileChooser.showDialog(null, null); // 使用者按下确认键 if(option == JFileChooser.APPROVE_OPTION) { try { // 开启选取的文件 BufferedReader buf = new BufferedReader( new FileReader( fileChooser.getSelectedFile())); // 设定文件标题 setTitle(fileChooser.getSelectedFile().toString()); // 清除前一次文件 textArea.setText(""); // 设定状态栏 stateBar.setText("未修改"); // 取得系统相依的换行字符 String lineSeparator = System.getProperty("line.separator"); // 读取文件并附加至文字编辑区 String text; while((text = buf.readLine()) != null) { textArea.append(text); textArea.append(lineSeparator); } buf.close(); } catch(IOException e) { JOptionPane.showMessageDialog(null, e.toString(), "开启文件失败", JOptionPane.ERROR_MESSAGE); } } } private void saveFile() { // 从标题栏取得文件名称 File file = new File(getTitle()); // 若指定的文件不存在 if(!file.exists()) { // 执行另存为 saveFileAs(); } else { try { // 开启指定的文件 BufferedWriter buf = new BufferedWriter( new FileWriter(file)); // 将文字编辑区的文字写入文件 buf.write(textArea.getText()); buf.close(); // 设定状态栏为未修改 stateBar.setText("未修改"); } catch(IOException e) { JOptionPane.showMessageDialog(null, e.toString(), "写入文件失败", JOptionPane.ERROR_MESSAGE); } } } private void saveFileAs() { // 显示文件对话框 int option = fileChooser.showSaveDialog(null); // 如果确认选取文件 if(option == JFileChooser.APPROVE_OPTION) { // 取得选择的文件 File file = fileChooser.getSelectedFile(); // 在标题栏上设定文件名称 setTitle(file.toString()); try { // 建立文件 file.createNewFile(); // 进行文件保存 saveFile(); } catch(IOException e) { JOptionPane.showMessageDialog(null, e.toString(), "无法建立新文件", JOptionPane.ERROR_MESSAGE); } } } private void closeFile() { // 是否已保存文件 if(isCurrentFileSaved()) { // 释放窗口资源,而后关闭程序 dispose(); } else { int option = JOptionPane.showConfirmDialog( null, "文件已修改,是否保存?", "保存文件?", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, null); switch(option) { case JOptionPane.YES_OPTION: saveFile(); break; case JOptionPane.NO_OPTION: dispose(); } } } private void cut() { textArea.cut(); stateBar.setText("已修改"); popUpMenu.setVisible(false); } private void copy() { textArea.copy(); popUpMenu.setVisible(false); } private void paste() { textArea.paste(); stateBar.setText("已修改"); popUpMenu.setVisible(false); } private void processTextArea() { stateBar.setText("已修改"); } public static void main(String[] args) { new JNotePadUI(); } }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值