❶ 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+"");
}
public void StartLoad(String httpUrl, String apkName)
{
mDownloadAsyncTask = new AsyncTaskUtil(MainActivity.this, mHandler);
mDownloadAsyncTask.execute(httpUrl, apkName);//必须传入两个参数——参数1:url;参数2:文件名(可以为null)
}
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[0]为url,params[1]为文件名(空则写入null)
@Override
protected Boolean doInBackground(String... params) {
//任务定时器一定要启动
mTimer.schele(mTask, 0, 500);
try {
mUrl = params[0];
//建立链接
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[1] != null){
fileName = params[1];
} else{
fileName = getFileName(params[0]);
}
//文件输出流
FileOutputStream fos = new FileOutputStream(new File(getFolderPath()
+ fileName));
byte[] buff = new byte[1024];
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();
}
}
❷ 光遇更新后脚本要更新吗
要的。
更新后一些设定也不一样了,脚本要同步才能使用。
《光·遇》是由游戏制作人陈星汉及其团队Thatgamecompany开发的社交冒险游戏,国内由网易游戏代理运营。该作于2019年6月21日在App Store发行 ,2020年7月9日在安卓平台正式上线 ,2021年6月登陆Switch 。
在游戏中,玩家将化身“光之后裔”,承载着先祖的意志,与好友携手,在天空王国的奇妙大陆上,展开一场充满奇遇的冒险 。
❸ 脚本要怎么更新
游戏的更新文件包含需要更新的全部内容,脚本不是更不更新就不能用,10年前的某个脚本到现在不更新照样能够正常运行脚本命令.建议你还是去查查相关的资料,一款游戏的内部脚本一般是不会进行频繁的修改,除非游戏新增功能.更新文件中包含需要更新的全部内容,他们的工程师可不会愚蠢到游戏在脚本上出现错误
满意请采纳
❹ 最近脚本问题,如何更新脚本
1.右击IE图标——属性——高级——选中“禁用脚本调试”,取消“显示每个脚本错误的通知”; 2.右击我的电脑图标——属性——高级——错误报告——选中“禁用错误报告”。
❺ 魔兽世界更新了,我的插件怎么更新
单体插件如果总是出错误提示,就暂时在人物选择画面的插件控制关掉它,过两天版本更新好了再更新使用。
❻ 炫舞更新后原来盘里有全P脚本能更新吗那个盘的游戏还能玩吗
如果你的那个是绑定在客户端上的,那么游戏更新版本了,你的那个就不能玩了,必须重新安装客户端,然后更新好后,在来安装全P的,才可以
❼ ps4怎么用脚本
在PS4上玩电子游戏非常有趣,但开发者有时需要修复游戏中的漏洞和小故障。幸运的是,更新PS4游戏很容易。最方便的方法是设置自动下载,允许游戏在后台或PS4处于待命模式时进行更新。另外,你也可以手动更新游戏,方法是选择你感兴趣的游戏,然后下载并安装更新。
设置自动更新分步阅读
1
/8
按手柄上的中间按钮,打开PS4。如果你看到一个额外的界面,提示你再次按下按钮,请按提示操作。在下一个界面上选择你的用户信息,你会被询问“谁在使用这个手柄?”然后,按“X”按钮。
2
/8
按下手柄并滚动到“设置”界面。设置按钮是橙色白色相间的,白色圆圈中有一个工具箱徽标。你可以在电源选项和奖杯菜单选项之间找到它。使用D-pad或左手拇指来导航到设置菜单选项,然后按下手柄上的“X”来访问它
3
/8
向下滚动菜单选项至“系统”。“系统”选项介于“协助工具”和“初始化”之间。按手柄上的“X”按钮来访问它。
4
/8
向下滚动到“自动下载/上传”。这个菜单选项是从顶部起第二个,位于“系统信息”和“语音操作设置”之间。按手柄上的“X”键来访问它。
5
/8
在“应用程序更新文件”旁边打勾。向下滚动到“应用程序更新文件”后,按手柄上的“X”按钮,就可以激活游戏和应用程序的自动下载。“应用程序更新文件”选项位于“已保存的数据”和“自动安装”选项之间。
6
/8
导航到“电源设置”菜单。在手柄上按两次“O”,回到“设置”菜单界面,然后向下滚动到“电源设置”选项。这个菜单选项旁边有一个白色的小图标,形状是两只手托起一块电池。在手柄上按“X”,滚动到菜单后就可以访问它。
7
/8
设置待命模式里的功能。选择第二个菜单选项“设定待命模式里的功能”。这样在PS4处于待命模式时,游戏也可以进行更新。如果你是Remote Play 用户,还应该选择“开启从网络打开PS4”。
8
/8
关掉电源之前,将PS4设置为待命模式。按住手柄的中间按钮,然后使用D-pad或左手拇指向下滚动到“电源”选项。向下滚动,然后选择“将PS4设定为待命模式”。
手动更新游戏
1
/4
在主菜单中选择要更新的应用程序。打开PS4并访问你的帐户后,使用D-pad或左手拇指导航到你想更新的游戏。
2
/4
通过选项菜单检查更新。当你想要更新的游戏被选中时,按手柄上的选项按钮。向下滚动到弹出的菜单中的“检查更新”选项。
3
/4
如果游戏已经准备好更新,直接去下载。如果有可用的更新,你会收到一个通知:“此应用程序的更新文件可用。”然后你就会进入下载界面。按手柄上的“X”键进入界面。
如果游戏不需要更新,PS4会通知你的。
4
/4
选择游戏并开始下载。在下载界面上,你会看到一个完整的列表,里面列出了你的应用程序和游戏的所有更新。在手柄上按“X”键选择要更新的游戏,然后确认是否要更新游戏。
更新需要时间。安装所需的时间取决于更新文件的大小。
安装更新时,你也可以玩游戏。
注意事项
tips:如果系统没有联网,你将无法更新PS4游戏。
❽ 为什么游戏更新脚本就得更新这是为什么
不知道你说的脚本是指的游戏本身内置的脚本,还是类似外外挂辅助的这种。但通常来说,游戏更新之后,脚本所对应的某些数据可能就发生了变化,所以脚本需要更新是正常的。
举例说,如果脚本里调用游戏角色血量,假设原来是内存的222222位置,但更新后变成3333333位置,这种情况下,如果脚本还是读原来的位置,无疑会出错。