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
版权归原作者 氦客 所有, 如有侵权,请联系我们删除。