androidunity3d教程(Unity3D游戏版本更新怎么做)

:暂无数据 2026-08-01 00:50:06 2

androidunity3d教程(Unity3D游戏版本更新怎么做)

大家好,今天小编来为大家解答以下的问题,关于androidunity3d教程,Unity3D游戏版本更新怎么做这个很多人还不知道,现在让我们一起来看看吧!

本文目录

Unity3D游戏版本更新怎么做

最近在学习android的知识,因为功能的需要,unity3d 要和android交互。最近公司的项目中遇到了unity3d 开发的app需要更新和自动安装的功能,但是使用unity3d是实现不了这样的功能的。这个时候就想到使用android原有的知识进行开发,然后打成jar包,导成插件,放到unity3d中去调用,想要找unity插件可到纳金论坛去找。
1.首先在eclipse或者android studio 中开发原有的app下载更新的功能。
*我这里是以eclipse为例开发的。
首先在eclipse中导入unity3d的jar包,class.jar,这里的class.jar在unity3d安装目录下,如下:D:\Unity5.2.3SetUp\Editor\Data\PlaybackEngines\androidplayer\Variations\il2cpp\Development\Classes
然后就要写相应的代码了,android的原有下载更新网上也有很多但是没有结合Untiy3d。具体的代码如下,首先要引入import com.unity3d.player.UnityPlayer,然后activity继承UnityPlayerActivity
package com.example.downapk;
import java.io.File;
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.Menu;
public class MainActivity extends UnityPlayerActivity
{
private static String tag = "MainActivity";
private Handler mHandler = new Handler()
{
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 1:
OpenFile();
break;
default:
break;
}
}
};
private AsyncTaskUtil mDownloadAsyncTask;
public float size;
public static MainActivity instance;
public static MainActivity getInstance()
{
return instance;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
instance = this;
}
public void SetSize(float size)
{
size = this.size;
Log.d(tag, this.size+"");
}
***隐藏网址***
{
mDownloadAsyncTask = new AsyncTaskUtil(MainActivity.this, mHandler);
***隐藏网址***
}
private void OpenFile() {
String str = "/test.apk";
String fileName = mDownloadAsyncTask.getFolderPath() + str;
File file = new File(fileName);
if (!file.exists()) {
Log.d("URL", "fileName:" + fileName);
}
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file),
"application/vnd.android.package-archive");
Log.d("URL", "fileName:" + fileName);
startActivity(intent);
}
}
上面代码是主activity 表黑部分是要在unity中调用的。调用可以是一个按钮,例如
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic《AndroidJavaObject》("currentActivity");
jo.Call("StartLoad", ParentApp.getInstance().updateUrl, "test.apk");
这里是使用AsyncTask进行下载的,在后来可以看到下载进度。下面下载的代码。
package com.example.downapk;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.text.DecimalFormat;
import java.util.Timer;
import java.util.TimerTask;
import com.unity3d.player.UnityPlayer;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Environment;
import android.os.Handler;
import android.util.Log;
import android.widget.Toast;
public class AsyncTaskUtil extends AsyncTask《String, Double, Boolean》
{
public static final String TAG = "AsyncTaskUtil";
public static final int NOTIFICATION_PROGRESS_UPDATE = 0x10;//用于更新下载进度的标志
public static final int NOTIFICATION_PROGRESS_SUCCEED = 0x11;//表示下载成功
public static final int NOTIFICATION_PROGRESS_FAILED = 0x12;//表示下载失败
//URL
private String mUrl;
//activity
private Context mContext;
//任务定时器
private Timer mTimer;
//定时任务
private TimerTask mTask;
//主线程传递过来的handler
private Handler mHandler;
//所要下载的文件大小
private long mFileSize;
//已下载的文件大小
private long mTotalReadSize;
//AsyncTaskRunnable实现了Runnable接口,用于更新下载进度的显示
private AsyncTaskRunnable mRunnable;
//构造方法
public AsyncTaskUtil(Context context, Handler handler) {
mContext = context;
mHandler = handler;
mTimer = new Timer();
mTask = new TimerTask() {//在run方法中执行定时的任务
@Override
public void run() {
//size表示下载进度的百分比
float size = (float) mTotalReadSize * 100 / (float) mFileSize;
//通过AsyncTaskRunnable的setDatas方法下载的进度和状态(更新中、失败、成功)
mRunnable.setDatas(NOTIFICATION_PROGRESS_UPDATE, size);
//更新进度
mHandler.post(mRunnable);
}
};
mRunnable = new AsyncTaskRunnable(mContext);
}
// 执行耗时操作,params为文件名(空则写入null)
@Override
protected Boolean doInBackground(String... params) {
//任务定时器一定要启动
mTimer.schedule(mTask, 0, 500);
try {
mUrl = params;
//建立链接
URLConnection connection = new URL(mUrl).openConnection();
//获取文件大小
mFileSize = connection.getContentLength();
Log.d(TAG, "the count of the url content length is : " + mFileSize);
//获得输入流
InputStream is = connection.getInputStream();
//先建立文件夹
File fold = new File(getFolderPath());
if (!fold.exists()) {
fold.mkdirs();
}
String fileName = "";
//判断文件名:用户自定义或由url获得
if(params != null){
fileName = params;
} else{
fileName = getFileName(params);
}
//文件输出流
FileOutputStream fos = new FileOutputStream(new File(getFolderPath()
+ fileName));
byte;
int len;
while ((len = is.read(buff)) != -1) {
mTotalReadSize += len;
MainActivity.getInstance().size = (float) mTotalReadSize * 100 / (float) mFileSize;
DecimalFormat format = new DecimalFormat("0");
UnityPlayer.UnitySendMessage("UI Root","GetSize",format.format(MainActivity.getInstance().size)+"");
Log.d(TAG, "the count of the url content length is : " + MainActivity.getInstance().size);
fos.write(buff, 0, len);
}
fos.flush();
fos.close();
} catch (Exception e) {
//异常,下载失败
mRunnable.setDatas(NOTIFICATION_PROGRESS_FAILED, 0);
//发送显示下载失败
mHandler.post(mRunnable);
if(mTimer != null && mTask != null){
mTimer.cancel();
mTask.cancel();
}
e.printStackTrace();
return false;
}
//下载成功
mRunnable.setDatas(NOTIFICATION_PROGRESS_SUCCEED, 0);
mHandler.post(mRunnable);
if(mTimer != null && mTask != null){
mTimer.cancel();
mTask.cancel();
}
return true;
}
//由url获得文件名
private String getFileName(String string) {
return string.substring(string.lastIndexOf("/") + 1);
}
//下载文件夹路径
public String getFolderPath() {
return Environment.getExternalStorageDirectory().toString() + "/AsyncTaskDownload/";
}
// doInBackground方法之前调用,初始化UI
@Override
protected void onPreExecute() {
super.onPreExecute();
}
// 在doInBackground方法之后调用
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
if (result) {
Toast.makeText(mContext, "Download Completed ! ", Toast.LENGTH_SHORT).show();
mHandler.sendEmptyMessage(1);
} else {
Toast.makeText(mContext, "Download Failed ! ", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onProgressUpdate(Double... values) {
super.onProgressUpdate(values);
}
}
标红的地方是王unity中传的,我想要在unity中看到下载的进度,当时试了unity调用android都没有成功,后来想从android中往unity中传
UnityPlayer.UnitySendMessage("UI Root","GetSize",format.format(MainActivity.getInstance().size)+"");
UI Root 表示在untiy中有这样一个gameobject 在gameobject 上面挂着一个脚本,脚本中有一个方法名称为GetSize(),最后一个为要在unity中看到的进度。
在unity中的调用代码为
public void GetSize(string str)
{
mSize = str;
Debug.Log(mSize + "************************");
text.text = "下载进度: " + mSize + "%";
if (mSize == "100")
{
Application.Quit();
}
}

如何给unity3d工程加入依赖的android工程

有些sdk的接入是提供jar包,这样的可以简单地将jar包制作成android plugin,加入到unity工程中,打包成apk输出。
而还有一些sdk,则是提供了一个lib工程。在sdk提供的文档里说明,要在android工程中,通过添加依赖的方式来添加。但是对于unity工程,这个就有点不一样。
经过多次试验,需要步骤:
1. 将sdk工程整个工程目录【注1】,加到plugins/android/%sdk name%目录下
2. 同时导出jar包,将jar包放置到plugins/android/libs目录中。
3. 然后可以选择制作android plugin的方式,或者直接在unity3d中进行调用。
【注1:具体包含的内容为:res/目录 libs/目录 assets/目录 AndroidManifest.xml .classpath project.properties .project proguard-project.txt 以及其他,依具体情况而定】
说一下在试验过程中遇到的一个奇怪的现象。在上面的步骤中,如果跳过步骤2,使用unity3d直接生成apk(情况a),与导出eclipse工程,再使用ecliipse生成apk(情况b),会出现两种不一样的情况。在情况a中,若调用sdk的接口,会收到classnotfound的异常,而情况b则可以正常通过。通过查看unity工程/Temp/StagingArea/目录,猜测,unity只是对plugins/android/%sdk name%目录下的资源文件进行处理,而src目录下的java文件并不处理。

如何在Unity3D实现Admob

Unity3d已经支持android,如何在程序里加入admob?
***隐藏网址***
用eclipse新建一个项目UnityAd,导入admob.jar包的GoogleAdMobAdsSdk-4.1.0.jar和Unity3d程序目录下的
然后编写一个Activity继承UnityPlayerActivity。
Java代码
《!-- base permission --》
《uses-permission android:name="android.permission.INTERNET"/》
《uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/》
《uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/》
《uses-permission android:name="android.permission.READ_PHONE_STATE"/》
《!-- base permission for location--》
《uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /》
《uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /》
《!-- base permission required by chartboost and baidu--》
《uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/》
《!-- permission required by mmedia --》
《uses-permission android:name="android.permission.RECORD_AUDIO" /》
《uses-feature android:name="android.hardware.microphone" android:required="false" /》
AndroidManifest.xml写成:
Xml代码
android:value="8115000" /》
《activity android:name="com.google.android.gms.ads.AdActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" android:theme="@android:style/Theme.Translucent"/》
《!-- Amazon Mobile Ads --》
《activity android:name="com.amazon.device.ads.AdActivity"
android:configChanges="keyboardHidden|orientation|screenSize"/》
《!-- InMobi --》
《activity android:name="com.inmobi.androidsdk.IMBrowserActivity"
android:configChanges="keyboardHidden|orientation|keyboard|smallestScreenSize|screenSize"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:hardwareAccelerated="true" /》
1.找到UnityAd项目目录,把bin文件夹下的com文件夹打成jar包,jar包名为com.hsj.test.jar,将这个jar包拷贝到unity项目目录下的Assets\Plugins\Android\bin中。
2.把UnityAd项目目录下的res文件夹和AndroidManifest.xml文件拷贝到unity项目目录下的Assets\Plugins\Android。
3.在unity项目目录下的Assets\Plugins\Android中新建libs目录,把GoogleAdMobAdsSdk-4.1.0.jar拷贝到libs目录中。
4.在unity3d程序里可以看到。
5.用unity3d Build android 安装包。
6.把安装包放到虚拟机或真机上运行。
希望可以帮助到你,更多unity,就在纳金论坛。

如何提高Unity3d编译安卓apk的速度

分成二步untiy导出android工程,用android工具编译出apk .到底是你生成工程慢?还是编译apk慢?
unity一般是处理resource下资源慢,编译一般是streamassets下文件多zip慢

OK,关于androidunity3d教程和Unity3D游戏版本更新怎么做的内容到此结束了,希望对大家有所帮助。

androidunity3d教程(Unity3D游戏版本更新怎么做)

本文编辑:admin

更多文章:


网页制作与设计期末考试(网页设计考试简答题:网页开放制作包括哪些的基本流程)

网页制作与设计期末考试(网页设计考试简答题:网页开放制作包括哪些的基本流程)

大家好,如果您还对网页制作与设计期末考试不太了解,没有关系,今天就由本站为大家分享网页制作与设计期末考试的知识,包括网页设计考试简答题:网页开放制作包括哪些的基本流程的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

2026年9月7日 23:50

源程序只能在专门的机器上(一到计算机问题,请大家帮帮忙)

源程序只能在专门的机器上(一到计算机问题,请大家帮帮忙)

其实源程序只能在专门的机器上的问题并不复杂,但是又很多的朋友都不太了解一到计算机问题,请大家帮帮忙,因此呢,今天小编就来为大家分享源程序只能在专门的机器上的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

2026年9月7日 21:40

数据库管理系统和数据库系统分别侧重(数据库,数据库管理系统,数据库系统,这三个分别是什么意思并举个实例)

数据库管理系统和数据库系统分别侧重(数据库,数据库管理系统,数据库系统,这三个分别是什么意思并举个实例)

今天给各位分享数据库,数据库管理系统,数据库系统,这三个分别是什么意思并举个实例的知识,其中也会对数据库,数据库管理系统,数据库系统,这三个分别是什么意思并举个实例进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

2026年9月7日 17:00

编程语言出现的先后顺序(最早的编程语言是哪一个)

编程语言出现的先后顺序(最早的编程语言是哪一个)

今天给各位分享最早的编程语言是哪一个的知识,其中也会对最早的编程语言是哪一个进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

2026年9月7日 16:10

小程序源码有什么用(大商创小程序源码好用吗)

小程序源码有什么用(大商创小程序源码好用吗)

“小程序源码有什么用”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看小程序源码有什么用(大商创小程序源码好用吗)!

2026年9月7日 15:40

springmvc的依赖(springMVC的注入方式有哪几种,这与springMVC依赖)

springmvc的依赖(springMVC的注入方式有哪几种,这与springMVC依赖)

大家好,关于springmvc的依赖很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于springMVC的注入方式有哪几种,这与springMVC依赖的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还

2026年9月7日 14:00

it培训评价网(it培训排名机构十大IT培训机构)

it培训评价网(it培训排名机构十大IT培训机构)

这篇文章给大家聊聊关于it培训评价网,以及it培训排名机构十大IT培训机构对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

2026年9月7日 13:00

个人博客页面布局(新手站长怎样做好独立博客初期运营工作)

个人博客页面布局(新手站长怎样做好独立博客初期运营工作)

大家好,如果您还对个人博客页面布局不太了解,没有关系,今天就由本站为大家分享个人博客页面布局的知识,包括新手站长怎样做好独立博客初期运营工作的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

2026年9月7日 12:40

display flex 自动换行(overflow-y:hidden;overflow-x:auto;无效解决方法)

display flex 自动换行(overflow-y:hidden;overflow-x:auto;无效解决方法)

大家好,关于display flex 自动换行很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于overflow-y:hidden;overflow-x:auto;无效解决方法的知识点,相信应该可以解决大家的一些困惑和问题,如

2026年9月7日 11:00

小程序免认证源码(小程序源码都能干嘛)

小程序免认证源码(小程序源码都能干嘛)

本篇文章给大家谈谈小程序免认证源码,以及小程序源码都能干嘛对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

2026年9月7日 10:50

最近更新

ideapad y580(在香港买的ideapad Y580,如何在内地保修,保修多久)
2026-09-07 23:20:01 浏览:0
热门文章

yoga pro 14s carbon(yoga14s接口类型)
2026-07-03 17:50:01 浏览:5
domino directory(帮我翻译一下Recipient’s Domino Directory entry does not specify a valid Notes mail file)
2026-08-03 19:20:01 浏览:4
标签列表