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

目录

    • 输入
      • 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 framevoid 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 framevoid Update(){// key = Input.GetKey(KeyCode.Space);// key = Input.GetKey("space");key = Input.GetButton("Jump");if(key)transform.localScale = new Vector3(2,2,2);elsetransform.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 framevoid 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 framevoid 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.rhkb.cn/news/45281.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Unity3D】用InputField做一个简易UI,为GameObject的高度y赋值

目录 一些废话之前卡过的bugInputField更新了类名&#xff0c;引用后无法拖拽单独对GameObject的Transform.position中的某一坐标赋值float.Parse()&#xff0c;格式报错FormatException点击按钮&#xff0c;值只改变了一瞬间又回到原来状态 完整代码后记 一些废话 我是一只总…

【Unity入门】3.3D物体

【Unity入门】3D物体 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity入门系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;物体移动旋转缩放 &#xff08;1&#xff09;物体移动 在上一篇文章【Unity入门】场景视图操作我们学会了在场景中创建3…

UnityWeb端和Js互调(MQTT通讯篇)

TOC关于Unity与Js互调&#xff08;MQTT通讯篇&#xff09;踩了很多坑接下来总结一下 总体思路 工程项目当时是PC端项目转成Web端项目。PC端采用的通讯方式是MQTT通讯订阅端&#xff0c;而如果发布成Web端的话不能直接进行MQTT通讯&#xff0c;就想了个办法通过Unity与JS互调的…

Unity Houdini插件编写data Table传递数据给Houdini

上次说到Unity Houdini插件将Tag设为group&#xff0c;里面用到了自定义输入接口。然后那个Houdini教程又给我出难题了&#xff0c;unreal 可以用一种叫data Table的数据结构来完成向Houdini结构化数据的传递&#xff08;链接&#xff09;&#xff0c;我没找到Unity类似的功能&…

【Unity】动态生成圆环体Mesh

代码由ChatGPT生成&#xff0c;后经人工调整。 /// <summary> /// 创建一个3维圆环体Mesh。 /// </summary> /// <param name"outerRadius">外半径。</param> /// <param name"innerRadius">内半径。</param> /// <…

关于vsCode中文插件突然无效的解决办法

今天今天github上下载了一个devtools 用vsCode打开,发现中文插件无效了 解决办法: 按ctrlshiftp 输入Configure Display Language 在弹出的语言中&#xff0c;选中zh-cn 然后重启vsCode

Android的EditText超出字数限制,给用户提示

Android的EditText超出字数限制&#xff0c;给用户提示 导语 如果项目着急使用&#xff0c;直接将下面代码复制到项目中&#xff0c;当做自定义的EditText使用就可以了。 建议将后面的解决思路看一遍&#xff0c;增强自己阅读源码的能力。 自定义的MaxLengthEditText /*** C…

最好理解的,用jeecms搭建一个新闻发布网站

1 前期环境配置 首先需要有jdk、tomcat和mysql&#xff0c;这里对于不同的jeecms版本对以上三种要求是不同的&#xff0c;我本人用的是jdk1.8&#xff0c;tomcat7,mysql5的版本。我们这里需要将从官网下载的压缩包解压出的ROOT文件放入tomcat下面的webapp下&#xff0c;替换掉…

一粒云之钉钉集成

一粒云dingtalk集成- 文章目录 一粒云dingtalk集成-1、一粒云管理后台配置步骤&#xff1a;2、钉钉管理后台配置步骤&#xff1a;2.1、自建应用2.3、填好对应的信息&#xff0c;下一步2.4、申请开通所有的权限——选择全部员工2.5、基础信息->查看详情&#xff0c;获得appke…

YLBs CAPTCHA - 签到题_N种花式签到,任你活动千万场,总有一款适合你

数字化时代&#xff0c;科技办会的理念正在逐步深入每个主办方的心里&#xff0c;如何给参会嘉宾带去好的参会体验&#xff1f;如何在众多的签到方式中找到适合自己活动的签到&#xff1f;31会议给你几款花样签到方式&#xff0c;让你的大会科技感十足。 二 / 微 / 码 / 签/ 到…

Ai配音专家 免费配置教程(适用于mac和windows系统)

Ai配音专家 语音转文字免费配置教程&#xff08;适用于mac和windows系统&#xff09; 推荐一款免费文本转语音的软件&#xff0c;文件来源于github&#xff0c;如果你在做自媒体的时候也不想用真音&#xff0c;那这款软件绝对适合你。配置过程分为以下内容&#xff1a; Ai配音…

vue前端使用Jenkins自动构建项目,保姆级教程

1. 开始前的准备工作 1台服务器&#xff0c;1个镜像仓库&#xff0c;安装docker 练习的话&#xff0c;服务器可以在[阿里云上](https://www.aliyun.com/?spm5176.ecscore_.top-nav.dlogo.509a4df5JhX1PN)领取一个月免费ECS云服务器&#xff0c;如下图在阿里云控台界面搜索容器…

vue 3.x 中使用ele-image时相对路径的图片加载失败

参考文档&#xff1a; https://element.eleme.cn/#/zh-CN/component/installation 环境: Mac OS X 10.12 [zcmele 2]$node -v v12.6.0 [zcmele 3]$npm -v 6.9.0 [zcmele 4]$cnpm -v cnpm6.1.0 (/usr/local/lib/node_modules/cnpm/lib/parse_argv.js) npm6.10.2 (/usr/local/li…

创意3D立体logo设计难不难?怎么设计?

本文由:“学设计上兔课网”原创,图片素材来自网络,仅供学习分享 创意3D立体logo设计难不难?怎么设计?虽然是3D的效果,但是我们也可以通过平面设计软件AI或者PS软件来实现这种伪3D的视觉效果。首先我们来看一看做完的最终效果 1.多边形工具,填充为0,有描边。利用多边形…

PR开场片头模板创意立体3D动态logo展示pr模板

&#xff0c; PR开场片头模板 创意立方体3Dlogo展示pr模板 这是一个整洁和动态动画的Premiere Pro模板&#xff0c;带有一个旋转立方体&#xff0c;时尚地旋转以显示您的媒体。包含1个标志占位符和1个文本占位符。简单介绍您的演示文稿&#xff0c;幻灯片&#xff0c;电视节目…

3D logo制作

3D制作图片 这次用AI来制作3Dlogo,首先把一张立体形状的logo图导入AI里 使用钢笔工具先把侧面白色部分抠下来 像上图一样抠下来之后在菜单里点击效果3D然后选择凸起和斜角,为了更好的去调整3D图形的变化,先点击预览调整凸出厚度数值为482pt,然后再去调整上面的方向环绕…

C4D暑期计划打卡7.30(2)

完成logo破碎小动画跟做 为完成的logo主体添加材质、增加天空、摄像机目标、对主体内部集进行单独材质添加&#xff0c;渲染增加景深&#xff0c;增添变化。 四视图 透视图 渲染图1 渲染图2

修改mars3d内置的文字

在使用mars3d开发中可能会需要修改内置的文字&#xff0c;如下图 mars3d内置的文字都会统一放在 mars3d.lang 这个对象下管理。如下图 如果需要修改&#xff0c;可以使用如下的方式 mars3d.Lang["_单击完成绘制"][0] "单击完成绘制&#xff0c;右键取消绘制&q…

CSS之 2D转换---3D转换(内含过渡)

转换可以实现元素的位移、旋转、缩放等效果 2D转换 translate --- 移动rotate --- 旋转scale --- 缩放 1.translate 语法&#xff1a;(px) transform:translate(x,y); transform:translateX(n); transform:translateY(n); 不会影响其他元素的位置 &#xff08;会变成前后…

chatgpt赋能python:Python的文件导出功能

Python的文件导出功能 作为一种流行的编程语言&#xff0c;Python 提供了广泛的文件导出功能&#xff0c;方便了开发者的日常工作。在本文中&#xff0c;我们将分享如何使用 Python 导出.py 文件&#xff0c;以及如何最大程度地利用这个功能。 什么是.py 文件&#xff1f; 首…