【学习笔记】unity脚本学习(四)【inputManager、键盘输入、鼠标输入、Raycast】

news2025/1/11 17:55:11

目录

    • 输入
      • inputManager
        • Horizontal虚拟轴的各个属性含义(摘选自ChatGpt,部分回答不准确)
        • 键值的含义
        • 键名称命名约定:
      • 键盘输入
        • 静态函数
          • GetKey
          • GetButton
          • KeyCode
          • GetButton/Down/up
          • GetAxis
          • GetAxisRaw 返回由 axisName 标识的虚拟轴的值(未应用平滑过滤)。
      • 鼠标输入与控制
        • OnMouseDown (继承自MonoBehavior)
        • Physics.Raycast
          • 参数
          • 描述
          • 实例1 ray检测实现坠落开伞
          • 实例2 利用ray实现鼠标点击检测
          • 实例3 鼠标拖动场景物体
      • 其他输入
      • 小结

参考:极客学院unity3d教程

输入

inputManager

在这里插入图片描述

Horizontal虚拟轴的各个属性含义(摘选自ChatGpt,部分回答不准确)

  • Name:虚拟轴的名称,用于在代码中访问该虚拟轴。这个名称应该是唯一的,用于区分其他虚拟轴。
  • Descriptive Name:描述虚拟轴的名称,用于在Inspector中显示。这个名称通常是用户友好的,例如"水平轴"、"左右方向"等。
  • Negative Button:定义一个负向按钮,按下这个按钮将使轴值变为负数。这个按钮可以是Unity中默认定义的按键(例如左箭头键、A键等),也可以是用户自定义的按键。如果不需要负向按钮,可以将其留空。
  • Positive Button:定义一个正向按钮,按下这个按钮将使轴值变为正数。同样,这个按钮可以是默认定义的按键或者自定义的按键。如果不需要正向按钮,可以将其留空。
  • Alt Negative Button:定义一个替代的负向按钮。如果定义了这个按钮,当Negative Button按钮没有被按下时,按下这个替代按钮也可以使轴值变为负数。如果不需要替代按钮,可以将其留空。
  • Alt Positive Button:定义一个替代的正向按钮。同样,当Positive Button按钮没有被按下时,按下这个替代按钮也可以使轴值变为正数。如果不需要替代按钮,可以将其留空。
  • Gravity:轴值的“重力”,表示轴值在没有按下按钮时逐渐趋向于0的速度。例如,如果Gravity属性设置为1,则当没有按下任何控制键时,轴值每秒钟会减少1。这可以使物体在没有输入时自然地停下来。如果Gravity属性设置为0,则轴值将永远不会自动返回0。

在这里插入图片描述

  • Dead:死区,当轴值的绝对值小于这个值时,轴值将被认为是0。死区通常用于解决输入设备的精度问题,可以消除轻微的移动或震动对轴值的影响。
  • Sensitivity:轴值的灵敏度,用于控制轴值的变化速度。例如,如果Sensitivity属性设置为2,则每按下一次控制键,轴值将增加2,而不是1。这可以使物体的移动更快或更缓慢。

在这里插入图片描述

  • Snap:如果勾选,存在一个反方向的输入,则会跳到中点并再沿这个反方向移动;如果不勾选,则不存在一个跳变(snap)的过程。例如人物移动,可以勾选,但赛车类游戏则可以不勾选。
    float axisX;

    // Update is called once per frame
    void Update()
    {
        axisX = Input.GetAxis("Horizontal");
        this.transform.position = new Vector3(axisX*2,1,0);
    }

在这里插入图片描述

键值的含义

用的chatgpt回答的…
在这里插入图片描述
md google is dead
在这里插入图片描述

键名称命名约定:

键系列命名约定
字母键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…

我这里插一句,这里可以让chatgpt把表格内容生成markdown形式,但由于浏览器会直接渲染成表格,无法复制源文本,可以让它用代码格式展示答案:
在这里插入图片描述

键盘输入

官网API

静态函数

GetKey

public static bool GetKey (string name); 在用户按下 name 标识的键时返回 true。

Input.GetKey("up")
GetButton

public static bool GetButton (string buttonName); bool 当按下并且未释放轴时,返回 true。(需要输入管理器进行控制)

Input.GetButton("Fire1")
KeyCode

KeyCode其中列出了所有的按键、鼠标和游戏杆选项 (属于Enum)
包含内容参考官方 API

    bool key;

    // Update is called once per frame
    void Update()
    {
        // key = Input.GetKey(KeyCode.Space);
        // key = Input.GetKey("space");
        key = Input.GetButton("Jump");
        if(key)
        transform.localScale = new Vector3(2,2,2);
        else
        transform.localScale = new Vector3(1,1,1);
    }

在这里插入图片描述

GetButton/Down/up

GetButton 当按住 buttonName 标识的虚拟按钮时,返回 true。
GetButtonDown 在用户按下由 buttonName 标识的虚拟按钮的帧期间返回 true。
GetButtonUp 在用户释放由 buttonName 标识的虚拟按钮的第一帧返回 true。
在这里插入图片描述

GetAxis

返回由 axisName 标识的虚拟轴的值。

对于键盘和游戏杆输入设备,该值将处于 -1…1 的范围内。

该值的含义取决于输入控制的类型,例如,对于游戏杆的水平轴,值为 1 表示游戏杆向右推到底,值为 -1 表示游戏杆向左推到底;值为 0 表示游戏杆处于中性位置。

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

该值与帧率无关;使用该值时,您无需担心帧率变化问题。

    float axisX;
    float axisY;

    // Update is called once per frame
    void Update()
    {
        axisX = Input.GetAxis("Horizontal");
        axisY = Input.GetAxis("Vertical");
        this.transform.position = new Vector3(axisX*2,axisY*2,0);
    }

在这里插入图片描述

GetAxisRaw 返回由 axisName 标识的虚拟轴的值(未应用平滑过滤)。

对于键盘和游戏杆输入,该值将处于 -1…1 的范围内。 由于未对输入进行平滑处理,键盘输入将始终为 -1、0 或 1。 如果您想自己完成键盘输入的所有平滑处理,这非常有用。

鼠标输入与控制

OnMouseDown (继承自MonoBehavior)

在这里插入图片描述

        Rigidbody rigidbody;
    private void OnMouseDown() {
        rigidbody =  this.GetComponent<Rigidbody>();
        rigidbody.useGravity = true;
        rigidbody.isKinematic = false;
        rigidbody.AddForce(-Vector3.forward*10f,ForceMode.Impulse);
        Debug.Log("OnMouseDown");
    }

在这里插入图片描述

Physics.Raycast

public static bool Raycast (Vector3 origin, Vector3 direction, out RaycastHit hitInfo, float maxDistance, int layerMask, QueryTriggerInteraction queryTriggerInteraction);
返回 bool 当光线与任何碰撞体相交时,返回 true,否则返回 false。

也可以输入一个Ray类 Ray myRay = new Ray(vector3 origin,Vector3 direction);
Physics.Raycast(myRay,RaycastHit hitInfo,float distance,int LayerMask);

参数
  • origin 射线在世界坐标系中的起点。
  • direction 射线的方向。
  • hitInfo 如果返回 true,则 hitInfo 将包含有关最近的碰撞体的命中位置的更多信息。(另请参阅:RaycastHit)。
  • maxDistance 射线应检查碰撞的最大距离。
  • layerMask 层遮罩,用于在投射射线时有选择地忽略碰撞体。
  • queryTriggerInteraction 指定该查询是否应该命中触发器。
描述

向场景中的所有碰撞体投射一条射线,该射线起点为 origin,朝向 direction,长度为 maxDistance

您可以选择提供一个 LayerMask,以过滤掉不想生成与其碰撞的碰撞体。

您可以通过指定 queryTriggerInteraction 来控制是让触发碰撞体生成命中效果,还是使用全局 Physics.queriesHitTriggers 设置。
在这里插入图片描述

实例1 ray检测实现坠落开伞

目标:物体自由降落,当距离地面一定距离时,打开降落伞(没学动画,用active代替),并减速,到达地面收起降落伞。

   public GameObject parachute;//降落伞
    bool deployed =false;//默认降落伞折叠
    public float rayDistance = 4;//射线检测距离
    public float dragValue = 6f;//降落伞阻力
    void Awake()
    {
        parachute.SetActive(false);
    }
    void Update()
    {
        Ray testRay = new Ray(transform.position,Vector3.down);
        RaycastHit hitInfomation;
        if(!deployed){
            if(Physics.Raycast(testRay,out hitInfomation,rayDistance)){
                Deploy();
            }
        }
    }
    void Deploy(){
        deployed = true;
        GetComponent<Rigidbody>().drag = dragValue;
        parachute.SetActive(true);
    }
    void OnCollisionEnter(Collision other) {
        parachute.SetActive(false);
    }

在这里插入图片描述
最终效果
注意事项:

  • rigidBody已过时,用GetComponent< Rigidbody>()代替
  • child绑定到cube
实例2 利用ray实现鼠标点击检测
public Camera mCamera;

    // Update is called once per frame
    void Update()
    {
        // 检测鼠标按下,0左键,1右键,2中键
        if(!Input.GetMouseButtonDown(0)){
            return;
        }
        // Input.mousePosition鼠标的位置信息,左下角(0,0,0)
        // Space空间类型:world space、screen space、viewport space
        // 将screen坐标转换成世界坐标的射线
        Ray r = mCamera.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        if(Physics.Raycast(r,out hit,1000f))
        {
            if(hit.collider.tag == "c1"){
               Debug.Log("点击上喽") ;
            }
        }
    }

效果跟之前OnMouseDown差不多

实例3 鼠标拖动场景物体
public Camera mCamera;
    private void OnMouseEnter() {
        transform.localScale = new Vector3(
            transform.localScale.x*1.5f,
            transform.localScale.y*1.5f,
            transform.localScale.z*1.5f
            );
    }
    private void OnMouseExit() {
        transform.localScale = new Vector3(
            transform.localScale.x/1.5f,
            transform.localScale.y/1.5f,
            transform.localScale.z/1.5f
            );
    }
    private void OnMouseOver() {
        transform.Rotate(Vector3.up,45*Time.deltaTime,Space.Self);
    }
    private void OnMouseDrag() {
        moveObject();
    }
    void moveObject(){
        Ray r = mCamera.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        if(Physics.Raycast(r,out hit,1000f)){
            this.transform.position = new Vector3(
                hit.point.x,
                hit.point.y,
                hit.point.z
                );
        }
        Debug.DrawLine(r.origin,hit.point);
    }

如下图所示,能实现鼠标enter变大 离开变小 over旋转,但并没有想要drag效果,因为Raycast也会见到到cube本身,所以可以添加mask,排除cube
在这里插入图片描述

// 改用包含mask的Raycast方法
if(Physics.Raycast(r,out hit,1000f,1)){
            this.transform.position = new Vector3(
                hit.point.x,
                hit.point.y+0.5f,
                hit.point.z
                );
        }

在这里插入图片描述
还可以固定cube景深

void moveObjectFixDepth(){
        Vector3 mouseScreen = Input.mousePosition;
        mouseScreen.z = depth;
        Vector3 mouseWorld = mCamera.ScreenToWorldPoint(mouseScreen);
        this.transform.position = mouseWorld;
    }

其他输入

如遥感、触屏省略
还有input system package好像,以后遇到再补充吧

小结

耗时两天,中间两天没学习,忙着玩青藤,心有些浮躁,自我批评下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/416504.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Gradle-2】一文搞懂Gradle配置

1、前言 “Gradle的配置太多了&#xff0c;经常版本更新还有变化&#xff0c;而且它还能扩展&#xff0c;记是记不住了&#xff0c;只能用到再搜了&#xff0c;哎&#xff0c;难顶” 真的难顶&#xff0c;但是我想挑战一下… 本文介绍的重点&#xff1a; Gradle配置简介Grad…

slam与导航开发

Gmapping是一种基于激光雷达数据的地图构建算法&#xff0c;可以用于建立机器人的环境地图。 Gmapping算法是基于粒子滤波器&#xff08;Particle Filter&#xff09;的SLAM算法&#xff0c;它通过将机器人在环境中的位姿和地图中的特征进行联合估计&#xff0c;实现了机器人在…

个人使用mac OS和win OS的差异

苹果 macOS 操作系统和 Windows 操作系统在很多方面有所不同&#xff0c;主要体现在以下几个方面&#xff1a; 用户界面&#xff1a;macOS 和 Windows 的用户界面风格不同。macOS 推崇简洁、优雅的设计&#xff0c;注重操作体验&#xff1b;Windows 软件更为丰富&#xff0c;但…

Doris(1):Doris介绍

1 Doris简介 Apache Doris是一个现代化的基于MPP&#xff08;大规模并行处理&#xff09;技术的分析型数据库产品。简单来说&#xff0c;MPP是将任务并行的分散到多个服务器和节点上&#xff0c;在每个节点上计算完成后&#xff0c;将各自部分的结果汇总在一起得到最终的结果(…

最小生成树和最短路径及其他

还是学过的&#xff0c;主要用于复习q v q 一、最小生成树 最小生成树的定义 用于无向图中&#xff0c;无向图指的是没有带方向路径的图&#xff0c;给定n个点&#xff0c;m条边&#xff0c;如果将这些点依次相连&#xff0c;求出连接这些点的最小数值 应用场景 根据这个算…

9 个JSON.stringify的秘密大多数开发人员却不知道

作为前端开发工程师&#xff0c;你一定用过JSON.stringify&#xff0c;但你知道它的全部秘密吗&#xff1f; 很久以前&#xff0c;我因此在工作中犯下了无法挽回的错误。如果我早点知道&#xff0c;就不会发生这样的悲剧。 理解 JSON.stringify 基本上&#xff0c;JSON.stri…

神经网络辐射场NeRF、实时NeRF Baking、有向距离场SDF、占用网络Occupancy、NeRF 自动驾驶

1 NeRF原理2 NeRF加速PlenoxelsKiloNeRFInstant NGPTensoRF3 SDF NeRF4 Occupancy NeRF5 NeRF应用简介常见应用实际应用的挑战6 NeRF自动驾驶1 NeRF原理 NeRF (Neural Radiance Fields&#xff0c;神经辐射场) 是2020年ECCV会议上的Best Paper&#xff0c;其将隐式表达推上了…

安卓玩机搞机----移植第三方rom修复 第三方GSI系统修复bug综合解析【一】

很多朋友热衷与刷写第三方非当前机型官方系统的rom。和刷写第三方gsi等等。例如 米系列机型刷写Flyme 一加机型刷写miui oppo刷写gsi等等。 很多友友也会尝试自己移植第三方rom。但此类操作最大的问题在于修复可以开机后的bug&#xff0c;今天的教程综合说明下这类修复思路…

STM32F103RCT6

STM32F103RCT6是一款由STMicroelectronics公司生产的基于ARM Cortex-M3内核的32位微控制器。 它具有高性能、低功耗和广泛的应用领域。 包括ADC&#xff08;模数转换器&#xff09; DAC&#xff08;数字模拟转换器&#xff09; TIM&#xff08;定时器&#xff09; USART&#x…

Python 中 SyntaxError: ‘yield‘ outside function 错误

当我们在函数外部使用 yield 关键字时&#xff0c;会出现 Python “SyntaxError: ‘yield’ outside function”。 要解决该错误&#xff0c;如果我们需要对每个元素执行一些运算符&#xff0c;请使用列表理解&#xff0c;或者缩进函数内部使用 yield 的代码。 下面是一个产生…

Maven(四):Maven的使用(中)

Maven&#xff08;四&#xff09;&#xff1a;Maven的使用&#xff08;中&#xff09;前言一、实验四&#xff1a;创建 Maven 版的 Web 工程1、说明2、操作3、生成的pom.xml4、生成的Web工程的目录结构5、创建 Servlet5.1 在 main 目录下创建 java 目录5.2 在 java 目录下创建 …

【从零开始学Skynet】实战篇《球球大作战》(六):gateway代码设计(中)

1、编码和解码 我们来实现两个辅助方法str_unpack和str_pack&#xff0c;用于消息的解码和编码。 &#xff08;1&#xff09;str_unpack代码 local str_unpack function(msgstr)local msg {}while true dolocal arg, rest string.match( msgstr, "(.-),(.*)")if…

TCP/IP协议及配置

文章目录一、TCP/IP概述1. TCP/IP协议族2. 主机与主机之间通信的三个要素二、什么是IP地址1. 用来标识一个网络节点的互联网地址&#xff08;如同电话的号码&#xff09;2. IPv4地址组成三、IP地址分类1. 常用的IP地址2. 组播及科研专用四、IP地址分类&#xff08;续&#xff0…

wsl下安装cuda各种踩坑记录.assets

执行nvcc -V, cuda版本位11.5 删除cuda sudo apt-get --purge remove "*cublas*" "*cufft*" "*curand*" \"*cusolver*" "*cusparse*" "*npp*" "*nvjpeg*" "cuda*" "nsight*"选择对…

打造自己特色远程桌面:SmartCode ViewerX Crack

SmartCode ViewerX VNC 查看器 ActiveX 毫不费力地将 VNC 查看器功能添加到您的应用程序 SmartCode ViewerX VNC 查看器 ActiveX 使开发人员可以使用一组直观的 ActiveX 属性和方法完全访问 VNC 查看器功能。借助ViewerX 控件&#xff0c;开发人员可以轻松地为其应用程序提供…

<呕心沥血>一文总结数据结构八大排序(持续更新)

目录 一、常见的八大排序 二、八大排序的算法思想 1、冒泡排序 2、选择排序 3、插入排序 4、希尔排序 5、归并排序 6、快速排序 7、堆排序 8、计数排序 三、八大排序的算法实现 一、常见的八大排序 常见的八大排序算法如下&#xff1a; 冒泡排序&#xff08;Bubble …

Android中的接口回调机制

文章目录1.回调的含义和用途2.java实现接口回调3.Android中接口回调的体现4.接口回调在异步任务中的体现1.回调的含义和用途 一般来说&#xff0c;模块之间都存在一定的调用关系&#xff0c;从调用方式上看&#xff0c;可以分为三类同步调用、异步调用和回调。同步调用是一种阻…

JAVAWeb04-DOM

1. DOM 1.1 概述 1.1.1 官方文档 地址: https://www.w3school.com.cn/js/js_htmldom.asp 1.1.2 DOM 介绍 DOM 全称是 Document Object Model 文档对象模型就是把文档中的标签&#xff0c;属性&#xff0c;文本&#xff0c;转换成为对象来管理 1.2 HTML DOM&#xff08;文档…

为什么现代企业都在使用ERP系统 它有哪些优势

随着科技的不断发展&#xff0c;企业管理方式也在不断地发生改变。在这个信息化的时代&#xff0c;企业要想取得成功&#xff0c;必须要善于利用先进的信息化技术工具。其中&#xff0c;ERP系统是企业管理中不可或缺的重要工具。本文将探讨现代企业为什么会使用ERP系统&#xf…

CPU占用率高怎么办?正确解决方法在这里!

案例&#xff1a;CPU占用率高怎么解决 【各位朋友&#xff0c;我的电脑现在运行太慢了&#xff0c;同事说可能是CPU占用率太高了&#xff0c;但对本电脑小白来说&#xff0c;完全不知道怎么处理&#xff0c;大家有什么好的方法可以解决这个问题吗&#xff1f;】 在计算机中&a…