【Unity3D】人机交互Input

这篇具有很好参考价值的文章主要介绍了【Unity3D】人机交互Input。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 前言

        Input 是 Unity3D 中用于人机交互的工具类,用户可以调用其 GetKey、GetMousePosition、GetMouseButton、GetAxis、GetButton 等方法获取键盘和鼠标的状态信息,再通过这些状态信息控制游戏对象,从而实现人机交互。

        1)键盘输入

// 按住按键
public static bool GetKey(KeyCode key)
// 按下按键
public static bool GetKeyDown(KeyCode key)
// 抬起按键
public static bool GetKeyUp(KeyCode key)

        KeyCode 的取值有:

A~Z
F1~F15
// 键盘顶部的数字
Alpha0~Alpha9
Left、RightArrow、UpArrow、DownArrow
LeftCtrl、LeftShift、LeftAlt、LeftWindows、RightCtrl、RightShift、RightAlt、RightWindows
Tab、Space、Backspace、Return
// 加号、减号、星号、斜杠、反斜杠、左括号、右括号、小于号、大于号、等于号、上尖号
Plus、Minus、Asterisk、Slash、Backslash、LeftBracket、RightBracket、Less、Greater、Equals、Caret
// 逗号、点号、问号、分号、冒号、单引号、反引号、双引号、感叹号
Comma、Period、Question、Semicolon、Colon、Quote、BackQuote、DoubleQuote、Exclaim
// @符号、$符号、&符号、下划线
At、Dollar、Ampersand、Underscore
Insert、Delete、Home、End、PageUp、PageDown、Print
CapsLock、Numlock、ScrollLock
Keypad0~Keypad9、KeypadPeriod
KeypadPlus、KeypadMinus、KeypadMultiply、KeypadDivide
KeypadEquals、KeypadEnter
// 鼠标左键、鼠标右键、鼠标中间
Mouse0、Mouse1、Mouse2

        2)鼠标输入

// 按住鼠标
public static bool GetMouseButton(int button)
// 按下鼠标
public static bool GetMouseButtonDown(int button)
// 抬起鼠标
public static bool GetMouseButtonUp(int button)
// 鼠标坐标
Vector3 position = Input.mousePosition

        说明:button 取值为 0、1、2,分别表示鼠标左键、右键、中键。 

        3)虚拟轴输入

        在【Edit→Project Settings→Input】中可以打开 InputManager 配置界面,用户可以在此配置虚拟轴信息。

【Unity3D】人机交互Input  【Unity3D】人机交互Input  【Unity3D】人机交互Input  【Unity3D】人机交互Input

// 按左右箭头或A、D键,hor在-1~1之间变化
float hor = Input.GetAxis("Horizontal");
// 按上下箭头或W、S键,hor在-1~1之间变化
float ver = Input.GetAxis("Vertical");
// 获取鼠标在水平方向上的移动
float mouseX = Input.GetAxis("Mouse X");
// 获取鼠标在竖直方向上的移动
float mouseY = Input.GetAxis("Mouse Y");
// 获取滚轮信息, 上滑为正, 下滑为负
float scroll = Input.GetAxis("Mouse ScrollWheel");

        4)虚拟按键输入

         InputManager 配置界面配置虚拟按键,如下:

【Unity3D】人机交互Input

// 按住虚拟按键
public static bool GetButton(string buttonName)
// 按下虚拟按键
public static bool GetButtonDown(string buttonName)
// 抬起虚拟按键
public static bool GetButtonUp(string buttonName)
// 按以上配置,按住Q键或鼠标左键返回true,表示开火了
bool fire = Input.GetButton("Fire");

        5)鼠标回调方法

using UnityEngine;

public class MouseEventTest : MonoBehaviour {
    private void OnMouseEnter() { // 鼠标进入碰撞体时回调
        Debug.Log("OnMouseEnter");
    }

    private void OnMouseOver() { // 鼠标悬浮在碰撞体上回调
        Debug.Log("OnMouseOver");
    }

    private void OnMouseExit() { // 鼠标离开碰撞体时回调
        Debug.Log("OnMouseExit");
    }

    private void OnMouseDown() { // 鼠标在碰撞体上按下了左键时回调
        Debug.Log("OnMouseDown");
    }

    private void OnMouseUp() { // 鼠标在碰撞体上按下了左键, 并且抬起时回调(此时不一定悬浮在碰撞体上)
        Debug.Log("OnMouseUp");
    }

    private void OnMouseUpAsButton() { // 鼠标按下和抬起都在同一个碰撞体上, 并且抬起了鼠标左键时回调
        Debug.Log("OnMouseUpAsButton");
    }

    private void OnMouseDrag() { // 鼠标在碰撞体上按下, 并拖拽时回调(拖拽过程中不一定悬浮在碰撞体上)
        Debug.Log("OnMouseDrag");
    }
}

        说明:MouseEventTest 挂在需要触发鼠标事件的对象上,并且该对象有碰撞体组件,2D UI 需要添加 BoxCollider2D 组件。

2 应用

        本节将实现坦克对战游戏。

        1)实现需求

  • 绘制2个坦克,一个表示己方,一个表示敌方;
  • 用户可以通过上下箭头按键控制己方坦克前后移动,通过左右箭头按键控制己方坦克左右移动或左右转向;
  • 用户可以通过鼠标左键发射炮弹;
  • 敌方坦克可以自动转向瞄准己方坦克,但是有延时,转向先快后慢,延时插值系数为 0.6;
  • 敌方坦克瞄准己方坦克后(允许有5°误差),自动开炮,开炮间隔需要大于1秒。

        2)创建游戏对象

        游戏对象的 Transform 组件参数如下: 

name type position Rotation scale Color/Texture
MyTank Empty (0, 0.25, -5) (0, 0, 0) (1, 1, 1) ——
Button Cube (0, 0, 0) (0, 0, 0) (2, 0.5, 2) #228439FF
Top Cube (0, 0.5, 0) (0, 0, 0) (1, 0.5, 1) #228439FF
Gun Cylinder (0, 0, 1.5) (90, 0, 0) (0.2, 1, 0.4) #228439FF
FirePoint Empty (0, 1.15, 0) (0, 0, 0) (1, 1, 1) ——
MyBullet Sphere (0, 0, -2) (0, 0, 0) (0.2, 0.2, 0.2) #82EA4FFF
Plane Plane (0, 0, 0) (0, 0, 0) (10, 10, 10) GrassRockyAlbedo
EnemyTank Empty (0, 0.25, 5) (0, 180, 0) (1, 1, 1) 15D3F9FF
EnemyBullet Sphere (0, 0, 2) (0, 0, 0) (0.2, 0.2, 0.2) #4C55F8FF

        说明: EnemyTank 由 MyTank复制而来,只是修改了它自己及其子对象的颜色属性;EnemyBullet 由 MyBullet 复制而来,然后修改了颜色属性;将 MyBullet 和 EnemyBullet 拖拽至 Assets 窗口的 Resources/Prefabs 目录下,生成预设体(prefab),再删除 Hierarchy 窗口下 MyBullet 和 EnemyBullet 对象。

         游戏对象的层级结构如下:

【Unity3D】人机交互Input

        游戏界面如下:

【Unity3D】人机交互Input

         3)脚本组件

        MyTank.cs

using UnityEngine;

public class MyTank : MonoBehaviour {
	private Transform firePoint; // 开火点
	private GameObject bulletPrefab; // 炮弹预设体

	void Start() {
		firePoint = transform.Find("Top/Gun/FirePoint");
		bulletPrefab = (GameObject) Resources.Load("Prefabs/MyBullet");
		Debug.Log(bulletPrefab);
	}

	void Update () {
		float hor = Input.GetAxis("Horizontal");
        float ver = Input.GetAxis("Vertical");
		move(hor, ver);
		if (Input.GetMouseButtonDown(0)) { // 开炮
			GameObject bullet = Instantiate(bulletPrefab, firePoint.position, Quaternion.identity); // 通过预设体创建炮弹
			bullet.GetComponent<Bullet>().setMoveDir(transform.forward); // 设置炮弹飞出方向
		}
	}

	private void move(float hor, float ver) {
		// 移动方案一:上下箭头控制前后移动,左右箭头控制左右移动
		// transform.Translate(hor * Time.deltaTime * 3, 0, ver * Time.deltaTime * 3);

		// 移动方案二:上下箭头控制前后移动,左右箭头控制左右拐弯
		transform.Translate(0, 0, ver * Time.deltaTime * 3);
		transform.Rotate(Vector3.up * hor * Time.deltaTime * 120f);
	}
}

         说明:MyTank.cs 脚本组件挂载在 MyTank 游戏对象上。

        EnemyTank.cs

using UnityEngine;

public class EnemyTank : MonoBehaviour {
	private Transform target; // 目标
	private Transform top; // 炮头
	private Transform firePoint; // 开火点
	private GameObject bulletPrefab; // 炮弹预设体
	private float fireInternal = 0; // 开炮间隔

	void Start () {
		target = GameObject.Find("MyTank/Top").transform;
		top = transform.Find("Top");
		firePoint = transform.Find("Top/Gun/FirePoint");
		bulletPrefab = (GameObject) Resources.Load("Prefabs/EnemyBullet");
	}

	void Update () {
		Quaternion dir = Quaternion.LookRotation(target.position - top.position);
		top.rotation = Quaternion.Lerp(top.rotation, dir, Time.deltaTime * 0.6f); // 敌军转向己方
		float angle = Vector3.Angle(target.position - top.position, top.forward);
		if (angle < 5 && fireInternal > 1) {
			GameObject bullet = Instantiate(bulletPrefab, firePoint.position, Quaternion.identity); // 通过预设体创建炮弹
			bullet.GetComponent<Bullet>().setMoveDir(top.forward); // 设置炮弹飞出方向
			fireInternal = 0;
		}
		fireInternal += Time.deltaTime;
	}
}

         说明:EnemyTank.cs 脚本组件挂载在 EnemyTank 游戏对象上。

        Bullet.cs

using UnityEngine;

public class Bullet : MonoBehaviour {
	private Vector3 moveDir; // 炮弹飞出方向

	void Start () {
		Destroy(gameObject, 2); // 2秒后自动销毁
	}

	void Update () {
		if (moveDir != null) {
			transform.Translate(moveDir * Time.deltaTime * 6);
		}
	}

	public void setMoveDir(Vector3 dir) {
		moveDir = dir;
	}
}

         说明:Bullet.cs 脚本组件挂载在 MyBullet 和 EnemyBullet 预设体上。

          4)运行效果

        左右箭头按键控制己方坦克左右移动 

【Unity3D】人机交互Input

        左右箭头按键控制己方坦克左右转向

【Unity3D】人机交互Input文章来源地址https://www.toymoban.com/news/detail-410382.html

到了这里,关于【Unity3D】人机交互Input的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Unity3D】如何在uniyt中切换画布实现切换界面的交互操作

    我们在切换不同界面的时候,时常会用到切换场景的操作。 如果在一个场景里就可以去实现切换界面的时候,若再使用切换场景来实现,会占用很大的空间,不妨在一个场景里使用切换画布的方法来实现切换界面的交互操作。  效果如图所示:  在第一个画布中,点击按钮后

    2024年02月12日
    浏览(33)
  • Unity3D Pico VR 手势识别物体交互 适配 MRTK3

     当前Pico已经支持手势识别了,但是提供的PICO Unity Integration SDK 中是没有手势和物体交互的功能,Unity XR Interaction Toolkit提供的手势识别物体交互对 Quest适配的挺好的,Pico 当前只能用指尖点触还不能对物体进行抓握以及手势控制射线对物体进行交互。 如要项目想要使用Pico 手

    2024年01月21日
    浏览(49)
  • Unity3d(webGL)构建数字孪生小案例(包含完整的数据交互体系)附赠完整代码

    B站视频演示 点击获取合视频对应的完整版代码 项目文档 数字孪生demo项目,打通了,模型-硬件终端-webGL-web端-服务端的数据交互,属于较为完整的项目练习。 包含文件:unity工程文件;webGL文件;前后端代码文件;硬件代码; 先来看看概念吧: 数字孪生体是现有或将有的物

    2024年02月09日
    浏览(35)
  • unity3D基础操作之01--unity3d窗口界面介绍

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 1、Scene场景编辑窗口; 2、Game游戏运行窗口; 3、Hierarchy场景物体列表窗口; 4、Project项目资源列表窗口; 5、Inspector属性编辑列表窗口; 6、其他常调节窗口 在屏幕左上方为场景编辑窗口Scene,在场景编

    2024年02月06日
    浏览(51)
  • 【Unity3D日常开发】Unity3D中协程的使用

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 大家好,我是佛系工程师 ☆恬静的小魔龙☆ ,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 最近有小伙伴问协程怎么用、怎么写,我也是会用会写,但是原理不是很明白。 学习了一下,总结出

    2024年02月12日
    浏览(43)
  • 【Unity3D小功能】Unity3D中实现Text显示版本功能

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 大家好,我是佛系工程师 ☆恬静的小魔龙☆ ,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 在项目开发中,会遇到要控制版本的情况,比如说对比版本号,版本不对再更新版本的功能,这些就是

    2024年02月05日
    浏览(49)
  • 【Unity3D日常开发】Unity3D中实现单例模式详解

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 大家好,我是佛系工程师 ☆恬静的小魔龙☆ ,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 首先,说一下,什么是 单例模式(Singleton) 。 单例模式是设计模式中常见的一种设计模式,目的是为了

    2024年02月02日
    浏览(48)
  • 【Unity3D-01】 记录Unity3D调用外接摄像头

    最近想在Unity3D上调用一个摄像头,通过查找资料发现仙魁XAN和八哥快走开的博客符合我的想法,实现起来也不难就尝试了一下 2.1 在这个工程里新建Canvas 如下图所示 然后下设RawImage为载体 2.2 在Assets里面新建一个脚本命名为PlaneManager.cs 代码内容如下(参考八哥快走开的博客)

    2024年02月04日
    浏览(39)
  • 【Unity3D小功能】Unity3D中实现点击‘文字’出现‘UI面板’

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 QQ群:398291828 大家好,我是佛系工程师 ☆恬静的小魔龙☆ ,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 宠粉博主又来了,今天有粉丝问我如何实现点击一段文字然后出现的面板在那段文字附近显示: 深入了

    2024年04月13日
    浏览(42)
  • 【Unity3D】Unity3D 软件安装 ( 注册账号并下载 Unity Hub | 安装 Unity Hub | 获取个人版授权 | 中文环境设置 | 安装 Unity3D 编辑器 )

    Unity 官方网站 : 英文 : https://unity.com 中文 : https://unity.cn 进入 中文网站 https://unity.cn , 点击右上角的 \\\" 下载 Unity \\\" 按钮 ; 推荐下载 Unity3D 的长期支持版本 ; 点击界面中的 \\\" 下载 Unity Hub \\\" 选项 ; 根据你的系统 , 选择对应的 Unity Hub , 我在 Windows 上开发 , 因此选择 \\\" Windows 下载 \\\"

    2024年01月25日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包