Unity3D入门(三) : Android和Unity3D交互 - Android调用Unity

news2024/9/28 16:28:25

1. 前言

上篇文章,我们讲了如何在Unity3D中过渡地切换相机视角。这篇文章,我们来讲一下Unity3D怎么与Android交互。

1.1 unity和Android的三种通信方式

  • Unity官方提供的接口 : 有一个弊端,它有一个传输内容量的一个限制,传输内容过大或过快的时候,会出现丢东西或崩溃的情况。
  • tcp / udp 通信: 通过socket发送和接收,通过本机地址127.0.0.1进行通讯。
  • jni : 用C++写一个中转站,生成so库,Android和Unity C#脚本分别调用这个so库。

这里我们只具体介绍一下Unity官方提供的接口,其他方式感兴趣的童鞋可以自行去了解。

2. 通过脚本切换视角

2.1 编写Camera Controller脚本

新建Camera Controller脚本,并编写如下内容

public CinemachineVirtualCamera virtualCamera1;
public CinemachineVirtualCamera virtualCamera2;

void Start()
{
    // 默认激活第一个相机
    SwitchToCamera(virtualCamera1);
}

void Update()
{
    // 按下空格键切换相机
    if (Input.GetKeyDown(KeyCode.Space))
    {
        if (virtualCamera1.enabled)
        {
            SwitchToCamera(virtualCamera2);
        }
        else
        {
            SwitchToCamera(virtualCamera1);
        }
    }
}

void SwitchToCamera(CinemachineVirtualCamera cameraToEnable)
{
    virtualCamera1.enabled = false;
    virtualCamera2.enabled = false;
    cameraToEnable.enabled = true;
}

2.2 应用Camera Controller

将Camera Controller拖动到Main Camera中

在这里插入图片描述

Virtual Camera1Virtual Camera2绑定到Main CameraCameraController组件中

在这里插入图片描述

这个时候,我们运行项目,通过键盘的空格健,就能够切换视角了。

通过修改Vitual Camera的priority,可以调整优先级,从而确定默认的Vitual Camera

3. Android调用Unity

3.1 Android中如何调用Unity

Unity官方已经给我们提供了接口UnityPlayer.UnitySendMessage

UnityPlayer.UnitySendMessage(var0,var1,var2);

通过这个接口,就能调用到Unity暴露的方法了。

来解释下这三个参数的意思

  • var0 : String类型,表示要接收消息的 Unity 游戏对象(GameObject)的名称。
  • var1 : String类型,表示在该游戏对象上要调用的方法的名称。
  • var2 : String类型,表示传递给该方法的参数(以字符串形式表示)。

实际上,UnityPlayer存在于unityLibrary/unity-classes.jar这个jar包中。unity通过这个jar包,使Android能够调用Unity

接下来,我们先来暴露下Unity脚本中的方法。

3.1 暴露方法

Camera Controller中,增加如下方法,暴露给Android

public void SwitchCamera1() {
    SwitchToCamera(virtualCamera1);
}

public void SwitchCamera2()
{
    SwitchToCamera(virtualCamera2);
}

3.2 导出项目

点击File > Build Setting,切换到Android平台,勾选Export Project

在这里插入图片描述

然后点击Export,编译并导出项目。

导出项目成功后,可以看到在目录下,生成了Android目录结构的一个Android项目。

launcher目录就是app模块,unityLibrarymodule模块,Unity相关的代码都在unityLibrary这个模块里。

在这里插入图片描述

3.3 Android Studio导入项目

我们用Android Studio(最好用最新版本)导入这个项目。

unityLibrary/res目录下,新建layout文件夹,并在layout目录下,新建activity_unity_player.xml布局文件。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:id="@+id/layout_root"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </FrameLayout>

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <Button
            android:id="@+id/btn_camera1"
            android:text="视角1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <Button
            android:id="@+id/btn_camera2"
            android:text="视角2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

    </LinearLayout>
</FrameLayout>

修改UnityPlayerActivity.java的onCreate方法

@Override protected void onCreate(Bundle savedInstanceState)
    {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);

        String cmdLine = updateUnityCommandLineArguments(getIntent().getStringExtra("unity"));
        getIntent().putExtra("unity", cmdLine);

        setContentView(R.layout.activity_unity_player);
        mUnityPlayer = new UnityPlayer(this, this);
        FrameLayout layoutRoot = findViewById(R.id.layout_root);
        layoutRoot.addView(mUnityPlayer);
        mUnityPlayer.requestFocus();

        Button btnCamera1 = findViewById(R.id.btn_camera1);
        Button btnCamera2 = findViewById(R.id.btn_camera2);
        btnCamera1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                UnityPlayer.UnitySendMessage("Main Camera","SwitchCamera1","");
            }
        });
        btnCamera2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                UnityPlayer.UnitySendMessage("Main Camera","SwitchCamera2","");
            }
        });
    }

这里UnitySendMessage调用的参数1Main Camera对应着Main Camera组件的名称。

在这里插入图片描述

参数2中的SwitchCamera1SwitchCamera2是我们刚才暴露的Unity脚本方法。

参数3由于暴露的方法没有传参,传空字符串即可。

3.4 运行Android项目

接着点击运行Android项目,可以发现,点击按钮后能够过渡地切换视角了。

在这里插入图片描述

3.5 调用带参数的方法

调用带参数的方法也是一样的

Unity脚本暴露方法

public void SwitchCameraString(string id)
{
    if (id.Equals("1"))
    {
        SwitchToCamera(virtualCamera1);
    }
    else if (id.Equals("2"))
    {
        SwitchToCamera(virtualCamera2);
    }
    else
    {
        SwitchToCamera(virtualCamera1);
    }
}

Android中进行调用

//切换视角1
UnityPlayer.UnitySendMessage("Main Camera","SwitchCameraString","1");
//切换视角2
UnityPlayer.UnitySendMessage("Main Camera","SwitchCameraString","2");

4. Unity3D入门系列文章

Unity3D入门(一) : 第一个Unity3D项目,实现矩形自动旋转,并导出到Android运行
Unity3D入门(二) :Unity3D过渡切换视角
Unity3D入门(三) : Android和Unity3D交互 - Android调用Unity
Unity3D入门(四) : Android和Unity3D交互 - Unity调用Android

参考
将Unity用作Android应用中的库_哔哩哔哩_bilibili
【Unity安卓】使用AndroidStudio与Unity进行简单通讯_哔哩哔哩_bilibili
Unity和Android通信_哔哩哔哩_bilibili
Unity与Android之间的通信交互_哔哩哔哩_bilibili
如何使用AndroidStudio和Untiy3D交互?_哔哩哔哩_bilibili

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

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

相关文章

Java---异常及处理

一.异常 1.概念 程序的非正常执行。高级语言都有异常处理机制&#xff08;C&#xff0c;Java&#xff09; 2.一般处理异常的方法 Scanner sc new Scanner(System.in);System.out.println("请输入一个数字:");String s sc.nextLine();if (s.matches("[0-9]&qu…

数据结构 - 排序算法

一.冒泡排序 /*** description: 冒泡排序* param - a : 要进行排序的数组的指针* param - length : 数组中元素的个数* return : 无 */ void Bubble_sort(int *a,int length) {int temp,i,j;for(i 0;i < length -1;i){for(j…

基于SpringBoot+Vue的小儿推拿培训管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

SSM框架VUE电影售票管理系统开发mysql数据库redis设计java编程计算机网页源码maven项目

一、源码特点 smm VUE电影售票管理系统是一套完善的完整信息管理类型系统&#xff0c;结合SSM框架和VUE、redis完成本系统&#xff0c;对理解vue java编程开发语言有帮助系统采用ssm框架&#xff08;MVC模式开发&#xff09;&#xff0c;系 统具有完整的源代码和数据库&#…

Vue devtools 插件

一、安装 去这下载https://chrome.zzzmh.cn/ 打开chrome的扩展程序 再打开开发模式 把刚才下载的拖到这里 然后把它固定到工具栏 就是这样了。 二、使用 程序通过open on live server后&#xff0c;打开开发者工具&#xff0c;找到vue就可以了。 这是代码 <div id"ap…

C++ 基础入门-命名空间、c++的输入输出、缺省参数、函数重载、引用、内联函数超详细讲解

这篇文章主要对c的学习做一个基础铺垫&#xff0c;方便后续学习。主要通过示例讲解命名空间、c的输入输出cout\cin&#xff0c;缺省参数、函数重载、引用、内联函数&#xff0c;auto关键字&#xff0c;for循环&#xff0c;nullptr以及涉及到的周边知识&#xff0c;面试题等。为…

遍历递归数结构,修改里的disabled值

返回参数中新增字段 disabled,后端给的值为1和2, disabled1时&#xff0c;代表该节点需要置灰&#xff0c;不可选中 现在需要将disabled的值,改为布尔类型; 后端给的数结构是对象类型,tree接收数组类型; 先将对象类型的数据,遍历递归,修改里面的disabled值,最后再加[ ],改为…

Magnific推V2图像生成服务 可直出4K图像

人工智能 - Ai工具集 - 集合全球ai人工智能软件的工具箱网站 近日&#xff0c;AI图像处理领域再迎重大突破&#xff0c;Magnific推出的V2图像生成服务引领行业潮流。此次升级&#xff0c;不仅使Magnific从高端软件跻身为顶级AI图像生成器&#xff0c;更彰显了其在技术创新及用…

html+css+js实现Progress 进度条

实现效果 代码实现 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>progress</title><st…

动手学深度学习(李沐)PyTorch 第 4 章 多层感知机

4.1 多层感知机 隐藏层 我们在 3.1.1.1节中描述了仿射变换&#xff0c; 它是一种带有偏置项的线性变换。 首先&#xff0c;回想一下如 图3.4.1中所示的softmax回归的模型架构。 该模型通过单个仿射变换将我们的输入直接映射到输出&#xff0c;然后进行softmax操作。 如果我们…

5V继电器模块详解(STM32)

目录 一、介绍 二、模块原理 1.原理图 2.引脚描述 3.工作原理介绍 三、程序设计 main.c文件 relay.h文件 relay.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 继电器(Relay)&#xff0c;也称电驿&#xff0c;是一种电子控制器件&#xff0c;它具有控制系统…

力扣75道热门算法题 第一天

1768、交替合并字符串 题解&#xff1a; class Solution {public String mergeAlternately(String word1, String word2) {int m word1.length(),n word2.length();int i 0, j 0; //双指针遍历两个数组StringBuilder sb new StringBuilder(); //生成一个StringBuilder对象…

如何禁止电脑上某个软件运行?电脑设置禁止运行软件的4个方法速成

在日常使用电脑的过程中&#xff0c;可能会遇到需要禁止某些软件运行的情况。 无论是为了防止员工随意使用与工作无关的软件&#xff0c;还是为了管理孩子的电脑使用时间&#xff0c;禁止特定软件运行都是有效的解决方案。 下面介绍4个速成方法&#xff0c;帮你轻松禁止电脑上…

AlmaLinux 9 安装mysql8.0.38

文件下载 https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.39-linux-glibc2.12-x86_64.tar 选择合适系统版本 下载后解压 tar -xvf mysql-8.0.39-linux-glibc2.12-x86_64.tar解压后里面有三个文件夹 使用mysql-8.0.39-linux-glibc2.12-x86_64.tar.xz即可&#xff0c…

《牧神记》PV初体验,玄机科技再塑经典国漫

2024年9月26日《牧神记》动画版在Bilibili正式宣布定档于10月27日&#xff0c;并在各大社交媒体平台上发布系列精美海报&#xff0c;瞬间点燃了广大动漫爱好者的热情与期待&#xff01;作为一个长期关注国产动画的漫迷&#xff0c;我对玄机科技的作品一直抱有很高的期待&#x…

Ubuntu 16.04安装填坑记录

一. 问题描述&#xff1a; &#xff08;1&#xff09;Ubuntu 16.04使用USB启动盘安装时&#xff0c;出现"try ubuntu without installation"或“install ubuntu”选择&#xff0c;Enter选择安装后&#xff0c;显示器黑屏无任何显示。 原因分析&#xff1a; 显示黑…

26:WDG看门狗

WDG看门狗 1、看门狗的简介2、独立看门狗3、窗口看门狗4、独立看门狗代码5、窗口看门狗代码 1、看门狗的简介 1、看门狗的作用是监控程序的运行状态。当程序因为设计漏洞、硬件故障、电磁干扰等原因&#xff0c;出现卡死或跑飞现象时&#xff0c;看门狗能及时复位程序&#xf…

现行经济下,兜底的生存方式是什么?

最近在网上看到一个问题&#xff0c;在经济下行的时候&#xff0c;兜底的生存方式是什么,看到之后&#xff0c;就随便写写。 在现在的经济环境下&#xff0c;看看网上的裁员、降薪信息 到底什么才是兜底的生存方式&#xff0c;原来认识的人&#xff0c;包括我自己也在想失业后…

知识付费APP开发指南:基于在线教育系统源码的技术详解

本篇文章&#xff0c;我们将探讨基于在线教育系统源码的知识付费APP开发的技术细节&#xff0c;帮助开发者和企业快速入门。 一、选择合适的在线教育系统源码 选择合适的在线教育系统源码是开发的关键一步。市场上有许多开源和商业化的在线教育系统源码&#xff0c;开发者需要…

《深度学习》卷积神经网络 数据增强、保存最优模型 原理解析及实例实现

目录 一、数据增强 1、什么是数据增强 2、目的 3、常用的数据增强方法 4、数据预处理 用法&#xff1a; 5、使用数据增强增加训练数据 二、保存最优模型 1、什么是保存最优模型 2、定义CNN模型 运行结果&#xff1a; 3、设置训练模式 4、设置测试模式、保存最优模…