AssetBundle 학습
6798 단어 unity
1. 하드디스크에 존재하는 파일.압축 가방이라고 할 수 있어요.이 압축 패키지는 여러 개의 파일을 포함하는 폴더로 볼 수 있다.각각: serialized file (자원이 깨져 대상에 놓여 있고, 마지막에는 하나의 단독 파일에 통일되어 있음), Resource files (일부 이진 자원 (그림, 소리) 는 단독으로 저장되어 빠르게 불러옵니다.
2. AssetBundle 대상은 코드를 통해 특정한 압축 패키지에서 불러온 대상을 이 대상을 불러와서 사용할 수 있다.
AssetBundle 사용 프로세스
1, 자원에 대한 AssetBundle 속성 지정
(xxxa/xxx) 여기 xxa는 디렉터리를 생성합니다. 이름은 xxx입니다.
2, AssetBundle 패키지 구축
3, AB팩 업로드
4, AB 가방과 가방 안의 자원을 탑재
시험해 보다
using UnityEditor;
public class CreateAssetBundles
{
[MenuItem("Assets/Build AssetBundles")]
static void BuildAllAssetBundles()
{
string assetBundleDirectory = "Assets/AssetBundles";
if(!Directory.Exists(assetBundleDirectory))
{
Directory.CreateDirectory(assetBundleDirectory);
}
BuildPipeline.BuildAssetBundles(assetBundleDirectory, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
}
}
AssetBundle 그룹 정책
1, 논리 엔티티 그룹
a, 하나의 UI 인터페이스 또는 모든 UI 인터페이스에 하나의 가방(이 인터페이스 안의 스티커와 레이아웃 정보는 하나의 가방)
b, 한 캐릭터 또는 모든 캐릭터에 하나의 가방(이 캐릭터 안의 모형과 애니메이션에 하나의 가방)
c, 모든 장면이 공유하는 부분의 가방(맵과 모델 포함)
2, 유형별 그룹
모든 소리 자원은 하나의 가방, 모든 shader는 하나의 가방, 모든 모형은 하나의 가방, 모든 재질은 하나의 가방으로 만든다.
3, 사용에 따라 그룹화
어느 시간 내에 사용된 모든 자원을 하나의 가방으로 만들다.관문에 따라 하나의 관문에 필요한 모든 자원은 캐릭터, 스티커, 소리 등을 포함하여 하나의 가방으로 나눌 수 있다.장면에 따라 한 장면에 필요한 자원을 하나의 가방으로 나눌 수도 있다
AssetBundle 그룹 정책 - 요약
1, 자주 업데이트되는 자원을 하나의 단독 가방에 넣고 자주 업데이트되지 않는 가방과 분리
2, 동시에 불러올 자원을 가방에 넣는다
3. 다른 가방이 공유하는 자원을 하나의 단독 가방에 넣을 수 있다
4, 동시에 불러올 작은 자원을 하나의 가방으로 포장한다
5, 같은 자원에 두 가지 버전이 있다면 접미사를 통해 v1 v2 v3 unity 3dv1 unity 3dv2를 구분하는 것을 고려할 수 있습니다
패키지 매개 변수 설명
1, Build 경로
2,BuildAssetBundleOptions
BuildAssetBundleOptions.None: LZMA 알고리즘을 사용하여 압축하면 압축된 패키지는 더 작지만 로드 시간은 더 길어집니다.사용하기 전에 전체적인 스트레스를 풀어야 한다.일단 압축이 풀리면 이 가방은 LZ4를 사용하여 다시 압축됩니다.자원을 사용할 때 전체적인 스트레스를 풀 필요가 없다.다운로드할 때 LZMA 알고리즘을 사용할 수 있으며, 다운로드가 되면 LZ4 알고리즘을 사용하여 로컬에 저장합니다.
BuildAssetBundleOptions.UncompressedAssetBundle: 압축되지 않고 가방이 크며 적재가 빠르다
BuildAssetBundleOptions.ChunkBasedCompression: LZ4 압축을 사용하면 압축률이 LZMA보다 높지 않지만, 우리는 모든 것을 풀지 않고 지정한 자원을 불러올 수 있습니다.
LZ4 압축을 사용하면 압축하지 않는 것과 비교할 수 있는 불러오는 속도를 얻을 수 있을 뿐만 아니라 압축하지 않는 파일보다 작다.
3. BuildTarget에서build에서 나온 AB 패키지를 선택할 플랫폼
AssetBundle 로드 ab 방법
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using UnityEngine.Networking;
public class LoadFromFileExample : MonoBehaviour {
// Use this for initialization
IEnumerator Start () {
string path = "AssetBundles/cubewall.unity3d";
AssetBundle ab = AssetBundle.LoadFromFile(path);
GameObject wallPrefab = ab.LoadAsset("CubeWall");
Instantiate(wallPrefab);
AssetBundle ab2 = AssetBundle.LoadFromFile("AssetBundles/share.unity3d");
Object[] objs = ab.LoadAllAssets();
foreach (Object o in objs)
{
Instantiate(o);
}
// AB LoadFromMemoryAsync
AssetBundleCreateRequest request = AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes(path));
yield return request;
AssetBundle ab = request.assetBundle;
AssetBundle ab = AssetBundle.LoadFromMemory(File.ReadAllBytes(path));
// AB LoadFromFile
AssetBundleCreateRequest request = AssetBundle.LoadFromFileAsync(path);
yield return request;
AssetBundle ab = request.assetBundle;
// AB WWW
while (Caching.ready == false)
{
yield return null;
}
file:// file:///
//WWW www = WWW.LoadFromCacheOrDownload(@"file:/E:\Unity Project Workspace\AssetBundleProject\AssetBundles\cubewall.unity3d", 1);
WWW www = WWW.LoadFromCacheOrDownload(@"http://localhost/AssetBundles/cubewall.unity3d", 1);
yield return www;
if (string.IsNullOrEmpty(www.error) == false)
{
Debug.Log(www.error); yield break;
}
AssetBundle ab = www.assetBundle;
// UnityWebRequest
//string uri = @"file:///E:\Unity Project Workspace\AssetBundleProject\AssetBundles\cubewall.unity3d";
string uri = @"http://localhost/AssetBundles/cubewall.unity3d";
UnityWebRequest request = UnityWebRequest.GetAssetBundle(uri);
yield return request.Send();
//AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request);
AssetBundle ab = (request.downloadHandler as DownloadHandlerAssetBundle).assetBundle;
//
GameObject wallPrefab = ab.LoadAsset("CubeWall");
Instantiate(wallPrefab);
AssetBundle manifestAB = AssetBundle.LoadFromFile("AssetBundles/AssetBundles");
AssetBundleManifest manifest = manifestAB.LoadAsset("AssetBundleManifest");
foreach (string name in manifest.GetAllAssetBundles())
{
print(name);
}
string[] strs = manifest.GetAllDependencies("cubewall.unity3d");
foreach (string name in strs)
{
print(name);
AssetBundle.LoadFromFile("AssetBundles/" + name);
}
}
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
AssetBundle.LoadFromFile("AssetBundles/share.unity3d");
}
}
}
AssetBundle 제거
마운트 해제는 두 가지 측면이 있다
1, 메모리 사용 감소
2, 분실 가능성
그래서 언제 자원을 마운트 해제할까요, Asset Bundle.AssetBundle을 사용하면 모든 자원을 마운트 해제합니다. (1, 관심 전환, 장면 전환 2, 자원이 사용되지 않을 때 호출됩니다.)Unload(false) 사용하지 않은 모든 자원을 마운트 해제합니다. 개별 자원은 어떻게 마운트 해제합니까? 1, Resources.UnloadUnusedAssets.2, 장면 전환 시
파일 검증 정보
CRC MD5 SHA1
공통점:
CRC, MD5, SHA1은 모두 데이터에 대한 계산을 통해 검사 값을 생성하는데 이 검사 값은 데이터의 완전성을 검사하는 데 사용된다.
차이점:
1. 알고리즘이 다르다.CRC는 다항식 제곱법을 사용하고 MD5와 SHA1은 교체, 윤전 등 방법을 사용한다.
2. 검사 값의 길이가 다릅니다.CRC 검사 비트의 길이는 다항식과 관계가 있으며 일반적으로 16비트 또는 32비트이다.MD5는 16바이트(128비트)입니다.SHA1은 20바이트(160비트)이다.
3. 검사 값의 호칭이 다르다.CRC는 일반적으로 CRC값이라고 부른다.MD5와 SHA1은 일반적으로 해시 값(Hash) 또는 산열 값이라고 한다.
4. 안전성이 다르다.이곳의 안전성은 오류 검사 능력, 즉 데이터의 오류가 검사 위치를 통해 검출되는 것을 가리킨다.CRC의 안전성은 다항식과 큰 관계가 있어 MD5와 SHA1에 비해 많이 약하다.MD5의 안전성은 매우 높지만 04년에 산동대학의 왕소운에게 해독되었다.SHA1의 안전성이 가장 높습니다.
5. 효율이 다르기 때문에 CRC의 계산 효율이 높다.MD5와 SHA1은 비교적 느리다.
6. 용도가 다르다.CRC는 일반적으로 통신 데이터의 검사로 사용된다.MD5와 SHA1은 파일 검사, 디지털 서명 등 보안(Security) 영역에 사용됩니다.
문제.
1, 의존 패키지 중복 문제
a, 공유해야 할 자원을 한데 묶다
b, 분할 가방, 이 가방들은 같은 시간에 사용하지 않습니다
c, 공유 부분을 하나의 단독 가방으로 포장한다
2, 갤러리 반복 문제
3, 안드로이드 맵 문제
4, iOS 파일 처리 중복fixed in Unity 5.3.2p2.
AssetBundle 도구 보기
Unity Asset Bundle Browser tool
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Unity 최적화1. 프레임마다 처리하는 것을 최대한 피한다. 예를 들면: 5프레임당 한 번 처리로 변경할 수 있습니다. 2. 정시 반복 처리는 InvokeRepeating 함수로 이루어집니다. 예를 들어 0.5초 동안 시작한 후 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.