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"?>
<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中的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