Unity3D New Input System 鼠标左键单击双击长按配置及实现接口多态用法
Posted 啊脑袋_YA
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity3D New Input System 鼠标左键单击双击长按配置及实现接口多态用法相关的知识,希望对你有一定的参考价值。
前言
如果有更好的写法或是代码有什么错误等等,还请大佬教教我。
一、New Input System配置
下载安装哪些就自己搜下怎么整吧,我这就不写了,直接写怎么配置。
首先右键—>创建—>Input Actions
这个是详细配置。
创建一个空物体
为物体添加MouseInputPlayer C#脚本(下方会写,此处先创建一个空的脚本文件)
为物体添加Player Input组件
按上图进行绑定
二、脚本配置
MouseInputPlayer.cs脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Interactions;
public class MouseInputPlayer : MonoBehaviour
private RaycastHit hit;
private bool hitBool; //是否点击到目标
private IMouseInputPlayer mouseClickInterface; //接口
private ObjectProperties mIPScriptName; // 物体属性脚本
private bool ifMouseClickInterface; // 是否存在
private bool ifObjectProperties; // 是否存在
public void OnLeftBottonClick(InputAction.CallbackContext context)
switch (context.phase)
case InputActionPhase.Started:
//Debug.Log("操作开始");
mouseClickInterface = null; //初始化接口
Ray ray = Camera.main.ScreenPointToRay(Mouse.current.position.ReadValue()); //射线
hitBool = Physics.Raycast(ray, out hit); //返回是否点击到目标
if (hitBool)
//Debug.Log("操作开始");
ifObjectProperties = hit.collider.gameObject.TryGetComponent(out objectProperties); // 获取物体属性脚本
ifMouseClickInterface = hit.collider.gameObject.TryGetComponent(out mouseClickInterface); //设置接口
break;
case InputActionPhase.Performed:
if (hitBool && ifObjectProperties)
if (context.interaction is MultiTapInteraction)
//Debug.Log("执行双击逻辑");
if (objectProperties.ifLeftMouseDblclick && ifMouseClickInterface)
mouseClickInterface.OnLeftMouseDblclick();
else if (context.interaction is HoldInteraction)
//Debug.Log("执行长按逻辑");
if (objectProperties.ifLeftMouseHold && ifMouseClickInterface)
mouseClickInterface.OnLeftMouseHold();
else
//列表中只有MultiTapInteraction和HoldInteraction对应的两种Interaction。
//故不会走到这个else里。
break;
case InputActionPhase.Canceled:
if (context.interaction is MultiTapInteraction)
//Debug.Log("执行点击逻辑");
if (hitBool && ifObjectProperties)
if (objectProperties.ifLeftMouseClick && ifMouseClickInterface)
mouseClickInterface.OnLeftMouseClick();
break;
IMouseInputPlayer.cs 接口 (无需挂载在任何物体上)(滚轮滑动方法暂时没写,后面在加上)
public interface IMouseInputPlayer
/// <summary>
/// 单击
/// </summary>
/// <param name="context"></param>
void OnLeftMouseClick();
/// <summary>
/// 长按
/// </summary>
/// <param name="context"></param>
void OnLeftMouseHold();
/// <summary>
/// 双击
/// </summary>
/// <param name="context"></param>
void OnLeftMouseDblclick();
/// <summary>
/// 滚轮滑动
/// </summary>
/// <param name="context"></param>
void OnLeftMouseRoller();
ObjectProperties.cs 物体属性脚本(挂载在需要的物体上)
(2022-2-22 更新优化了脚本,去掉了ObjectProperties.cs中的MIPScriptName变量)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObjectProperties : MonoBehaviour
public bool ifLeftMouseClick = false; //是否执行对应脚本单击事件
public bool ifLeftMouseDblclick = false; //是否执行对应脚本双击事件
public bool ifLeftMouseHold = false; //是否执行对应脚本长按事件
三、不同物体的单击、双击、长按事件测试脚本
首先是一个Cube
(2022-2-22 更新优化了脚本,去掉了ObjectProperties.cs中的MIPScriptName变量)
CubeMouseClick.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CubeMouseClick : MonoBehaviour, IMouseInputPlayer
public void OnLeftMouseClick()
Debug.Log("CubeMouseClick执行点击逻辑");
public void OnLeftMouseDblclick()
Debug.Log("CubeMouseClick执行双击逻辑");
public void OnLeftMouseHold()
Debug.Log("CubeMouseClick执行长按逻辑");
public void OnLeftMouseRoller()
接下来是一个Sphere
(2022-2-22 更新优化了脚本,去掉了ObjectProperties.cs中的MIPScriptName变量)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SphereMouseClick : MonoBehaviour, IMouseInputPlayer
public void OnLeftMouseClick()
Debug.Log("SphereMouseClick执行点击逻辑");
public void OnLeftMouseDblclick()
Debug.Log("SphereMouseClick执行双击逻辑");
public void OnLeftMouseHold()
Debug.Log("SphereMouseClick执行长按逻辑");
public void OnLeftMouseRoller()
准备工作完成,接下来开始测试
四、测试
视频好像暂时传不了
你们可以自己测一下
暂时就先截图吧
这是两个不同的,点击空白地方是没有事件执行的,也可以自己写一个默认事件,比如视角的移动旋转什么的
java异常
import java.util.Scanner; public class Exc{ public static void main(String[] args){ Scanner input=new Scanner(System.in); System.out.println("Enter two integers:"); int number1=input.nextInt(); int number2=input.nextInt(); //程序包含的是一个try块和catch块。try块包含的是正常情况下执行的代码。 //catch块包含的是number2为0时执行的代码。在这种情况下,程序会通过执行下面的语句来抛出一个异常。 try{ if(number2==0) throw new ArithmeticException("D2ivisor cannot b zero"); System.out.println(number1+" / "+number2+" is "+(number1/number2)); } //new ArithmeticException("D2ivisor cannot b zero");称为一个异常 //异常时从一个异常类创建的对象。在这种情况下,异常类就是java.lang.ArithmeticException catch(ArithmeticException ex){ System.out.println("Exception:an integer cannot be divided by zero"); } System.out.println("Execution continues..."); } } /** 当异常被抛出时,正常的流程就被中断。抛出异常就是将异常从一个地方传递到另一个地方。异常被catch块捕获。执行 catch块中的代码以处理这个异常。然后,执行catch块后的语句。 throw类似于方法的调用,不同于调用块,它调用的是catch块。从某种意义上讲,catch块就像是带参数的方法定义,这些参数 匹配抛出的值得类型。 */ import java.util.Scanner; public class Quotient { public static int quotient(int number1,int number2){ if(number2==0) throw new ArithmeticException("Divisor cannot be zero"); return number1/number2; } public static void main(String[] args){ Scanner input=new Scanner(System.in); System.out.println("Enter two integers:"); int number1=input.nextInt(); int number2=input.nextInt(); try{ int result=quotient(number1,number2); System.out.println(number1+" / "+number2+" is "+(number1/number2)); } catch(ArithmeticException ex){ System.out.println("Exception:an integer cannot be divided by zero"); } System.out.println("Execution continues..."); } } /** 异常的一个优点:它能使方法抛出一个异常给它的调用者。这个调用者可以处理该异常。异常最根本的优势试讲检测错误由调用的 方法完成,处理错误由调用方法完成中分离出来。 */
Throwable类是所有异常类的根。所有的java异常类都直接或间接地继承自Throwable。
这些异常类可以分为三类:系统错误,异常和运行时异常。
1.系统错误,由java虚拟机抛出,用Erroe类表示,描述的是内部系统错误。这样的错误很少发生。如果发生,除了通知用户以及尽量稳妥的终止程序外,几乎什么也不能做。
2.异常,是由Exception类表示的,它描述的是由程序和外部环境所引起的错误,这些错误能够被程序捕获和处理。
3.运行时异常,是由RuntimeException类表示的,它描述的是程序设计错误。例如,错误的类型转换,访问一个越界数组或数值错误。由java虚拟机抛出。
Java的异常处理模型基于三种操作:声明一个异常,抛出一个异常,捕获一个异常。
1.声明异常。Java中,当前执行的语句必属于某个方法。Java解释器调用main方法开始执行一个程序。每个方法都必须声明它可能抛出的必检异常的类型。这称为声明异常。因为任何代码都可能发生系统错误和运行时错误。为了在方法中声明一个异常,就要在方法头中使用关键字throws。eg:
public void myMethod()throws IOException
关键字throws表示myMethod方法可能会抛出异常IOException。如果方法可能抛出多个异常,在throws后加一个用逗号分隔的异常列表。
2.抛出异常。检测一个错误的程序可以创建一个正确异常类型的实例并抛出它。这称为抛出一个异常。
IllegalArgumentException ex=new IllegalArgumentException(“Wrong Argument”);
throw ex;
等同于
throw new IllegalArgumentException(“Wrong Argument”);
3.捕获异常,如果在执行try块的过程中没有出现异常,则跳过catch字句。如果try块中的某条语句抛出一个异常,java会跳过try块中剩余的语句,然后开始查找处理这个异常代码的过程。处理这个异常的代码称为异常处理器。可以从当前的方法开始,沿着方法调用链,按照异常的反向传播方向找到哦这个处理器。
本文出自 “小止” 博客,请务必保留此出处http://10541556.blog.51cto.com/10531556/1880763
以上是关于Unity3D New Input System 鼠标左键单击双击长按配置及实现接口多态用法的主要内容,如果未能解决你的问题,请参考以下文章
SerializationException:在 c# unity3d 中找不到类型'System.Collections.Generic.List`1