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