0


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

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 Camera1

Virtual Camera2

绑定到

Main Camera

CameraController

组件中

在这里插入图片描述

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

通过修改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

模块,

unityLibrary

module

模块,Unity相关的代码都在

unityLibrary

这个模块里。

在这里插入图片描述

3.3 Android Studio导入项目

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

unityLibrary/res

目录下,新建

layout

文件夹,并在

layout

目录下,新建

activity_unity_player.xml

布局文件。

<?xml version="1.0" encoding="utf-8"?><FrameLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><FrameLayoutandroid:id="@+id/layout_root"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"></FrameLayout><LinearLayoutandroid:orientation="vertical"android:layout_width="wrap_content"android:layout_height="wrap_content"><Buttonandroid:id="@+id/btn_camera1"android:text="视角1"android:layout_width="wrap_content"android:layout_height="wrap_content"/><Buttonandroid: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

调用的参数1

Main Camera

对应着

Main Camera

组件的名称。

在这里插入图片描述

参数2中的

SwitchCamera1

SwitchCamera2

是我们刚才暴露的

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

标签: android 交互 Unity3D

本文转载自: https://blog.csdn.net/EthanCo/article/details/141718378
版权归原作者 氦客 所有, 如有侵权,请联系我们删除。

“Unity3D入门(三) : Android和Unity3D交互 - Android调用Unity”的评论:

还没有评论