4.代码检测鼠标输入

4.代码检测输入-鼠标输入


4.1 知识点

获取当前鼠标设备(需要引用命名空间)

//获得当前接入的鼠标
Mouse mouse = Mouse.current;

鼠标各键位 按下 抬起 长按

//鼠标左键
//mouse.leftButton

//鼠标右键
//mouse.rightButton

//鼠标中键
//mouse.middleButton

//鼠标 向前向后键
//mouse.forwardButton;
//mouse.backButton;

//按下
if (Mouse.current.leftButton.wasPressedThisFrame)
{
    print("鼠标左键按下");
}

//抬起
if (Mouse.current.leftButton.wasReleasedThisFrame)
{
    print("鼠标左键抬起");
}

//长按
if (Mouse.current.rightButton.isPressed)
{
    print("鼠标右键长按");
}

鼠标位置相关

//获取当前鼠标位置 原点是左下角 右上角的值为屏幕最大分辨率
Mouse.current.position.ReadValue();

//得到鼠标两帧之间的一个偏移向量 
Mouse.current.delta.ReadValue();

//鼠标中间 滚轮的方向向量 往上滚大于0 往下滚小于0
Mouse.current.scroll.ReadValue();

print(Mouse.current.position.ReadValue());

print(Mouse.current.delta.ReadValue());

print(Mouse.current.scroll.ReadValue());

4.2 知识点代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;

public class Lesson04_代码检测输入_鼠标输入 : MonoBehaviour
{
    void Start()
    {
        #region 知识点一 获取当前鼠标设备(需要引用命名空间)

        //获得当前接入的鼠标
        Mouse mouse = Mouse.current;

        #endregion

        #region 知识点二 鼠标各键位 按下 抬起 长按

        #endregion

        #region 知识点三 鼠标位置相关



        #endregion
    }

    void Update()
    {
        #region 知识点二 鼠标各键位 按下 抬起 长按

        //鼠标左键
        //mouse.leftButton
        //鼠标右键
        //mouse.rightButton
        //鼠标中键
        //mouse.middleButton
        //鼠标 向前向后键
        //mouse.forwardButton;
        //mouse.backButton;

        //按下
        if (Mouse.current.leftButton.wasPressedThisFrame)
        {
            print("鼠标左键按下");
        }

        //抬起
        if (Mouse.current.leftButton.wasReleasedThisFrame)
        {
            print("鼠标左键抬起");
        }

        //长按
        if (Mouse.current.rightButton.isPressed)
        {
            print("鼠标右键长按");
        }

        #endregion

        #region 知识点三 鼠标位置相关

        //获取当前鼠标位置 原点是左下角 右上角的值为屏幕最大分辨率
        Mouse.current.position.ReadValue();

        //得到鼠标两帧之间的一个偏移向量 
        Mouse.current.delta.ReadValue();

        //鼠标中间 滚轮的方向向量 往上滚大于0 往下滚小于0
        Mouse.current.scroll.ReadValue();

        print(Mouse.current.position.ReadValue());

        print(Mouse.current.delta.ReadValue());

        print(Mouse.current.scroll.ReadValue());

        #endregion
    }
}

4.3 练习题

利用目前所学知识,用新输入系统的鼠标键盘输入制作一个这样的功能:场景上有一个3D立方体,当鼠标点击选中它时,它的颜色变为红色,并且按键盘上的+和-可以对其进行缩放,缩放系数默认为1,最小为1,每按 + 一次,缩放系数+1,每按 - 一次,缩放系数-1

Update中添加按加号减号修改比例逻辑,和上节课类似,不过修改obj为GameObject类型且为私有的,而且要obj不为空才进逻辑

private GameObject obj = null;  // 当前被射线检测到的物体
private int scaleFactor = 1;  // 缩放因子,默认为1

if (obj != null)
{
    // 按下 "+" 或 "numpad +" 键
    if (Keyboard.current.numpadPlusKey.wasPressedThisFrame ||
        Keyboard.current.equalsKey.wasPressedThisFrame)
    {
        scaleFactor += 1;  // 缩放因子增加1
        obj.transform.localScale = Vector3.one * scaleFactor;  // 根据缩放因子调整物体的缩放比例
    }

    // 按下 "-" 或 "numpad -" 键
    if (Keyboard.current.numpadMinusKey.wasPressedThisFrame ||
        Keyboard.current.minusKey.wasPressedThisFrame)
    {
        scaleFactor -= 1;  // 缩放因子减少1
        if (scaleFactor < 1)
            scaleFactor = 1;  // 确保缩放因子不会小于1
        obj.transform.localScale = Vector3.one * scaleFactor;  // 根据缩放因子调整物体的缩放比例
    }
}

Update中添加鼠标左键按下进行射线检测逻辑,检测发出的射线有没有碰到对象

// 鼠标左键按下才进行射线检测
if (Mouse.current.leftButton.wasPressedThisFrame)
{
    RaycastHit info;

    //摄像机发射射线到鼠标点击位置上 屏幕坐标转场景坐标
    if (Physics.Raycast(Camera.main.ScreenPointToRay(Mouse.current.position.ReadValue()), out info))
    {
        obj = info.collider.gameObject;  // 获取射线检测到的物体
    }
    else
    {
        obj = null;
    }
}

创建红色材质球外部关联,创建默认材质球变量。每次点击到对象后设置好默认材质球,修改对象上的材质球为红色材质。没点到对象就修改上一对象的材质球为默认,默认材质球和obj都置空

public Material redMaterial;  // 红色的材质球
private Material normalMaterial;  // 原始的材质球

// 鼠标左键按下才进行射线检测
if (Mouse.current.leftButton.wasPressedThisFrame)
{
    RaycastHit info;

    //摄像机发射射线到鼠标点击位置上 屏幕坐标转场景坐标
    if (Physics.Raycast(Camera.main.ScreenPointToRay(Mouse.current.position.ReadValue()), out info))
    {
        obj = info.collider.gameObject;  // 获取射线检测到的物体
        normalMaterial = obj.GetComponent<MeshRenderer>().material;  // 获取物体的原始材质球
        obj.GetComponent<MeshRenderer>().material = redMaterial;  // 将物体的材质球设置为红色
    }
    else
    {
        // 还原材质球
        if (obj != null)
            obj.GetComponent<MeshRenderer>().material = normalMaterial;
        normalMaterial = null;
        obj = null;
    }
}

4.4 练习题代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;

public class Lesson04_练习题 : MonoBehaviour
{
    //利用目前所学知识
    //用新输入系统的鼠标键盘输入制作一个这样的功能
    //场景上有一个3D立方体,当鼠标点击选中它时,它的颜色变为红色
    //并且按键盘上的+和-可以对其进行缩放
    //缩放系数默认为1,最小为1
    //每按 + 一次,缩放系数+1
    //每按 - 一次,缩放系数-1

    public Material redMaterial;  // 红色的材质球
    private Material normalMaterial;  // 原始的材质球
    private GameObject obj = null;  // 当前被射线检测到的物体
    private int scaleFactor = 1;  // 缩放因子,默认为1

    void Update()
    {
        // 鼠标左键按下才进行射线检测
        if (Mouse.current.leftButton.wasPressedThisFrame)
        {
            RaycastHit info;

            //摄像机发射射线到鼠标点击位置上 屏幕坐标转场景坐标
            if (Physics.Raycast(Camera.main.ScreenPointToRay(Mouse.current.position.ReadValue()), out info))
            {
                obj = info.collider.gameObject;  // 获取射线检测到的物体
                normalMaterial = obj.GetComponent<MeshRenderer>().material;  // 获取物体的原始材质球
                obj.GetComponent<MeshRenderer>().material = redMaterial;  // 将物体的材质球设置为红色
            }
            else
            {
                // 还原材质球
                if (obj != null)
                    obj.GetComponent<MeshRenderer>().material = normalMaterial;
                normalMaterial = null;
                obj = null;
            }
        }


        if (obj != null)
        {
            // 按下 "+" 或 "numpad +" 键
            if (Keyboard.current.numpadPlusKey.wasPressedThisFrame ||
                Keyboard.current.equalsKey.wasPressedThisFrame)
            {
                scaleFactor += 1;  // 缩放因子增加1
                obj.transform.localScale = Vector3.one * scaleFactor;  // 根据缩放因子调整物体的缩放比例
            }

            // 按下 "-" 或 "numpad -" 键
            if (Keyboard.current.numpadMinusKey.wasPressedThisFrame ||
                Keyboard.current.minusKey.wasPressedThisFrame)
            {
                scaleFactor -= 1;  // 缩放因子减少1
                if (scaleFactor < 1)
                    scaleFactor = 1;  // 确保缩放因子不会小于1
                obj.transform.localScale = Vector3.one * scaleFactor;  // 根据缩放因子调整物体的缩放比例
            }
        }
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏