您的位置:首页 > 移动开发 > Unity3D

Unity 5.2.3 Android 开发入门

2015-12-29 16:04 447 查看
1. 安装 Android 开发环境

Java, Android SDK, Eclipse,NDK 都要下载到位;

2. 下载 Unity 软件:

Unity 5.2.3:
http://pan.baidu.com/s/1kT6gTDl 密码:mmla

3. 安装 Unity 后,需要创建一个账号,然后使用这个账号登陆

登陆后创建一个 Test1的工程,在启动的界面,选择菜单 Edit->Preferences,然后点击 External Tools,在右边 Android 一列,填入 SDK,JDK,NDK的路径。

NDK目前只能用 r10b版本的,先不管它。

4. 选择菜单 File->Build Settings,选择下面的 Android 图标,然后点击 Switch Platform 按钮,然后点击 Player Settings按钮, 会弹出 Settings for Android窗口,

选择 Other Settings,在 Identification 一列填写 Bundle Identifier:com.example.UnityTest1,这个不填会报错误,其他配置自己看情况设置。

5. 点击 Build SEttings 窗口的 Build & Run 按钮,连接手机到电脑,就会在手机上安装编译好的程序。

注意在开发 Android 插件程序时用到的 classes.jar文件在下面这个位置:

C:\Program Files\Unity\Editor\Data\PlaybackEngines\androidplayer\Variations\mono\Development\Classes

6. 使用 Eclipse 创建 Android 工程 Test1。

将上步骤的classes.jar文件添加到libs目录,然后在此文件上点击鼠标右键,在弹出菜单上选择Build Path->Add to build path

修改 MainActivity.java:

public class MainActivity extends UnityPlayerActivity  {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main); 这一行务必注释掉
}

public void StartActivity0(String name)
{
Intent intent = new Intent(this, TestActivity0.class);
intent.putExtra("name", name);
this.startActivity(intent);
}

public void StartActivity1(String name)
{
Intent intent = new Intent(this, TestActivity1.class);
intent.putExtra("name", name);
this.startActivity(intent);
}

}
新建两个Activity: TestActivity0, TestActivity1:

public class TestActivity0 extends Activity {
private TextView tv;
private Button bn;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_activity0);
tv = (TextView)findViewById(R.id.ta0_tv);
bn = (Button)findViewById(R.id.ta0_bn);

Intent intent = getIntent();
if(intent != null && intent.getStringExtra("name")!=null){
tv.setText(intent.getStringExtra("name"));
}
bn.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
TestActivity0.this.finish();
}
});
}

}


public class TestActivity1 extends Activity {
private TextView tv;
private Button bn;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_activity1);
tv = (TextView)findViewById(R.id.ta1_tv);
bn = (Button)findViewById(R.id.ta1_bn);

Intent intent = getIntent();
if(intent != null && intent.getStringExtra("name")!=null){
tv.setText(intent.getStringExtra("name"));
}
bn.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
TestActivity1.this.finish();
}
});
}

}


注意修改 layout文件:

activity_test_activity0.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.jwaoo.unit1.TestActivity0" >

<TextView
android:id="@+id/ta0_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
<Button android:id="@+id/ta0_bn"
android:layout_below="@id/ta0_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button for Activity0"
/>

</RelativeLayout>
activity_test_activity1.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.jwaoo.unit1.TestActivity1" >

<TextView
android:id="@+id/ta1_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />

<Button
android:id="@+id/ta1_bn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/ta1_tv"
android:layout_below="@+id/ta1_tv"
android:text="Button for Activity1" />

</RelativeLayout>


修改 AndroidManifest.xml文件,主要是将三个Activity都置为全屏:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.jwaoo.unit1"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="21" />

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:name=".TestActivity0"
android:label="@string/title_activity_test_activity0" >
</activity>
<activity
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:name=".TestActivity1"
android:label="@string/title_activity_test_activity1" >
</activity>
</application>

</manifest>


使用 Eclipse 进行编译工程。

使用命令行进入 bin\classes目录,把子目录里生成的 R*.class文件都删掉,因为 Unity 也会编译 res 目录,这样会产生重复。

然后使用命令 jar -cvf Test1.jar * 这样会在bin\classes目录下生成Test1.jar文件;

或者有个更简单的办法,用鼠标选中src,然后右键选择导出,这样导出的 jar 就跟使用命令生成的一样。

7. 切换到Unity界面,在 Test1工程里面添加内容:

在 Project 详情页面选择 Assets,然后点击Create按钮,创建Plugins目录,然后再创建Android子目录:

a. 创建 bin 目录,把上步产生的 Test1.jar 文件复制到此处;

b. 把Eclipse工程的 res文件夹,libs文件夹和 AndroidManifest.xml 文件复制到 Android 子目录,删除libs文件夹下面的classes.jar文件;

8. 在 Assets目录下创建Scripts目录,

然后点击Create按钮,选择C# Script,然后重命名这个文件为 Test,双击编辑内容:

这时候会启动Visual Studio,需要些时间。默认调用的是 Visual Studio Community 2015, 免费的,但是需要注册下账号。

使用下来,Visual Studio 不如内置的编辑器 MonoDevelop 好用,在菜单 Edit->Preference,启动后找到External Tools,第一项选择 Mono Develop(builtin)即可。

然后再双击Test.cs文件,则启动 Mono Develop 来编辑代码,填写如下代码:

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour {

// Use this for initialization
void Start () {
if(Input.GetKeyDown(KeyCode.Escape)||Input.GetKeyDown(KeyCode.Home)||Input.GetKeyDown(KeyCode.Menu)) {
Application.Quit();
}
}

// Update is called once per frame
void Update () {
if(GUILayout.Button("Open Activity", GUILayout.Height(80)))
{
AndroidJavaClass jc = new AndroidJavaClass("com.example.unit1");
AndroidJavaObject jo = jc.Get<AndroidJavaObject>("currentActivity");
jo.Call("StartActivity0", "Heelo Activity0 for Unity");
}
}
}


注意 Unity 界面 Assets目录下文件都不显示后缀名的。

9. 关联 MainCamera 和 Test.cs脚本

这一步很关键,不关联的话脚本得不到执行。

在主界面的 Hierarchy 窗口里面点击 Main Camera,在右边Inspecator窗口Main Camera设置项底部点击 Add Component 按钮,下面选择Scripts/Test.cs就可以了。

8. Unity界面按下 Ctrl+B 进行编译运行,这时候可能碰到以下问题:

a.Unable to convert classes into dex format.

这是因为刚才拷贝 Eclipse工程内容的时候,把 libs 目录下的classes.jar也拷贝进来了,这个文件 Unity自己本就有,所以需要删除它,然后再编译;

b.Unable to find unity activity in manifest. You need to make sure orientation attribute is set to fullSensor manually.

在 AndroidManifest.xml文件中有继承自Unity的Activity加入一行 :

<meta-data android:name="unityplayer.UnityActivity" android:value="true" />


c.OBSOLETE - Providing Android resources in Assets/Plugins/Android/res is deprecated, please move your resources to an Android Library.

这是个警告,不是错误。

这是因为把资源放在Assets/Plugins/Android/res/目录里已经不推荐了,有可能产生资源冲突。建议使用android新的aar格式,可以在 Android Studio完成。

参考这个解释:http://stackoverflow.com/questions/29498365/how-do-i-get-android-studio-to-include-resources-in-a-jar-file

d. CommandInvokationFailure: Unable to convert classes into dex format. See the Console for details.

C:/Program Files/Java/jdk1.7.0_71\bin\java.exe -Xmx2048M -Dcom.android.sdkmanager.toolsdir="D:/Android/sdk\tools" -Dfile.encoding=UTF8 -jar "C:\Program Files\Unity\Editor\Data\PlaybackEngines\androidplayer/Tools\sdktools.jar" -

stderr[

Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/example/unit1/R;

Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/example/unit1/R$attr;

Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/example/unit1/R$dimen;

Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/example/unit1/R$drawable;

Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/example/unit1/R$id;

Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/example/unit1/R$layout;

Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/example/unit1/R$menu;

Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/example/unit1/R$string;

Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/example/unit1/R$style;

9 errors; aborting

]

这个错误网上搜了一堆都没有解决,是因为使用 Eclipse 的 Export JAR导出太多东西导致的,到处是用鼠标选中src,

然后右键选择导出,这样导出的 jar 就不含 R*了。。

如果 app 启动就闪退,要检查下 Player Settings 里面 bundle identifier 是否是 eclipse创建的工程的包名,比如com.example.unit1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: