【Unity開發】控制手機移動端的震動

請添加圖片描述

🐾 個人主頁 🐾

阿松愛睡覺,橫豎醒不來
🏅你可以不屠龍,但不能不磨劍🗡

目錄

  • 一、前言
  • 二、Unity的Handheld.Vibrate()
  • 三、調用Android原生代碼
  • 四、NiceVibrations插件
  • 五、DeviceVibration插件
  • 六、控制游戲手柄震動
  • 七、結語

一、前言

最近開發了一個新的功能——特定情況下讓手機震動,例如點擊界面中的按鈕,手機震動一下。這也是第一次寫移動端的震動的功能,雖然unity有自帶的控制移動設備震動的API,但是API太過于單一不太符合功能要求,因為他只有最簡單的0.5秒的震動,不能控制震動的時長和強度。然而對于一個按鈕的震動反饋來講,0.5秒的時長有點長了。

上網查閱了大量的相關的資料,最終還不錯的解決的功能的開發,所以在這里就羅列出我找到的所有能控制手機震動的API插件。

最后還有控制游戲手柄震動的API

二、Unity的Handheld.Vibrate()

這是Unity自帶的API,這個方法可以觸發移動設備的震動。我們直接看下使用的示例

// 判斷當前設備是否支持震動(最好檢查一下,萬一手機不支持或者馬達壞了有可能報錯)
if (SystemInfo.supportsVibration)
{Handheld.Vibrate();
}
else
{Debug.Log("設備不支持震動");
}

哦對了,一般是Unity自帶的API的話,也是同時支持IOS系統的,但是下面說的這個就只支持安卓系統。

三、調用Android原生代碼

這個方法是直接通過調用Android的Java API來控制震動時長的,所以為什么說只支持安卓系統不支持IOS系統,就是因為直接用的Android的Java API。直接來看下下如何使用吧。

方法還是比較簡單的,先創建一個用于調用Android原生代碼的C#腳本:

using UnityEngine;
public class VibrationManager : MonoBehaviour
{public static void Vibrate(long milliseconds){if (Application.platform == RuntimePlatform.Android){try{using (AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")){using (AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity")){using (AndroidJavaObject vibrator = currentActivity.Call<AndroidJavaObject>("getSystemService", "vibrator")){if (vibrator != null){vibrator.Call("vibrate", milliseconds);}}}}}catch (System.Exception e){Debug.LogError("VibrationManager: Error while trying to vibrate - " e.Message);}}}
}

然后就可以在需要震動的地方調用這個方法:

VibrationManager.Vibrate(1000); // 震動1000毫秒

當然你也可以直接把 Vibrate() 方法寫在要使用的腳本文件中,就不用單獨寫一個腳本弄一個靜態函數了。使用的時候就直接 Vibrate(1000) 就可以,簡介明了!

四、NiceVibrations插件

我在項目中使用的插件就是這個,這個插件靈活性很高,且簡單易操作,而且支持Android和IOS。
直接來說一下插件導入之后如何使用

首先要引入命名空間

using MoreMountains.NiceVibrations

然后就是在需要的地方調用代碼了。

// 普通的振動
MMVibrationManager.Vibrate();// 不同模式的振動
MMVibrationManager.Haptic(HapticTypes.Selection);1.HapticTypes.Selection:極輕微振動——可用于點擊按鈕2.HapticTypes.Success:普通振動——可用于游戲勝利3.HapticTypes.Warning:普通振動——可用于游戲提示4.HapticTypes.Failure:普通振動——可用于游戲失敗5.HapticTypes.LightImpact:輕微振動6.HapticTypes.MediumImpact:中度振動7.HapticTypes.HeavyImpact:重度振動8.HapticTypes.RigidImpact:強硬而時間稍長一些的振動9.HapticTypes.SoftImpact:柔軟而時間稍長一些的振動// 瞬間振動,震動時長大致只有0.1s左右
MMVibrationManager.TransientHaptic(float intensity, float sharpness);參數:float			intensity 		強度0-1float 			sharpness		感知度0-1//還有幾個默認的參數,bool 			alsoRumble = falseMonoBehaviour 	coroutineSupport = nullint 			controllerID = -1//連續的振動
MMVibrationManager.ContinuousHaptic(float intensity, float sharpness, float duration, HapticTypes fallbackOldiOS, this);
參數:float			intensity 							強度0-1float 			sharpness							感知度0-1float 			duration							持續時間HapticTypes 	fallbackOldiOS = HapticTypes.None	振動類型//控制全局的Haptic振動開啟或關閉
MMVibrationManager.SetHapticsActive(true);
MMVibrationManager.SetHapticsActive(false);//獲取設備是否支持Haptic振動
bool isSupported = MMVibrationManager.HapticsSupported();

除了上面的一下觸發震動的操作,還有一下事件的回調可以綁定,但是僅限于 MMVibrationManager.Haptic 的震動

//OnEnable進行綁定
private void OnEnable()
{MMNViOSCoreHaptics.OnHapticPatternStopped += OnHapticsStopped;MMNViOSCoreHaptics.OnHapticPatternError += OnHapticsError;MMNViOSCoreHaptics.OnHapticPatternReset += OnHapticsReset;
}//OnDisable時解除綁定
private void OnDisable()
{MMNViOSCoreHaptics.OnHapticPatternStopped -= OnHapticsStopped;MMNViOSCoreHaptics.OnHapticPatternError -= OnHapticsError;MMNViOSCoreHaptics.OnHapticPatternReset -= OnHapticsReset;
}//振動結束
protected virtual void OnHapticsStopped()
{//一些處理邏輯
}//振動錯誤
protected virtual void OnHapticsError()
{//一些處理邏輯
}//振動重置
protected virtual void OnHapticsReset()
{//一些處理邏輯
}

MMVibrationManager.TransientHapticMMVibrationManager.ContinuousHaptic 的事件也有,但是比較少,只有結束事件

private void OnEnable()
{MMNViOSCoreHaptics.OnHapticPatternStopped += OnHapticsStopped;
}private void OnDisable()
{MMNViOSCoreHaptics.OnHapticPatternStopped -= OnHapticsStopped;
}//振動結束
protected virtual void OnHapticsStopped()
{}

五、DeviceVibration插件

插件的靈活度還可以,對于日常簡單的開發就夠用了,但是導入的時候需要自己處理一下意外情況(比如報錯)。

插件里面也自帶使用的示例,有一個Scene示例場景,可以打包成移動端自己測試一下,下面就是它的示例代碼,看起來還是比較簡介的。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;namespace BrainCheck {public enum VibrationIntensity {vibrationIntensity_1,vibrationIntensity_2,vibrationIntensity_3,vibrationIntensity_4,vibrationIntensity_5,vibrationIntensity_6,vibrationWithDelay}public class DemoScript : MonoBehaviour{public VibrationIntensity myOption;void OnMouseUp() {StartCoroutine(BtnAnimation());}private IEnumerator BtnAnimation(){Vector3 originalScale = gameObject.transform.localScale;gameObject.transform.localScale = 0.9f * gameObject.transform.localScale;yield return new WaitForSeconds(0.2f);gameObject.transform.localScale = originalScale;ButtonAction();}private void ButtonAction() {switch(myOption) {case VibrationIntensity.vibrationIntensity_1:BrainCheck.VibrationIntensityBridge.vibrationIntensity_1();break;case VibrationIntensity.vibrationIntensity_2:BrainCheck.VibrationIntensityBridge.vibrationIntensity_2();break;case VibrationIntensity.vibrationIntensity_3:BrainCheck.VibrationIntensityBridge.vibrationIntensity_3();break;case VibrationIntensity.vibrationIntensity_4:BrainCheck.VibrationIntensityBridge.vibrationIntensity_4();break;case VibrationIntensity.vibrationIntensity_5:BrainCheck.VibrationIntensityBridge.vibrationIntensity_5();break;case VibrationIntensity.vibrationIntensity_6:BrainCheck.VibrationIntensityBridge.vibrationIntensity_6();break;case VibrationIntensity.vibrationWithDelay:#if UNITY_IOSBrainCheck.VibrationIntensityBridge.vibrationWithDelay(4, 6);#endif#if UNITY_ANDROIDBrainCheck.VibrationIntensityBridge.vibrationWithDelay(6000, 400);#endifbreak;}}}
}

六、控制游戲手柄震動

這個相對來說比較簡單,沒必要另外單獨一篇文章進行講述了,索性直接放在了一起說。

unity中的 Input.SetVibration 方法可以設置手柄的左右震動馬達強度。震動強度是一個0到1之間的浮點數,其中0表示無震動,1表示最大震動強度。

直接看下示例:(以Xbox手柄為例)

using UnityEngine;
public class GamepadVibrationExample : MonoBehaviour
{void Update(){// 檢測手柄按鈕輸入,例如按下"A"鍵時震動if (Input.GetKeyDown(KeyCode.JoystickButton0)) // Xbox手柄的"A"鍵通常對應JoystickButton0{// 設置手柄震動,左馬達和右馬達的震動強度分別為0.5和1.0Input.SetVibration(0, 0.5f, 1.0f);}// 檢測手柄按鈕輸入,例如按下"B"鍵時停止震動if (Input.GetKeyDown(KeyCode.JoystickButton1)) // Xbox手柄的"B"鍵通常對應JoystickButton1{// 停止手柄震動Input.SetVibration(0, 0.0f, 0.0f);}}
}

七、結語

插件就這么多,僅供交流學習,有什么問題也歡迎再評論區留言或者私信,我看到的話會及時回復,下期見,拜拜。

請添加圖片描述

請添加圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/82435.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/82435.shtml
英文地址,請注明出處:http://en.pswp.cn/web/82435.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux 軟件安裝方式全解(適用于 CentOS/RHEL 系統)

&#x1f427; Linux 軟件安裝方式全解&#xff08;適用于 CentOS/RHEL 系統&#xff09; 在 Linux 系統中&#xff0c;軟件安裝方式豐富多樣&#xff0c;常見于以下幾種方式&#xff1a; 安裝方式命令/工具說明軟件包管理器&#xff08;推薦&#xff09;yum, dnf, apt, zypp…

前端面試題-HTML篇

1. 請談談你對 Web 標準以及 W3C 的理解和認識。 我對 Web 標準 的理解是,它就像是互聯網世界的“交通規則”,由 W3C(World Wide Web Consortium,萬維網聯盟) 這樣一個國際性組織制定。這些規則規范了我們在編寫 HTML、CSS 和 JavaScript 時應該遵循的語法和行為,比如要…

ERROR: column cl.udt_name does not exist LINE 1 navicat打開金倉表報錯

描述&#xff1a; ERROR: column cl.udt_name does not exist LINE 1: …a.columns cl LEFT JOlN pg type ty ON ty.typname cl.udt nam. navicat連上金倉數據庫之后&#xff0c;想打開一張表看看&#xff0c;每張表都報這個錯&#xff0c;打不開 解決方案&#xff1a; 網上…

2025年- H61-Lc169--74.搜索二維矩陣(二分查找)--Java版

1.題目描述 2.思路 方法一&#xff1a; 定義其實坐標&#xff0c;右上角的元素&#xff08;0&#xff0c;n-1&#xff09;。進入while循環&#xff08;注意邊界條件&#xff0c;行數小于m&#xff0c;列數要&#xff1e;0&#xff09;從右上角開始開始向左遍歷&#xff08;比當…

Jupyter MCP服務器部署實戰:AI模型與Python環境無縫集成教程

Jupyter MCP 服務器是基于模型上下文協議&#xff08;Model Context Protocol, MCP&#xff09;的 Jupyter 環境擴展組件&#xff0c;它能夠實現大型語言模型與實時編碼會話的無縫集成。該服務器通過標準化的協議接口&#xff0c;使 AI 模型能夠安全地訪問和操作 Jupyter 的核心…

MySQL下載安裝配置環境變量

MySQL下載安裝配置環境變量 文章目錄 MySQL下載安裝配置環境變量一、安裝MySQL1.1 下載1.2 安裝 二、查看MySQL服務是否啟動三、配置環境變量四、驗證 一、安裝MySQL 1.1 下載 官網社區版&#xff08;免費版&#xff09;&#xff1a;https://dev.mysql.com/downloads/mysql/ …

WSL 安裝 Debian 12 后,Linux 如何安裝 curl , quickjs ?

在 WSL 的 Debian 12 系統中安裝 curl 非常簡單&#xff0c;你可以直接使用 APT 包管理器從官方倉庫安裝。以下是詳細步驟&#xff1a; 1. 更新軟件包索引 首先確保系統的包索引是最新的&#xff1a; sudo apt update2. 安裝 curl 執行以下命令安裝 curl&#xff1a; sudo…

Linux入門(十四)rpmyum

RPM 是RedHat PackManager的縮寫 rpm是用于互聯網下載包的打包及安裝工具 rpm查詢 查詢已安裝的rpm列表 rpm -qa查看系統是否安裝了psmisc rpm -qa | grep psmisc rpm -q psmisc查詢軟件包信息 rpm -qi psmisc查詢軟件包中的文件 rpm -ql psmisc根據文件全路徑 查詢文件所…

[git]忽略.gitignore文件

git rm --cached .gitignore 是一個 Git 命令,主要用于 從版本控制中移除已追蹤的 .gitignore 文件,但保留該文件在本地工作目錄中。以下是詳細解析: 一、命令拆解與核心作用 語法解析 git rm:Git 的刪除命令,用于從版本庫(Repository)中移除文件。--cached:關鍵參數…

Hive SQL 中 BY 系列關鍵字全解析:從排序、分發到分組的核心用法

一、排序與分發相關 BY 關鍵字 1. ORDER BY&#xff1a;全局統一排序 作用&#xff1a;對查詢結果進行全局排序&#xff0c;確保最終結果集完全有序&#xff08;僅允許單個 Reducer 處理數據&#xff09;。 語法&#xff1a; SELECT * FROM table_name ORDER BY column1 [A…

網絡爬蟲 - App爬蟲及代理的使用(十一)

App爬蟲及代理的使用 一、App抓包1. App爬蟲原理2. reqable的安裝與配置1. reqable安裝教程2. reqable的配置3. 模擬器的安裝與配置1. 夜神模擬器的安裝2. 夜神模擬器的配置4. 內聯調試及注意事項1. 軟件啟動順序2. 開啟抓包功能3. reqable面板功能4. 夜神模擬器設置項5. 注意事…

【25.06】FISCOBCOS使用caliper自定義測試 通過webase 單機四節點 helloworld等進行測試

前置條件 安裝一個Ubuntu20+的鏡像 基礎環境安裝 Git cURL vim jq sudo apt install -y git curl vim jq Docker和Docker-compose 這個命令會自動安裝docker sudo apt install docker-compose sudo chmod +x /usr/bin/docker-compose docker versiondocker-compose vers…

【基礎】Unity中Camera組件知識點

一、投影模式 (Projection) 1. 透視模式 (Perspective) 原理&#xff1a;模擬人眼&#xff0c;近大遠小&#xff08;錐形體視錐&#xff09; 核心參數&#xff1a; Field of View (FOV)&#xff1a;垂直視場角 典型值&#xff1a;第一人稱 60-90&#xff0c;駕駛艙 30-45 特…

PCA(K-L變換)人臉識別(python實現)

數據集分析 ORL數據集&#xff0c; 總共40個人&#xff0c;每個人拍攝10張人臉照片 照片格式為灰度圖像&#xff0c;尺寸112 * 92 特點&#xff1a; 圖像質量高&#xff0c;無需灰度運算、去噪等預處理 人臉已經位于圖像正中央&#xff0c;但部分圖像角度傾斜&#xff08;可…

【Git】View Submitted Updates——diff、show、log

在 Git 中查看更新的內容&#xff08;即工作區、暫存區或提交之間的差異&#xff09;是日常開發中的常見操作。以下是常用的命令和場景說明&#xff1a; 文章目錄 1、查看工作區與暫存區的差異2、查看提交歷史中的差異3、查看工作區與最新提交的差異4、查看兩個提交之間的差異5…

deepseek原理和項目實戰筆記2 -- deepseek核心架構

混合專家&#xff08;MoE&#xff09; ??混合專家&#xff08;Mixture of Experts, MoE&#xff09;?? 是一種機器學習模型架構&#xff0c;其核心思想是通過組合多個“專家”子模型&#xff08;通常為小型神經網絡&#xff09;來處理不同輸入&#xff0c;從而提高模型的容…

GPU層次結構(Nvidia和Apple M芯片,從硬件到pytorch)

這里寫目錄標題 0、驅動pytorch環境安裝驗證1.window環境2.Mac Apple M芯片環境 1、Nvidia顯卡驅動、CUDA、cuDNN關系匯總1**1. Nvidia顯卡驅動&#xff08;Graphics Driver&#xff09;****2. CUDA&#xff08;Compute Unified Device Architecture&#xff09;****3. cuDNN&a…

OpenWrt 搭建 samba 服務器的方法并解決 Windows 不允許訪問匿名服務器(0x80004005的錯誤)的方法

文章目錄 一、安裝所需要的軟件二、配置自動掛載三、配置 Samba 服務器四、配置 Samba 訪問用戶和密碼&#xff08;可選&#xff09;新建 Samba 專門的用戶添加無密碼的 Samba 賬戶使用root賬戶 五、解決 Windows 無法匿名訪問Samba方案一 配置無密碼的Samba賬戶并啟用匿名訪問…

CentOS 7鏡像源替換

更換為阿里云鏡像源&#xff08;適用于 CentOS 7&#xff09; 1、備份原來的 repo 文件&#xff1a; mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2、下載阿里云的 CentOS 7 repo 文件&#xff1a; curl -o /etc/yum.repos.d/CentOS-Base…

功能結構整理

C# Sxer Sxer.Base&#xff1a;基礎子功能 Sxer.Base.Debug&#xff1a;打印 Sxer.Utility&#xff1a;工具類 Sxer.CustomFunction&#xff1a;獨立功能點開發 Unity