測試使用版本Python3.4.3 七牛云存儲。
使用流程:
1.在程序目錄下創(chuàng)建對應平臺的AssetBundle包管理文件夾。格式如:\com.smallsu.ar\android\
2.把打包好的BM.data和AssetBundle文件放進去
3.把creat_json.py放進去
4.執(zhí)行creat_json.py(可以按住shift不放故慈,右鍵空白處板熊,在此處打開命令行窗口)
5.即可生成server.json
其中server.json的格式如下:
{
"bundle_id": "com.CompanyName.ProductName",
"bundle_version": "1.0.0",
"control_manager": "BM.data",
"control_scenes": [
"默認場景名1",
"默認場景名2",
"默認場景名3"
],
"control_tag": "該版本是用于XXX",
"files": [
{
"md5": "f7e0b956540676a129760a3eae309294",
"name": "BM.data",
"size": 4,
"time": "2016-03-22 14-29-02"
},
{
"md5": "5321198845e603f173027e39bf0dc103",
"name": "Book1.assetBundle",
"size": 13,
"time": "2016-03-22 14-29-02"
},
{
"md5": "5321198845e603f173027e39bf0dc103",
"name": "Book2.assetBundle",
"size": 13,
"time": "2016-03-22 14-29-02"
},
{
"md5": "f7e0b956540676a129760a3eae309294",
"name": "BM.data",
"size": 4,
"time": "2016-03-22 14-29-02"
},
{
"md5": "5321198845e603f173027e39bf0dc103",
"name": "Book1.assetBundle",
"size": 13,
"time": "2016-03-22 14-29-02"
}
]
}
需要手動在server.json當中修改相關AssetBundle的信息。修改成功之后察绷。使用uploadBundle.py把所有文件同步到七牛云即可干签。
Unity3D客戶端直接http使用get請求。獲取 https://七牛域名/com.smallsu.ar/android/server.json 即可讀取相關信息拆撼。
環(huán)境配置方法:
安裝python3.4.3 install.msi
執(zhí)行pip命令
pip install qiniu
pip install require
相關代碼:
# uploadBundle.py
import os
import sys
from easy_qiniu import SevenCow
#可獲取文件夾內全部文件名(包括子文件夾)
def get_all_files(DirectoryPath):
filenamesList = []
for dirpath, dirnames, filenames in os.walk(DirectoryPath):
"""
dirpath:當前遍歷文件夾全名
dirnames:當前文件夾內子文件夾名
filenames:當前文件夾下文件名列表(不包括子文件夾里的文件)
"""
for filename in filenames:
filenamesList.append(dirpath + '/' + filename)#全名
return filenamesList
#生成網(wǎng)站根目錄形式的文件名
def get_root_filename(fullname):
dir_path = sys.path[0]
return fullname[len(sys.path[0]) + 1:len(fullname)].replace('\\','/')
#生成{目標文件名:源文件名,...}形式的字典
def get_filenames_dict(filenamesList=[]):
filenames_dict = {}
for filename in filenamesList:
filenames_dict[get_root_filename(filename)] = filename
return filenames_dict
#上傳容劳,根據(jù)返回值判斷是否成功
def upload_into_qiniu(access_key,secret_key,bucket_name,director_path=sys.path[0]):
try:
sc = SevenCow(access_key,secret_key)
sc.delete_files(bucket_name,sc.list_file_names(bucket_name)[0])
sc.upload_files(bucket_name,get_filenames_dict(get_all_files(director_path)))
except:
return False
else:
return True
access_key = '七牛密匙'
secret_key = '七牛密匙'
bucket_name = '七牛空間名'
if(upload_into_qiniu(access_key,secret_key,bucket_name,director_path=sys.path[0])):
print('Bak Successful')
else:
print('Bak Error')
#creat_json.py
#-*-encoding:utf-8-*-
import os,sys
import hashlib
import datetime
import json
#可獲取文件夾內全部文件名(包括子文件夾)
def get_all_files(DirectoryPath):
filenamesList = []
for dirpath, dirnames, filenames in os.walk(DirectoryPath):
"""
dirpath:當前遍歷文件夾全名
dirnames:當前文件夾內子文件夾名
filenames:當前文件夾下文件名列表(不包括子文件夾里的文件)
"""
for filename in filenames:
filenamesList.append(dirpath + '/' + filename)#全名
return filenamesList
# 計算文件的MD5值
def md5_file(name):
m = hashlib.md5()
a_file = open(name, 'rb') #需要使用二進制格式讀取文件內容
m.update(a_file.read())
a_file.close()
return m.hexdigest()
# 保存文件到本地
def save(filename, contents):
fh = open(filename, 'w')
fh.write(contents)
fh.close()
# 主函數(shù)
if __name__ == "__main__":
# 獲取列表信息
pathList = get_all_files(sys.path[0])
server={}
server["bundle_id"]="com.CompanyName.ProductName"
server["bundle_version"]="1.0.0"
server["control_manager"]="BM.data"
server["control_scenes"]=[]
server["control_scenes"].append("默認場景名1")
server["control_scenes"].append("默認場景名2")
server["control_scenes"].append("默認場景名3")
server["control_tag"]="該版本是用于XXX"
server["files"]=[]
for path in pathList:
if(os.path.splitext(path)[1] in [".data",".assetBundle"]):
file={}
file["name"]=os.path.basename(path)
file["md5"]=md5_file(path)
file["size"]=os.path.getsize(path)
file["time"]=datetime.datetime.fromtimestamp(os.path.getmtime(path)).strftime("%Y-%m-%d %H-%M-%S")
server["files"].append(file)
res = json.dumps(server, sort_keys=True, indent=2, ensure_ascii=False)
print(res)
save('server.json',res)
#easy_qiniu.py
from qiniu import Auth
from qiniu import put_file
from qiniu import BucketManager
from qiniu import build_batch_stat
from qiniu import build_batch_copy
from qiniu import build_batch_move
from qiniu import build_batch_delete
from qiniu import etag
import requests
import mimetypes
#class SevenCowException(Exception):
# def __init__(self,status_code,content):
# self.url = url
# self.status_code = status_code
# self.content = content
# Exception.__init__(self, content)
class SevenCow(object):
def __init__(self, access_key,secret_key):
self.__access_key = access_key
self.__secret_key = secret_key
#使用access_key,secret_key登陸七牛闸度,得到Auth類型返回值竭贩,以它作為后續(xù)操作憑證
self.__auth = Auth(access_key, secret_key)
# 上傳本地文件(斷點續(xù)上傳、分塊并行上傳)
def upload_files(self,bucket_name='',filedict={},
mime_type='',params={'x:a': 'a'}):
"""Args:
bucket_name:'bucket_name'
filedict: {'key':'localfile',...}
mime_type: mime_type
params: eg {'x:var': 'var'}
"""
"""
params用法:
params={'x:price':'price','x:location':'location'}
html文件中:
<form method="post" action="http://upload.qiniu.com/" enctype="multipart/form-data">
<input name="key" type="hidden" value="sunflower.jpg">
<input name="x:location" type="hidden" value="Shanghai">
<input name="x:price" type="hidden" value="1500.00">
<input name="token" type="hidden" value="...">
<input name="file" type="file" />
</form>
之后用戶點擊input按鈕后莺禁,傳給http://upload.qiniu.com的請求報文就會變成:
name=sunflower.jpg&hash=Fn6qeQi4VDLQ347NiRm- \
RlQx_4O2&location=Shanghai&price=1500.00
然后七牛接受到后會將此作為回調請求的Body調用callbackUrl指定的回調服務器留量。
"""
# 上傳本地文件(斷點續(xù)上傳、分塊并行上傳)
rets = []
infos = []
for key in filedict.keys():
#上傳策略僅指定空間名和上傳后的文件名哟冬,其他參數(shù)為默認值
token = self.__auth.upload_token(bucket_name, key)
progress_handler = lambda progress, total: progress
if(mime_type == ''):
ret,info = put_file(token, key, filedict[key], params ,mime_type=mimetypes.guess_type(key)[0], progress_handler=progress_handler)
else:
ret,info = put_file(token, key, filedict[key], params ,mime_type=mime_type, progress_handler=progress_handler)
#assert ret['key'] == key
rets.append(ret)
infos.append(info)
return rets,infos
def download_files(self,url='',filedict={}):
"""Args:
url: 'url'
filedict: {'key':'localfile',...}
"""
if(url[0:4].upper() != 'HTTP'):
url = 'http://' + url
status_codes = []
for fkey in filedict.keys():
with open(filedict[fkey], "wb") as file:
r = requests.get(url + '/' + fkey,timeout=5)
status_codes.append(r.status_code)
file.write(r.content)
return status_codes
# 獲取文件信息
def get_file_info(self,bucket_name,keys=[]):
"""Args:
bucket_name:'bucket_name'
keys: ['fileName1','fileName2']
"""
bucket = BucketManager(self.__auth)
ops = build_batch_stat(bucket_name, keys)
ret, info = bucket.batch(ops)
return ret,info
# 復制文件
def copy_files(self,source_bucket,target_bucket,pathdict={}):
"""Args:
source_bucket: 'source_bucket'
target_bucket: 'target_bucket'
pathdict: {'source_file_name':'target_file_name',...}
"""
bucket = BucketManager(self.__auth)
ops = build_batch_copy(source_bucket, pathdict, target_bucket)
ret, info = bucket.batch(ops)
return ret,info
# 移動文件
def move_files(self,source_bucket,target_bucket,pathdict={}):
"""Args:
source_bucket: 'source_bucket'
target_bucket: 'target_bucket'
pathdict: {'source_file_name':'target_file_name',...}
"""
bucket = BucketManager(self.__auth)
ops = build_batch_move(source_bucket, pathdict, target_bucket)
ret, info = bucket.batch(ops)
return ret,info
# 刪除文件
def delete_files(self,source_bucket,pathlist=[]):
"""Args:
source_bucket: 'source_bucket'
pathlist: ['source_file_name',...]
"""
bucket = BucketManager(self.__auth)
ops = build_batch_delete(source_bucket, pathlist)
ret, info = bucket.batch(ops)
return ret,info
# 列出所有文件
def list_file_names(self,bucket_name, prefix=None, marker=None, limit=None, delimiter=None):
"""
Args:
bucket: 空間名
prefix: 列舉前綴
marker: 列舉標識符(首次為None)
limit: 單次列舉個數(shù)限制(默認列舉全部)
delimiter: 指定目錄分隔符
Returns:
pathlist: ['file_name',...]
"""
file_name_list = []
bucket = BucketManager(self.__auth)
marker = None
eof = False
while eof is False:
ret, eof, info = bucket.list(bucket_name, prefix=prefix, marker=marker, limit=limit)
marker = ret.get('marker', None)
for item in ret['items']:
file_name_list.append(item['key'])
return file_name_list,eof
# 抓取資源
def fetch_files_from_net_to_qiniu(self,bucket_name,pathdict={}):
"""Args:
bucket_name: 'bucket_name'
pathdict: {'source_file_name':'target_file_name',...}
"""
bucket = BucketManager(self.__auth)
rets=[]
infos=[]
for p in pathdict.keys():
ret, info = bucket.fetch(pathdict[p], bucket_name,p)
rets.append(ret)
infos.append(info)
return rets,infos
# 更新鏡像資源
def update_image_source(self,bucket_name,pathlist=[]):
"""Args:
bucket_name: 'bucket_name'
pathlist: ['file_name',...]
!需要提前對倉庫設置鏡像源!
"""
bucket = BucketManager(self.__auth)
rets=[]
infos=[]
for p in pathlist:
ret, info = bucket.prefetch(bucket_name, p)
rets.append(ret)
infos.append(info)
return rets,infos
Unity3D資源打包AssetBundle云端動態(tài)加載-Python代碼實現(xiàn)
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
- 文/潘曉璐 我一進店門平斩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人萎馅,你說我怎么就攤上這事双戳『缃” “怎么了糜芳?”我有些...
- 文/不壞的土叔 我叫張陵,是天一觀的道長魄衅。 經(jīng)常有香客問我峭竣,道長,這世上最難降的妖魔是什么晃虫? 我笑而不...
- 文/花漫 我一把揭開白布滥比。 她就那樣靜靜地躺著亚脆,像睡著了一般风范。 火紅的嫁衣襯著肌膚如雪如输。 梳的紋絲不亂的頭發(fā)上,一...
- 文/蒼蘭香墨 我猛地睜開眼蚁孔,長吁一口氣:“原來是場噩夢啊……” “哼虏杰!你這毒婦竟也來了?” 一聲冷哼從身側響起勒虾,我...
- 正文 年R本政府宣布,位于F島的核電站绣否,受9級特大地震影響誊涯,放射性物質發(fā)生泄漏。R本人自食惡果不足惜蒜撮,卻給世界環(huán)境...
- 文/蒙蒙 一暴构、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦取逾、人聲如沸耗绿。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽缭乘。三九已至,卻和暖如春琉用,著一層夾襖步出監(jiān)牢的瞬間堕绩,已是汗流浹背。 一陣腳步聲響...
推薦閱讀更多精彩內容
- 在Unity3D游戲開發(fā)過程中沫浆,因為受到游戲容量、平臺性能和熱更新等諸多因素的限制滚秩,我們可能無法將所有的游戲場景打...
- 背景: 簡單來說我們的打包工作就是hack原始包郁油,向其中注入代碼本股。ps:我們不是黑客! 原始打包(hack)方案:...
- Android多渠道打包の根據(jù)渠道來加載相應的資源文件及Java代碼 方案需求 由于不同渠道桐腌,對項目會進行一定的修...
- 異步任務相信大家應該不會陌生拄显,那么本章內容MOMO將帶領大家學習Unity中的一些異步任務。在同步加載游戲場景的時...
- 目錄 Android黑科技動態(tài)加載(一)之Java中的ClassLoaderAndroid黑科技動態(tài)加載(二)之A...