unity与android交互

网上大多数都是把android的工程放到unity里来打包成.apk。但是我感觉那样不好,因为我延用了ios的思想,unity和ios交互是使用unity导出xcode工程进行二次开发,其实unity也可以导出eclipse进行二次开发,我用的版本是unity4.3,我记得之前我用4.0导出eclipse工程会生成三个.java脚本,现在只生成一个,UnityPlayerNativeActivity,不过这个类往上继承两层也是UnityPlayerActivity,都一样一样的,只能说4.3更简化了unity和android的交互,

我做了个测试完全无压力交互。

unity测试代码,

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour {
	bool isSend = false;
	// Use this for initialization
	void Start () {

	}

	// Update is called once per frame
	void Update () {

	}
	void OnGUI()
	{
		if(GUI.Button(new Rect(0,0,200,200),"one"))
		{
			using(AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
			{
				using(AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
				{
					AndroidJavaClass cls = new AndroidJavaClass("com.dilitechcompany.demotest.UnityPlayerNativeActivity");   

					//cls.CallStatic("_hideView", "one");
					jo.Call("_hideView","two");
				}
			}

		}
		if(GUI.Button(new Rect(0,200,200,200),"two"))
		{
			using(AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
			{
				using(AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
				{
					AndroidJavaClass cls = new AndroidJavaClass("com.dilitechcompany.demotest.UnityPlayerNativeActivity");   

					//cls.CallStatic("_Display", "one");
					jo.Call("_Display","two");
				}
			}

		}
		if(isSend)
		{
			GUI.Button(new Rect(200,0,200,200),"testbtn");
		}
	}
	void AndroidSendMessage(string name)
	{
		isSend = !isSend;
	}
}

注解:unity为我们提供了调用android特定的类,AndroidJavaClass、AndroidJavaObject,这个不懂的可以查文档,网上解释一大堆,不过com.unity3d.player.UnityPlayer这个我解释一下,这个写法是一种固定写法,会android一般可以理解,就是去根据这个包路径去找到这个UnityPlayer,currentActivity这个有歧义不是当前activity而是主activity,这个不知道的可以去AndroidManifest.xml去看主activity,

这是一种固定写法,参数是写死的

另外可以使用AndroidJavaClass cls_CompassActivity = new AndroidJavaClass("com.dilitechcompany.demotest.UnityPlayerNativeActivity");

就是你导出的android工程包名+主activity,其实道理一样的也可以调用成功,

这样交互的代码只能写在主activity里了。

package com.dilitechcompany.demotest;

import com.unity3d.player.UnityPlayer;
import android.app.NativeActivity;
import android.content.res.Configuration;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;

public class UnityPlayerNativeActivity extends NativeActivity
{
	protected UnityPlayer mUnityPlayer;		// don't change the name of this variable; referenced from native code

	// UnityPlayer.init() should be called before attaching the view to a layout - it will load the native code.
	// UnityPlayer.quit() should be the last thing called - it will unload the native code.
	protected void onCreate (Bundle savedInstanceState)
	{
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		super.onCreate(savedInstanceState);

		getWindow().takeSurface(null);
		setTheme(android.R.style.Theme_NoTitleBar_Fullscreen);
		getWindow().setFormat(PixelFormat.RGB_565);

		mUnityPlayer = new UnityPlayer(this);
		if (mUnityPlayer.getSettings ().getBoolean ("hide_status_bar", true))
			getWindow ().setFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN,
			                       WindowManager.LayoutParams.FLAG_FULLSCREEN);

		int glesMode = mUnityPlayer.getSettings().getInt("gles_mode", 1);
		boolean trueColor8888 = false;
		mUnityPlayer.init(glesMode, trueColor8888);

		View playerView = mUnityPlayer.getView();
		setContentView(playerView);
		playerView.requestFocus();
//		View rootView=mUnityPlayer.getView();
//
//		Toast.makeText(this, "class:"+rootView.getClass().getName(), Toast.LENGTH_LONG).show();
//
	}

	public  void _hideView(String name) {
		UnityPlayer.UnitySendMessage("Main Camera", "AndroidSendMessage", "");
		Log.v("unity3d", "hide view");
	}
	public  void _Display(String name) {
		UnityPlayer.UnitySendMessage("Main Camera", "AndroidSendMessage", "");
		Log.v("unity3d", "display");
	}
	protected void onDestroy ()
	{
		mUnityPlayer.quit();
		super.onDestroy();
	}

	// onPause()/onResume() must be sent to UnityPlayer to enable pause and resource recreation on resume.
	protected void onPause()
	{
		super.onPause();
		mUnityPlayer.pause();
	}
	protected void onResume()
	{
		super.onResume();
		mUnityPlayer.resume();
	}
	public void onConfigurationChanged(Configuration newConfig)
	{
		super.onConfigurationChanged(newConfig);
		mUnityPlayer.configurationChanged(newConfig);
	}
	public void onWindowFocusChanged(boolean hasFocus)
	{
		super.onWindowFocusChanged(hasFocus);
		mUnityPlayer.windowFocusChanged(hasFocus);
	}
	public boolean dispatchKeyEvent(KeyEvent event)
	{
		if (event.getAction() == KeyEvent.ACTION_MULTIPLE)
			return mUnityPlayer.onKeyMultiple(event.getKeyCode(), event.getRepeatCount(), event);
		return super.dispatchKeyEvent(event);
	}

}

最后java代码附上,这也是个3dview视图,操作方便,二次开发使用,大家可以看log信息,也可以反调unity看交互验证结果。

unity与android交互

时间: 2024-10-15 13:02:30

unity与android交互的相关文章

Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

刚进公司给安排的任务就是Unity接入高德地图,算是踩了不少坑总算做出来了,抽点时间写个博客记录一下 废话不多说 先上效果图 获取定位并根据手机朝向显示周边信息            使用的Unity版本为5.5,Androad Studio 2.3.1 接下来开始讲具体操作 首先是Androad Studio的基本配置 1.创建工程,空白的就行,反正也用不到界面布局 等待创建完成 2.新建库模块: 切换到Project视图 右击你的项目 新建一个库模块-用来负责与Unity交互 当然你也可以不

unity与android交互总结

在网上找了很多教程,基本上使用的方法都是在eclipse上新建普通android工程,让主activity继承UnityPlayerActivity,然后在该activity中写供unity调用的接口或者主动要回调unity的接口,然后导出jar包到unity. 这种方式只要人品不好就会出一堆乱七八糟的问题: 如新建工程时选择SDK版本小于4.0时在unity build APK时报错,因为style.xml就不会有parent="Theme.AppCompat.Light,而是parent=&

unity和Android交互

最近在接触unity.对于unity和Android的交互,网上找了好多,大多都是一种方式,下面就说一下我使用后的心得. 首先: unity调用Android, unity代码: AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer"); AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentA

Unity 和android 交互 记录

参考文章 http://www.jianshu.com/p/c06063a403c6 趟坑如下 icon 冲突问题: 设置不了unity icon,显示的是默认的 android 小人 解决方法: 在 AndroidManifest.xml 文件添加/修改  android:icon="@drawable/app_icon", 如图:

unity 与android交互

使用eclipse新建一个Android应用工程,在新建的过程中,使得这个工程的包名和Unity工程的包名一致,我选的android版本为4.x.unity 的版本是5.4.1 然后就是要将unity的java包导入到android工程中 再后面就是导出jar包了 导出之后将jar包放入unity,也要把android工程中的res文件夹整个放入unity,下面是具体的步骤: 如何在代码中调用java的代码 以上就是所有的步骤了.希望可以帮到大家

unity与iOS、Android交互

1.Unity调iOS的方法 在首页的viewcontroller里面实现方法 void _PressButton3(const char *args) { //  UnityAppController *unityapp = (UnityAppController *)[UIApplication sharedApplication].delegate; // [unityapp ShowWindowssubview]; } 在Unity里面 直接调用 _PressButton3(conten

Unity调用Android的Activity

之前http://shuxiayeshou.blog.51cto.com/4452347/1932216 写了关于Unity与Android结合所遇到的问题及解决方法 总结一下,Unity做一个简单的场景,AndroidStudio建一个简单的项目,其中MainActivity是要继承自 UnityPlayerActivity的,这样Unity程序可以调用Android端MainActivity的方法了 那如果Android项目中还有一个NewActivity,我们要通过Unity把他打开咋办呢

Unity在Android和iOS中如何调用Native API

本文主要是对unity中如何在Android和iOS中调用Native API进行介绍. 首先unity支持在C#中调用C++ dll,这样可以在Android和iOS中提供C++接口在unity中调用.利用这一特性,可以扩展unity的功能.例如集成和调用第三方库.同时为了满足对unity接口的一致性,可以考虑在android和iOS上提供相同的接口供C#调用. 这里列举以下两个例子. 1. 1. 以弹出一个覆盖部分屏幕的webview为例来说明如何从C#调用Native接口. 2. 2. 简

unity导出android遇到的build target 错误详解

1. 导出运行后显示build target ="9",version is wrong ,can't  loaded xxx.untiy3d files 之类的,一般情况看导出的jar包内的project.properties中target 是否正确,改正后而且要clean相关项目. 2.看AndroidManifest.xml下    android:minSdkVersion和android:targetSdkVersion 是否正确,改正后refresh 3.看报错信息是否提示