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 鼠标左键单击双击长按配置及实现接口多态用法的主要内容,如果未能解决你的问题,请参考以下文章

Unity新版输入系统 new input system

unity3d - new 不出的单例

Unity3D input.GetAxis

unity3D中的Input按键方法检测

Unity3d镜头

SerializationException:在 c# unity3d 中找不到类型'System.Collections.Generic.List`1