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

news2024/12/26 10:50:10

最近在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 update
    public 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

@end

NS_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调用震动功能的全部代码了。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1828983.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

26.1 WEB框架介绍

1. Web应用程序 1.1 应用程序有两种模式 应用程序的架构模式主要分为两种: C/S (客户端/服务器端)和B/S(浏览器/服务器端). * 1. C/S模式, 即客户端/服务器模式(Client/Server Model): 是一种分布式计算模式.它将应用程序的功能划分为客户端和服务器端两部分.在这种模式下, 客…

【教程】设置GPU与CPU的核绑(亲和力Affinity)

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 简单来说&#xff0c;核绑&#xff0c;或者叫亲和力&#xff0c;就是将某个GPU与指定CPU核心进行绑定&#xff0c;从而尽可能提高效率。 推荐与进程优先…

虚拟机Ubuntu系统安装JDK以及配置环境不懂随时私

1、在虚拟机中打开终端&#xff1a; 如果你使用的是 Linux 发行版&#xff08;如 Ubuntu、CentOS&#xff09;&#xff0c;打开终端窗口。 2、使用 wget 命令下载 JDK&#xff1a; 首先找到你想要下载的 JDK 版本的下载链接。通常&#xff0c;你可以在 Oracle 官方网站或者 Op…

讲解 Faster R_CNN原理:

Fast R-CNN改进 上图为论文中的图片 先使用CNN网络获得整体的特征图&#xff1a;这里可以卷积共享&#xff0c;加快速度 然后将原图中的Region Proposals(区域)映射到Feature Map中&#xff0c;获得一系 列RoI(感兴趣区域) 然后不再对每个RoI分别进行分类回归&#xff0c;而是通…

无限可能LangChain——概念指南之架构

本节包含对 LangChain 关键部分的介绍。 架构 LangChain 作为一个框架由多个包组成。 langchain-core 该包包含不同组件的基本抽象以及将它们组合在一起的方法。此处定义了LLM、向量存储、检索器等核心组件的接口。这里没有定义第三方集成。依赖项有目的地保持非常轻量级。…

DenseNet完成Cifer10任务的效果验证

本文章是针对论文《2017-CVPR-DenseNet-Densely-Connected Convolutional Networks》中实验的复现&#xff0c;使用了几乎相同的超参数 目录 一、论文中的实验 1.准确率 2.参数效率 3.不同网络结构之间的比较 二、超参数: 三、复现的实验结果&#xff1a; 1.DenseNet20…

编写一个简单的Mybatis插件

1.编写一个类&#xff0c;实现Intercepter这个接口 2.完成这个类的方法&#xff0c;并通过注解Intercepts来告诉Mybatis这个插件拦截哪个类和哪个方法 3.在Mybatis的全局配置文件里注册这个插件&#xff0c;让插件生效 4.玩一个实际功能的插件

CCPD数据集

官网&#xff1a;https://github.com/detectRecog/CCPD 其它介绍&#xff1a;https://blog.csdn.net/qianbin3200896/article/details/103009221 CCPD (Chinese City Parking Dataset, ECCV) provinces ["皖", "沪", "津", "渝", &…

机床网关功能特点、实施过程以及应用效果分享-天拓四方

随着工业4.0时代的到来&#xff0c;智能制造和工业互联网技术快速发展&#xff0c;机床作为制造业的核心设备&#xff0c;其智能化、网联化的需求日益迫切。机床网关作为连接机床与上层管理系统的关键枢纽&#xff0c;其重要性不言而喻。本案例将详细介绍机床网关的解决方案&am…

数据仓库和数据库有什么区别?

一、什么是数据仓库二、什么是数据库三、数据仓库和数据库有什么区别 一、什么是数据仓库 数据仓库&#xff08;Data Warehouse&#xff09;是一种专门用于存储和管理大量结构化数据的信息系统。它通过整合来自不同来源的数据&#xff0c;为企业提供统一、一致的数据视图&…

【百度智能体】零代码创建职场高情商话术助手智能体

一、前言 作为一个程序猿&#xff0c;工科男思维&#xff0c;走上职场后&#xff0c;总会觉得自己不会处理人际关系&#xff0c;容易背锅说错话&#xff0c;这时候如果有个助手能够时时刻刻提醒自己该如何说话如何做事情就好了。 而我们现在可以通过百度文心智能体平台构建各…

[论文精读]Line Graph Neural Networks for Link Prediction

论文网址&#xff1a;Line Graph Neural Networks for Link Prediction | IEEE Journals & Magazine | IEEE Xplore 论文代码&#xff1a;GitHub - divelab/LGLP 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法…

植物大战僵尸杂交版全新版v2.1解决全屏问题

文章目录 &#x1f68b;一、植物大战僵尸杂交版❤️1. 游戏介绍&#x1f4a5;2. 如何下载《植物大战僵尸杂交版》 &#x1f680;二、解决最新2.1版的全屏问题&#x1f308;三、画质增强以及减少闪退 &#x1f68b;一、植物大战僵尸杂交版 《植物大战僵尸杂交版》是一款在原版《…

【three.js】设置canvas画布背景透明

通过Three.js渲染一个模型的时候&#xff0c;不希望canvas画布有背景颜色&#xff0c;也就是canvas画布完全透明&#xff0c;可以透过canvas画布看到画布后面叠加的HTML元素图文&#xff0c;呈现出来一种三维模型悬浮在网页上面的效果。 比如我们现在的模型背景是黑色的&#…

linxu-Ubuntu系统上卸载Kubernetes-k8s

如果您想从Ubuntu系统上卸载Kubernetes集群&#xff0c;您需要执行以下步骤&#xff1a; 1.关闭Kubernetes集群&#xff1a; 如果您的集群还在运行&#xff0c;首先您需要使用kubeadm命令来安全地关闭它&#xff1a; sudo kubeadm reset在执行该命令后&#xff0c;系统会提示…

哪些数据管理知识领域需要做到数据全生命周期管理

一、数据生命周期 数据管理、数据治理、数据安全、元数据管理、数据治理等知识领域,都需要按照数据的生命周期开展管理工作。数据生命周期包括计划、设计/启用、创建/获取、存储/维护、使用、增强和处置。详见下图。 1.数据治理生命周期 1)规划:将数据要求与业务战略连接起…

HTTP-代理

HTTP-代理 web代理服务器是网络的中间实体&#xff0c;代理位于客户端和服务器之间&#xff0c;扮演者中间人的角色&#xff0c;在各端点之间来回传递http报文 web的中间实体 web上的代理服务器是代表客户端完成事务处理的中间人&#xff0c;如果没有web代理&#xff0c;htt…

拍抖音素材段子去哪里找?哪里有搞笑段子文案以及视频素材?

拍抖音视频非常火爆&#xff0c;很多人都在为找素材发愁。别担心&#xff0c;今天我给大家推荐几个非常不错的网站&#xff0c;保证你们找到满满的灵感&#xff0c;拍出更有趣的段子视频&#xff01; 蛙学府 首先要推荐的是蛙学府。这个网站不仅素材多&#xff0c;还提供各种段…

ChatGPT 网页会话过程数据传输分析以及横向对比

新建一个会话 https://chatgpt.com/backend-api/conversation POST 请求 {"action": "next","messages": [{"id": "aaa2d6d4-5a8b-473e-bd21-e3bf2ee4f571","author": {"role": "user"},&…

matlab动画模拟三体问题,微分方程,动力学

介绍 三体问题&#xff08;Three-Body Problem&#xff09;是经典力学中的一个著名问题&#xff0c;它研究的是三个质量相似的天体在相互引力作用下的运动规律。这个问题最早由艾萨克牛顿&#xff08;Isaac Newton&#xff09;在1687年的《自然哲学的数学原理》中提出&#xf…