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 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

猜你喜欢

转载自blog.csdn.net/EthanCo/article/details/141718378
今日推荐