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

这篇具有很好参考价值的文章主要介绍了【学习笔记】unity脚本学习(四)【inputManager、键盘输入、鼠标输入、Raycast】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考:极客学院unity3d教程

输入

inputManager

unity 按键映射,unity,c#,unity,学习,笔记

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。

unity 按键映射,unity,c#,unity,学习,笔记

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

unity 按键映射,unity,c#,unity,学习,笔记

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

unity 按键映射,unity,c#,unity,学习,笔记

键值的含义

用的chatgpt回答的…
unity 按键映射,unity,c#,unity,学习,笔记
md google is dead
unity 按键映射,unity,c#,unity,学习,笔记

键名称命名约定:
键系列 命名约定
字母键 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形式,但由于浏览器会直接渲染成表格,无法复制源文本,可以让它用代码格式展示答案:
unity 按键映射,unity,c#,unity,学习,笔记

键盘输入

官网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);
    }

unity 按键映射,unity,c#,unity,学习,笔记

GetButton/Down/up

GetButton 当按住 buttonName 标识的虚拟按钮时,返回 true。
GetButtonDown 在用户按下由 buttonName 标识的虚拟按钮的帧期间返回 true。
GetButtonUp 在用户释放由 buttonName 标识的虚拟按钮的第一帧返回 true。
unity 按键映射,unity,c#,unity,学习,笔记

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

unity 按键映射,unity,c#,unity,学习,笔记

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

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

鼠标输入与控制

OnMouseDown (继承自MonoBehavior)

unity 按键映射,unity,c#,unity,学习,笔记

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

unity 按键映射,unity,c#,unity,学习,笔记

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 设置。
unity 按键映射,unity,c#,unity,学习,笔记

实例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);
    }

unity 按键映射,unity,c#,unity,学习,笔记
unity 按键映射,unity,c#,unity,学习,笔记
注意事项:

  • 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
unity 按键映射,unity,c#,unity,学习,笔记

// 改用包含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
                );
        }

unity 按键映射,unity,c#,unity,学习,笔记
还可以固定cube景深

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

其他输入

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

小结

耗时两天,中间两天没学习,忙着玩青藤,心有些浮躁,自我批评下。文章来源地址https://www.toymoban.com/news/detail-607254.html

到了这里,关于【学习笔记】unity脚本学习(四)【inputManager、键盘输入、鼠标输入、Raycast】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • unity3D 鼠标键盘输入

    unity3D 鼠标键盘输入

    一、鼠标键盘输入 游戏的输入可以来自于鼠标,键盘,触摸屏,游戏手柄 显示一个Vector3类型的xyz的鼠标位置。 Input.GetButtonDown(0):0代表鼠标左键,1代表鼠标右键,如果鼠标左键按下返回true。 Input.GetKeyDown(\\\"space\\\"): 检测空格是否按下。 更多操作可以查看Unity Script API( UnityE

    2024年02月10日
    浏览(12)
  • 【Unity】Input——检测鼠标、键盘、手柄输入、鼠标在屏幕上的位置等等

    【Unity】Input——检测鼠标、键盘、手柄输入、鼠标在屏幕上的位置等等

    Unity提供的 更方便的 控制对象的 位移和旋转的解决方案 这个Axis是可以自定义的:

    2024年02月11日
    浏览(27)
  • 【Unity】简单案例脚本实现 | 鼠标观察/键盘控制移动飞行/行走/碰撞检测

    【Unity】简单案例脚本实现 | 鼠标观察/键盘控制移动飞行/行走/碰撞检测

    《Unity5实战-使用C#和Unity开发多平台游戏》第二章-构建一个让你置身3D空间的演示 鼠标观察/键盘控制移动飞行/行走/碰撞检测 Unity版本:2019.4.23f1c1 注意脚本名称和组件添加,不在文章中一一强调 场景模型都是在资源商店选择的免费下载(选择Sort by Price(Low to High)排序)搜索

    2024年02月04日
    浏览(11)
  • Matlab键盘鼠标输入学习及PsychToolBox对刺激反应结果的保存

    Matlab键盘鼠标输入学习及PsychToolBox对刺激反应结果的保存

    包括键盘监听 KbWait KbCheck 、鼠标监听 GetMouse 如图为鼠标绘制的图像: 之前的代码参考上一篇文章:Psychtoolbox使用Screen时间控制以帧随机播放图片 在反应收集部分添加键盘输入项,对应保存结果。被试者对图片刺激进行判断给出反应结果。 被试者反应结果( 键位、匹配结果

    2024年02月16日
    浏览(9)
  • JAVA 鼠标控制与键盘输入控制

    该类是JDK定义的电脑系统的抽象类,可以用来模拟实现鼠标点击与键盘输入等信息 简单实现一个自动抢票代码: InputEvent.BUTTON1_MASK 左键 (食指点击) InputEvent.BUTTON2_MASK 中键 (滚轮) InputEvent.BUTTON3_MASK 右键(中指点击) 得到的信息需要根据屏幕--显示设置--缩放与布局的百分

    2024年02月13日
    浏览(11)
  • 34_输入设备键盘鼠标你得会

    34_输入设备键盘鼠标你得会

    键盘和鼠标是个人计算机中常用的输入设备。通过键盘可以将字母、数字、标点符号等输入计算机中,从而向计算机发出命今;鼠标可以对屏幕上的光标进行定位,并通过鼠标按钮和滚轮对光标所处位置的屏幕元素进行操作。一个应用程序应该响应用户的键盘和鼠标输入事件。

    2024年01月22日
    浏览(8)
  • Qt魔法书:打造自定义鼠标键盘脚本

    在我们的日常生活和工作中,脚本扮演着重要的角色。它们就像是一种“自动化的魔法”,可以帮助我们完成各种复杂、繁琐的任务,从而提高效率,节省时间。这就像是我们拥有了一个个小助手,他们可以按照我们的指示,自动完成我们需要的工作。 脚本的重要性不仅体现

    2024年02月09日
    浏览(10)
  • c++ 键盘/鼠标交互+特殊输入/输出+窗口常用函数

    需要头文件: 或: 函数: 使用方法: 1.if(KEY_DOWN(某个键))或if(KEY_UP(某个键)) 检测该键是否按下/未按下 2.keybd_event(某个键,0,0,0);或keybd_event(某个键,0,KEYEVENTF_KEYUP,0); 使该键是否按下/弹起(实际使用可参照下文鼠标函数click_left()) 键码表(替换“某个键”): 函数: 使用方法: gx()或

    2024年02月09日
    浏览(7)
  • Linux输入设备应用编程(键盘,按键,触摸屏,鼠标)

    Linux输入设备应用编程(键盘,按键,触摸屏,鼠标)

    目录 一 输入设备编程介绍 1.1 什么是输入设备呢?  1.2 什么是输入设备的应用编程?   1.3 input子系统 1.4  数据读取流程 1.5 应用程序如何解析数据 1.5.1 按键类事件:  1.5.2 相对位移事件  1.5.3 绝对位移事件  二 读取 struct input_event数据   本章学习Linux输入设备的应用编程

    2024年02月05日
    浏览(11)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包