当前位置: 首页 > news >正文

Unity C#调用Android,IOS震动功能

最近在Unity上需要很原生移动端进行交互,

原理:新建一个android项目,把生成的app module给干掉,然后留下一个vibrationPlugin module,在这个module下写android震动代码,将这个android工程构建出来的 aar移动到Unity项目下的Assets/Plugins/Android下,重新打包,利用 AndroidJavasClass获得unityPlayer,然后通过unityPlayer获得当前unity的activity,将unity activity的context 传递给 vibrationPlugin工程里面

现在开始整个集成的过程:

1: Android

一:新建Android项目

选择No Activity

 

 等待项目编译

编译完毕之后在 app/java/com.lck.unityvibration/目录下新建一个java文件:

package com.lck.unityviabration;import android.content.Context;
import android.os.Vibrator;public class VibrationPlugin {private static VibrationPlugin instance;private Vibrator vibrator;public VibrationPlugin(Context context) {vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);}public static VibrationPlugin getInstance(Context context) {if(instance == null) {instance = new VibrationPlugin(context);}return instance;}public void vibrate(long milliseconds) {vibrator.vibrate(milliseconds);}public void cancel() {vibrator.cancel();}
}

注意在 AndroidManifest.xml中引入 

<uses-permission android:name="android.permission.VIBRATE" />

可以把测试的无关代码删除掉

最终的项目目录:

然后把res/values和xml文件夹删除掉没啥用

 然后把 app module设置成 library

就是在app 的build.gradle中  

plugins {alias(libs.plugins.androidApplication)
} 替换成  apply plugin: 'com.android.library'

另外 module中没有 applicationId 标识,干掉:

minSdkVersion和unity android主工程保持一致

最后 Build/Make Project会生成一个aar文件,将这个文件放到unity工程里面 Plugins/Android/目录下

 二:Unity项目调用

新建Unity AndroidUtils.cs脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class AndroidUtils
{private static AndroidJavaObject vibrationPlugin;// Start is called before the first frame updatepublic static void Init(){if(Application.platform == RuntimePlatform.Android) {using(var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) {var activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");if(activity != null) {Debug.Log("has activity");}var context = activity.Call<AndroidJavaObject>("getApplicationContext");if(context != null) {Debug.Log("has context");}vibrationPlugin = new AndroidJavaObject("com.lck.unityviabration.VibrationPlugin",context);}}}public static void Vibrate(long milliseconds) {if(vibrationPlugin == null) {Debug.Log("vibrationPlugin is null");}if(Application.platform == RuntimePlatform.Android && vibrationPlugin != null) {vibrationPlugin.Call("vibrate",milliseconds);}}public static void Cancel() {if(Application.platform == RuntimePlatform.Android && vibrationPlugin != null) {vibrationPlugin.Call("cancel");}}
}

在游戏开始的时候初始化 AndroidUtils.Init()

在游戏逻辑中需要的地方调用

AndroidUtils.Vibrate(200);

Android集成完毕

2: IOS

一:IOS项目

同样的道理,跟集成Android很类似,需要在unity项目中的Plugins文件夹创建一个文件夹为IOS文件夹,里面放两个文件就可以了,NativeUtils.h和NativeUtils.mm

#import <Foundation/Foundation.h>NS_ASSUME_NONNULL_BEGIN@interface NativeUtils : NSObject@endNS_ASSUME_NONNULL_END
#import "NativeUtils.h"
#import <UIKit/UIKit.h>@implementation NativeUtils
extern "C" {void setVibrator(float Intensity) {NSLog(@"设置震动强度:%f",Intensity);UIImpactFeedbackGenerator* generator;generator = [[UIImpactFeedbackGenerator alloc] initWithStyle:UIImpactFeedbackStyleHeavy];[generator impactOccurred];}
}
@end

二:Unity项目集成

在我上面AndroidUtils.cs文件中加入两行代码就行了:

// DllImport 语句用于调用iOS插件中的C函数[DllImport("__Internal")]private static extern void setVibrator(float intensity);

调用:

public static void Vibrate(long milliseconds) {if(vibrationPlugin == null) {Debug.Log("vibrationPlugin is null");}if(Application.platform == RuntimePlatform.Android && vibrationPlugin != null) {vibrationPlugin.Call("vibrate",milliseconds);} else if(Application.platform == RuntimePlatform.IPhonePlayer) {Debug.Log("调用震动功能");setVibrator(1.5f);}}

打包到目标IOS之后会看到Xcode项目里面多了个Libraries文件夹下的Plugins文件夹,里面有IOS/NativeUtils和NativeUtils.mm文件了,这就是正确的IOS调用震动功能的全部代码了。 

相关文章:

Unity C#调用Android,IOS震动功能

最近在Unity上需要很原生移动端进行交互&#xff0c; 原理&#xff1a;新建一个android项目&#xff0c;把生成的app module给干掉&#xff0c;然后留下一个vibrationPlugin module&#xff0c;在这个module下写android震动代码&#xff0c;将这个android工程构建出来的 aar移…...

Ruby 注释

Ruby 注释 在编程中&#xff0c;注释是用于解释代码如何工作以及为什么这样编写的重要工具。Ruby作为一种解释型、面向对象的脚本语言&#xff0c;提供了灵活的注释方式&#xff0c;帮助开发者更好地组织和理解代码。本文将详细介绍Ruby中的注释类型、用法以及最佳实践。 Rub…...

C语言入门系列:特殊的main函数和exit函数

文章目录 一&#xff0c;main函数二&#xff0c;exit函数1&#xff0c;exit函数2&#xff0c;atexit()函数2.1 atexit函数的简介2.2 atexit注册的函数一定会被调用吗2.2.1 正常退出测试2.2.2 异常退出测试 一&#xff0c;main函数 一个C程序至少包含一个函数&#xff0c;这个函…...

JAVA复习3

目录 19. 下列关于 do…while 语句和 while 语句的叙述中错误的是&#xff08; C &#xff09; 20. 若有定义 int a9, b6; System.out.println(a > b) 的结果是&#xff08; D &#xff09; 21. 关于接口和抽象类&#xff0c;下列说法正确的是&#xff08;A&#xff09; …...

Oracle共享内存不释放

Oracle数据库使用共享内存来管理其系统全局区&#xff08;SGA&#xff09;和程序全局区&#xff08;PGA&#xff09;。当Oracle数据库的共享内存没有正确释放时&#xff0c;可能会导致数据库启动失败或性能问题。以下是一些可能的原因和解决方法&#xff1a; /dev/shm空间不足&…...

windows cmd中单引号和双引号的问题

文章目录 前言单引号和双引号的用法单引号双引号 示例对比Linux ShellWindows CMD PowerShell中的引号用法结论 前言 这个问题的起因是在windows cmd中运行一个简单的命令 node -e console.log(process)发现没有输出&#xff0c;但是进入node环境后&#xff0c;直接执行conso…...

Nacos 2.x 系列【15】数据源插件支持达梦、Oracel、PostgreSQL......

文章目录 1. 概述2. 持久层机制2.1 固定语句2.2 数据源插件 3. 案例演示3.1 编译已实现插件3.2 自定义插件3.3 数据库初始化3.4 插件引入3.4.1 方式一&#xff1a;引入到源码3.4.2 方式二&#xff1a;插件加载目录 3.5 修改配置3.6 测试 1. 概述 在实际项目开发中&#xff0c;…...

HJ39判断两个IP是否属于同一子网(中)

提示&#xff1a;文章 文章目录 前言一、背景二、 2.1 2.2 总结 前言 接上文HJ39判断两个IP是否属于同一子网 查了下&#xff0c;atoi可以转换负数。 修改成下面的代码 #include <stdio.h> #include <stdlib.h> #include <stdbool.h>bool isTargetSonN…...

渗透测试基础(二) Linux+Win常用命令介绍

1. Linux常用命令 1.1 解压缩相关 1.1.1 tar命令 解包&#xff1a;tar zxvf FileName.tar 打包&#xff1a;tar czvf FileName.tar DirName1.1.2 gz命令 对于.gz格式的解压1&#xff1a;gunzip FileName.gz解压2&#xff1a;gzip -d FileName.gz压缩&#xff1a;gzip FileN…...

手机usb共享网络电脑没反应的方法

适用于win10电脑&#xff0c;安卓手机上可以 开启usb网络共享选择&#xff0c;如果选择后一直跳&#xff0c;让重复选择usb选项的话&#xff0c;就开启 开发者模式&#xff0c;进到 开发者模式 里设置 默认usb 共享网络 选项 &#xff0c;就不会一直跳让你选。 1.先用数据线 连…...

Scrivener v3 解锁版安装教程 (写作辅助软件)

前言 Scrivener&#xff0c;一个多功能的写作软件&#xff0c;被世界各地的作家广泛采用&#xff0c;从小说家到剧本家&#xff0c;再到非小说类作家和学术研究者&#xff0c;它的用户群跨越了广泛的领域&#xff0c;包括学生、法律专业人士、记者和翻译。这个软件非常注重用户…...

Python开发——用什么数据储存结构复杂的数据

在Python中&#xff0c;当需要储存包含不同类型的数据时&#xff0c;可以使用以下几种数据结构&#xff1a; 1. 字典&#xff08;dict&#xff09; 字典是一种非常灵活的数据结构&#xff0c;允许使用键-值对来存储不同类型的数据。 data {"name": "Alice&quo…...

【0-1系列】从0-1快速了解搜索引擎Scope以及如何快速安装使用(下)

前言 近日&#xff0c;社区版家族正式发布V2024.5版本&#xff0c;其中&#xff0c;社区开发版系列重磅发布Scope开发版以及StellarDB开发版。 为了可以让大家更进一步了解产品&#xff0c;本系列文章从背景概念开始介绍&#xff0c;深入浅出的为读者介绍Scope的优势以及能力…...

前端核心框架Vue指令详解

目录 ▐ 关于Vue指令的介绍 ▐ v-text与v-html ▐ v-on ▐ v-model ▐ v-show与v-if ▐ v-bind ▐ v-for ▐ 前言&#xff1a;在学习Vue框架过程中&#xff0c;大家一定要多参考官方API &#xff01; Vue2官方网址https://v2.cn.vuejs.org/v2/guide/ ▐ 关于Vue指令的…...

SD卡无法读取?原因分析与数据恢复策略

一、SD卡无法读取的困境 SD卡作为便携式的存储介质&#xff0c;广泛应用于手机、相机、平板等多种电子设备中。然而&#xff0c;在使用过程中&#xff0c;我们可能会遭遇SD卡无法读取的困扰。当我们将SD卡插入设备时&#xff0c;设备无法识别SD卡&#xff0c;或者虽然识别了SD…...

线程池的工作原理

线程池可以减少创建和销毁线程的次数&#xff0c;从而减少系统资源的消耗。当一个任务&#xff08;Runnable或Callable对象&#xff09;&#xff08;Runnable无返回值&#xff0c;Callable有返回值&#xff09;被提交到线程池时&#xff1a; 一、首先判断核心线程池中的线程是…...

Nikto一键扫描Web服务器(KALI工具系列三十)

目录 1、KALI LINUX 简介 2、Nikto工具简介 3、信息收集 3.1 目标IP&#xff08;服务器) 3.2kali的IP 4、操作实例 4.1 基本扫描 4.2 扫描特定端口 4.3 保存扫描结果 4.4 指定保存格式 4.5 连接尝试 4.6 仅扫描文件上传 5、总结 1、KALI LINUX 简介 Kali Linux 是一…...

全局变量和局部变量

全局变量未初始化&#xff0c;则它的值为0&#xff1b; 局部变量未初始化&#xff0c;则它的值为随机值&#xff1b; 局部变量的作用域是变量所在的局部范围; 全局变量的作用域是整个工程; 生命周期&#xff1a; 变量的生命周期指的是变量从创建到销毁的整个阶段。 局部变量的生…...

[机器学习算法]支持向量机

支持向量机&#xff08;SVM&#xff09;是一种用于分类和回归分析的监督学习模型。SVM通过找到一个超平面来将数据点分开&#xff0c;从而实现分类。 1. 理解基本概念和理论&#xff1a; 超平面&#xff08;Hyperplane&#xff09;&#xff1a;在高维空间中&#xff0c;将数据…...

Springboot应用的信创适配

CentOS7在2024.6.30停止维护后&#xff0c;可替代的Linux操作系统-CSDN博客 全面国产化之路-信创-CSDN博客 信创适配评测-CSDN博客 Springboot应用的信创适配 Springboot应用的信创适配&#xff0c;如上图所示需要适配的很多&#xff0c;从硬件、操作系统、中间件&#xff08…...

Windows微信QQ防撤回终极指南:RevokeMsgPatcher完整使用教程

Windows微信QQ防撤回终极指南&#xff1a;RevokeMsgPatcher完整使用教程 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁&#xff08;我已经看到了&#xff0c;撤回也没用了&#xff09; 项目地址: https://gitc…...

递归的终极形态:彻底搞懂尾递归优化 (TCO)

&#x1f504; 递归的终极形态&#xff1a;彻底搞懂尾递归优化 (TCO) &#x1f914; 为什么普通递归会“爆栈”&#xff1f; 在理解尾递归之前&#xff0c;先看看普通递归发生了什么。 通俗比喻&#xff1a; 想象你在玩一个“传话游戏”&#xff0c;需要计算 1 2 3 ... n…...

OpCore Simplify:2024年黑苹果EFI自动化配置生成工具终极指南

OpCore Simplify&#xff1a;2024年黑苹果EFI自动化配置生成工具终极指南 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 你是否曾因为OpenCore配置的…...

歌词滚动姬:重新定义歌词时间轴同步的专业级工具

歌词滚动姬&#xff1a;重新定义歌词时间轴同步的专业级工具 【免费下载链接】lrc-maker 歌词滚动姬&#xff5c;可能是你所能见到的最好用的歌词制作工具 项目地址: https://gitcode.com/gh_mirrors/lr/lrc-maker 还在为歌词与音乐不同步而烦恼吗&#xff1f;是否曾经花…...

三分钟搞定全网音乐歌词:双平台智能歌词下载工具完全指南

三分钟搞定全网音乐歌词&#xff1a;双平台智能歌词下载工具完全指南 【免费下载链接】163MusicLyrics 云音乐歌词获取处理工具【网易云、QQ音乐】 项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics 还在为找不到心爱歌曲的歌词而烦恼吗&#xff1f;无…...

魔兽争霸III终极兼容性增强插件:5大核心功能解决现代系统兼容问题

魔兽争霸III终极兼容性增强插件&#xff1a;5大核心功能解决现代系统兼容问题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 你是否还在为《魔兽争霸…...

百度文心大模型如何通过Taotoken实现稳定API调用与成本控制

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 百度文心大模型如何通过Taotoken实现稳定API调用与成本控制 对于希望集成百度文心大模型进行内容生成的企业开发者而言&#xff0c…...

3步搞定Linux启动盘:Deepin Boot Maker完全使用指南

3步搞定Linux启动盘&#xff1a;Deepin Boot Maker完全使用指南 【免费下载链接】deepin-boot-maker 项目地址: https://gitcode.com/gh_mirrors/de/deepin-boot-maker 在Linux系统安装和维护过程中&#xff0c;启动盘制作是一个看似简单却充满挑战的环节。传统命令行工…...

你的边缘AI盒子为什么烫手?——散热设计的最后一道物理防线

&#x1f393;作者简介&#xff1a;科技自媒体优质创作者 &#x1f310;个人主页&#xff1a;莱歌数字-CSDN博客 211、985硕士&#xff0c;从业16年 从事结构设计、热设计、售前、产品设计、项目管理等工作&#xff0c;涉足消费电子、新能源、医疗设备、制药信息化、核工业等…...

Claude Code、Cursor、GitHub Copilot、Codex 怎么选?别再按“哪个最强”来判断了

AI 编程工具越来越像“工具箱”&#xff0c;而不是单个聊天窗口。如果你还在问“Claude Code、Cursor、Copilot、Codex 哪个最强”&#xff0c;这个问题本身就有点偏。更好的判断方式是&#xff1a;你当前的任务发生在哪里、需要改多少文件、是否需要跑测试、结果要不要进入 PR…...