[置顶] Unity3d SDK篇之Android开发(一)

android 项目交互 与 sdk增加指南: (完整版)

通常在处理u3d与android natvice对接时,有两种方案:

. U3D 项目交互部分方案:

  a. 使用u3d带有jni与使用jar方案直接处理,原理还是在u3d直接打包apk,其实处理过程是把相关工程的目录构建好,在u3d内进行打包完成的c# 与 java进行交互,底层的ndk部分完全忽略掉了,直接用u3d提供的jni接口交互jar中的class地址即可;

  b. 传统的方式,导出eclipse android工程采用ndk方式jni通信;


下来开始我们介绍方案a:

android 的生命周期介绍:


.制作sdk native思路: 在交互的activity中跳转到新的activity来进行显示部分;


a方案配置指南:

1.Android创建工程指南:


至少配置:(否则可能被坑)

.Minimum Required SDK:     API 14 Android 4.0

.Target SDK:                      API 19 Android 4.4

.Compile With:                   API 19 Android 5.1.1

Theme:                             ... ...


Activity Name: ... ... 

完成项目创建;


2. 项目结构:


.src:     原文件模块, 一定要追加一个包名;

.libs:     与unity对应要增加一个sdk的类库包;

.res/laytou:  布局管理模块有需求就添加;

.AndroidManifest.xml: 增加xml android项目布局器;


3. 寻找unity3d支持的libs库文件class.jar:

在u3d的安装目录下

../Contents/PlaybackEngines/AndroidPlayer/release/bin/classes.jar

../Contents/PlaybackEngines/AndroidPlayer/development/bin/classes.jar

拷贝到AndroidPlugin下的libs目录下.

进行引用一次:


建议使用release下的jar交互库;


4. 编辑要测试的布局文件:

.res/layout下的布局文件随便写,根据android native的构建原则来搞;




5. 回到src工程文件来实现部分代码:

.修改MainActivity.java:(这个文件用来跟u3d进行交互,所以不要实现 setContentView方法)

  删除   setContentView(R.layout.activity_main); 

 删除  onCreateOptionsMenu(Menu menu);

 删除  onOptionsItemSelected(MenuItem item);

 增加: 需要交互的方法 (c#(u3d) / java);

 public void StartActivity1(String name)    {   // u3d call android               

//        // TODO Auto-generated method stub          

//        Intent intent = new Intent(mContext,OpenActivity1.class);          

//        intent.putExtra("name", name);          

//        mActivity.startActivity(intent);      

    Log.e("U3D: ""StartActivity1: " + name);

 }


 public void StartActivity2(String name) // 

 {

        UnityPlayer.UnitySendMessage("Main Camera","messgae","android call             u3d sucess!!!" + name);

 }


 public void StartActivity3(String name)    {  // native 跳转 sdk等              

        // TODO Auto-generated method stub          

        Intent intent = new Intent(mContext,TestActivity0.class);          

        intent.putExtra("name", name);          

        mActivity.startActivity(intent);       

    }  


补: 如果调试中可以使用Activity

u3d接入需要修改: 

import com.unity3d.player.UnityPlayerActivity;  

public class MainActivity extends UnityPlayerActivity {//UnityPlayerActivity

// 修改后要重新进入eclipse clean and build;



6. 开始打包bin下 class目录 :

.控制台打开进入当前android工程的 bin目录下:

.执行java命令行:    jar -cvf class.jar *;

.打包出来的class.jar随意改名;



7.构建AndroidManifest文件

.创建activity 磨垮

 <activity            

            android:theme="@android:style/Theme.NoTitleBar.Fullscreen"            

            android:name=".OpenActivity1">        

 </activity>

增加权限文件:

 <uses-permission android:name="android.permission.INTERNET"></uses-permission>

. 创建初始状态android部分构建完成;




8. 进入unity3d项目设置部分;

. 新建u3d工程;

. 创建Plugins 文件夹, 创建Android文件夹 , 创建bin 文件夹, 创建  libs文件夹, 创建 res文件夹

. 拷贝AndroidManifest 到 Android;

. 拷贝生成好的jar文件到 bin;

. 拷贝第三方库到 libs;

. 拷贝当前工程下的res内容到 res内,注意检查layout;



 

9. 制作相关代码:

void Start () {

#if UNITY_EDITOR

#elif UNITY_IPHONE

#elif UNITY_ANDROID

AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");

m_activity = jc.GetStatic<AndroidJavaObject> ("currentActivity");

#endif

}


void OnGUI(){

//call hello world

if(GUI.Button(new Rect(50,50,200,40),"Open Activity download")){

m_activity.Call("StartActivity1","Unity中调出android的方法了");

}

//call hello world

if(GUI.Button(new Rect(50,250,200,40),"Open Activity N2")){

m_activity.Call("StartActivity2","Unity中调出android的方法了222");

}

}

将脚本挂入Main Camera对象上;



10. U3D BuildSetting:




11. 打包后生成apk 文件使用;



12. 搭建tomcat web 服务器:

Mac OS:http://blog.csdn.net/kaitiren/article/details/44871181 安装;



扩展部分: (跳转一个activity来实现布局或者sdk的添加部分)

1. 回到android项目中,创建相关代码过程:

Android 增加native 测试类OpenActivity1.java:


package com.example.androidplugin;  

import android.app.Activity;  

import android.os.Bundle;  

import android.view.View;  

import android.view.View.OnClickListener;  

import android.widget.Button;  

import android.widget.TextView;  

  

public class OpenActivity1 extends Activity {  

      

    @Override      

    public void onCreate(Bundle savedInstanceState) {          

        super.onCreate(savedInstanceState);          

        setContentView(R.layout.activity_main);    

        

        TextView text = (TextView)this.findViewById(R.id.textView1);          

        text.setText(this.getIntent().getStringExtra("name"));

        

        Button close = (Button)this.findViewById(R.id.button0);          

        close.setOnClickListener(new OnClickListener() {              

            public void onClick(View v) {                  

                OpenActivity1.this.finish();              

            }          

        });      

    }  

}  



MainActivity.java 中:

public Context mContext = null;//增加

public Activity mActivity = null;//增加


  protected void onCreate(Bundle savedInstanceState) {// 修改

        super.onCreate(savedInstanceState);

        mContext = this;//增加

        mActivity = this;//增加

//        setContentView(R.layout.activity_main);

    }


 public void StartActivity3(String name) // android call unity

 {

    Intent intent = new Intent(mContext,OpenActivity1.class);          

    intent.putExtra("name", name);          

    mActivity.startActivity(intent);

 }


  

xml 配置:

<?xml version="1.0" encoding="utf-8"?>

<ScrollView   

    xmlns:android="http://schemas.android.com/apk/res/android"    

    xmlns:tools="http://schemas.android.com/tools"    

    android:id="@+id/container"    

    android:layout_width="match_parent"    

    android:layout_height="match_parent"    

    tools:context="com.ITFFuture.testua.MainActivity"    

    tools:ignore="MergeRootFrame" >    

    <LinearLayout

android:orientation="vertical"

android:layout_width="match_parent"

        android:layout_height="wrap_content">              

        <TextView 

            android:id="@+id/textView0"              

            android:layout_width="fill_parent"              

            android:layout_height="wrap_content"              

            android:textColor="#000000"              

            android:textSize="18sp"              

            android:background="#00FF00"              

            android:text="测试Unity和Android之间额通讯"              

            android:gravity="center_vertical|center_horizontal"        />         

        <TextView 

            android:id="@+id/textView1"              

            android:layout_width="fill_parent"              

            android:layout_height="wrap_content"              

            android:textColor="#FFFFFF"              

            android:textSize="18sp"              

            android:background="#0000FF"              

            android:text="大家好,我是安卓的OpenActivity1"              

            android:gravity="center_vertical|center_horizontal"              />        

        <Button 

            android:id="@+id/button0"            

            android:layout_width="fill_parent"             

            android:layout_height="wrap_content"            

            android:text="关闭这个OpenActivity1"/>    

    </LinearLayout>   

</ScrollView>



AndroidManifest.xml:

<application

    ....

    <activity            

    

         android:theme="@android:style/Theme.NoTitleBar.Fullscreen"            

    

         android:name=".OpenActivity1"> (这里如果识别不到直接用包名即可)       

    

    </activity>


</application>


.编译打包到u3d的android bin文件路径下; (如果不了解查看上面第6步)

.完成java部分后记得要替换资源和 AndroidManifest.xml 到u3d中;



2. 回到u3d项目的脚本中:

//call hello world

if(GUI.Button(new Rect(50,400,200,40),"Open Activity N3")){

    m_activity.Call("StartActivity3","333333");

}

. 检查项目所有部分,打包生成新的apk,提供apk ota下载部分;

. 测试完成后进入android native sdk 模块添加:

提示: 在开发交互的模块一旦继承UnityPlayerActivity后是无法调试的,开发android native部分可以使用Activity.

android工程更换后可能无法运行,直接clean处理即可;


3. Android Native sdk的增加方式: 

.android native sdk 通常以jar包的形式存在,导入和引用到eclipse中的libs文件夹即可;

.同时也要引入u3d 的libs文件夹中,如果没有文件夹需要创建;(sdk 不提示了,添加方法如下)

.以上操作完成后进入下面操作,添加native sdk思路也是通过跳转到新的activity中进行的:


4. 在使用sdk即成,或者增加c# 与 java的交互模块后,可以从u3d导出android工程进行使用;


----------------------------------------


小技巧导出外存大小减少:

修改u3d中的android playersetting设置部分 

  --Scrpping Level *   :  Strip Byte Code;

  --Script Call Optimization : fast


下一篇讲介绍如何使用方案b进行u3d android接入开发部分.



 

你可能感兴趣的:(android,jni,unity3d,sdk)