Unity3D 게임 개발 의 역 컴 파일 AssetBundle 게임 자원 추출
만담 Unity3D 의 AssetBundle
Asset Bundle 에 대해 서 는 블 로 거들 이 이전 글 에서 언급 한 바 있다.블 로 거들 이 게임 개발 과 루 아의 떼 려 야 뗄 수 없 는 인연 이라는 시 리 즈 를 쓸 때 Asset Bundle 이라는 기술 을 언급 하고 사용 한 적 이 있다 는 것 을 기억 하 실지 모르겠다.구체 적 으로 말 하면 Asset Bundle 은 Unity 3D 에서 자원 패키지 자원 의 동적 로드 에 사용 되 는 해결 방법 이다.예 를 들 어 우리 가 평소에 하 는 단일 게임 의 용량 이 비교적 크다.이것 은 제작 진 이 게임 을 제작 할 때 모든 프로젝트 자원 을 통합 시 켰 기 때문이다.그러나 만약 에 저희 가 Asset Bundle 로 이 게임 을 한다 면 저 희 는 발 표 된 게임 에서 만 게임 기능 을 지원 하 는 핵심 부분 을 제공 하고 게임 중의 장면,모델 등 자원 을 Asset Bundle 형식 으로 포장 하여 서버 에 올 릴 수 있 습 니 다.그러면 게임 클 라 이언 트 가 인터넷 에 있 을 때 서버 에서 이 자원 을 다운로드 할 수 있 습 니 다.이로써 게임 자원 의 동적 로드 를 실현 할 수 있다.이 를 통 해 알 수 있 듯 이 Asset Bundle 은 우리 가 게임 의 용량 을 줄 이 는 데 도움 을 줄 수 있다.가방 을 설치 해 야 하 는 상황 이 라면 게임 가방 용량 의 크기 는 게임 에 인상 을 줄 수 밖 에 없다.
예 를 들 어 최근 에 이라는 단일 게임 이 발표 되 었 다.각 게임 사이트 의 평가 부터 똑 같이 제 가 단일 게임 을 좋아 하 는 친구 들 의 체험 까지 모두 가 이 게임 의 전체적인 표현 이 괜찮다 고 생각 하기 때문에 한번 해 보 는 것 을 고려 해 야 한다 고 생각 합 니 다.블 로 거들 의 마음 을 설 레 게 할 수 밖 에 없 었 지만 17 개의 G 게임 용량 을 보고 망 설 였 다.'헌 원 검 6'부터 유 니 티 3D 엔진 을 사용 해 온 DOMO 팀 은 첫 번 째 게임 의 실 패 를 겪 은 뒤 이번 에는 DOMO 팀 이 게임 을 최적화 할 수 있 을 것 으로 보인다.여기 서 만약 에 단기 게임 을 좋아 하 는 친구 가 있다 면 한번 해 보 세 요.왜냐하면 우리 가 게임 개발 을 배 우 는 취 지 는 바로 좋 은 게임 을 하 는 것 입 니 다.게임 을 사랑 하지 않 으 면 어떻게 좋 은 게임 을 할 수 있 습 니까?자,좀 멀 어 졌 습 니 다.여기 서 중요 한 요 소 는 바로 게임 용량 입 니 다.만약 에 DOMO 가 AeestBundle 을 사용한다 면 게임 의 용량 이 많이 줄 어 들 것 입 니 다.그런데 이렇게 되면 싱글 게임 이 잖 아 요.그 렇 죠?
유 니 티 3D 에서 Asset Bundle 은 전문 판 의 한 기능 으로 무료 판 유 니 티 3D 에 서 는 이 기능 을 사용 할 수 없다.유 니 티 5 에 서 는 이 기능 이 개인 판 으로 나 뉘 어 있 는 지 모르겠다.자,다음은 Asset Bundle 을 어떻게 사용 하 는 지 살 펴 보 겠 습 니 다.우 리 는 주로 Asset Bundle 포장 과 Asset Bundle 로드 두 가지 측면 에서 볼 때:
Assetbundle 로 포장 하기
AssetBundle 포장 을 사용 하면 주로 BuildPipeline.BuildAssetBundle()이라는 방법 으로 이 루어 집 니 다.이 방법의 원형 은 다음 과 같 습 니 다.
bool BuildAssetBundle (Object mainAsset,Object[] assets,string pathName, BuildAssetBundleOptions
optionsBuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets,
BuildTarget targetPlatform= BuildTarget.WebPlayer)
이 방법 에서 첫 번 째 매개 변 수 는 Object 형식 으로 활성 화 된 물 체 를 나타 낸다.두 번 째 매개 변 수 는 Object[]형식 으로 선택 한 모든 물 체 를 표시 합 니 다.세 번 째 매개 변 수 는 string 형식 으로 내 보 낼 자원 패키지 의 경 로 를 표시 합 니 다.자원 패키지 의 확장 자 는 assetbundle 또는 unity3d 일 수 있 습 니 다.네 번 째 매개 변 수 는 포장 옵션 을 표시 합 니 다.기본 값 은 포장 과 의존 입 니 다.여기 서 이 두 가지 개념 을 중점적으로 설명 한다.완전히 포장 하 는 것 은 모든 자원 이 포장 에 참여 하 는 것 을 말한다.예 를 들 어 하나의 모델 이 스티커 와 애니메이션 을 가지 고 있 으 면 포장 모델 을 할 때 스티커 와 애니메이션 은 모두 자원 으로 포장 된다.한편,포장 에 의존 하 는 것 은 Prefab 에 비해 서 이다.예 를 들 어 Prefaba 에서 Prefabb 라 는 대상 을 인용 하면 포장 할 때 이 두 대상 은 모두 포장 되 고 이들 간 의 이러한 의존 관 계 는 포장 후에 계속 유지 된다.다섯 번 째 매개 변 수 는 플랫폼 의 선택 입 니 다.유 니 티 3D 는 플랫폼 을 뛰 어 넘 는 게임 엔진 이기 때문에 각 플랫폼 의 현재 상황 이 다 르 기 때문에 현재 유 니 티 3D 가 채택 한 방안 은 각 플랫폼 이 자신의 플랫폼 에 대응 하 는 Asset Bundle 만 사용 할 수 있다 는 점 에 주의 하 시기 바 랍 니 다.자,이제 간단 한 예 를 보 자.
///
/// AssetBundle
///
///
static void ExportToAssetBundle(ExportType type,BuildTarget target)
{
//
string savePath=EditorUtility.SaveFilePanel(" AssetBundle","","New Resource","unity3d");
if(savePath==string.Empty) return;
//
Object[] selection=Selection.GetFiltered(typeof(Object),SelectionMode.DeepAssets);
if(selection.Length==0) return;
//
if(type==ExportType.All){
BuildPipeline.BuildAssetBundle(null,selection,savePath,BuildAssetBundleOptions.CollectDependencies,target);
}else{
BuildPipeline.BuildAssetBundle(obj,null,savePath,BuildAssetBundleOptions.CollectDependencies,target);
}
}
这是一个简单的导出AssetBundle资源包的方法,它有两个参数,第一个参数表示是一个枚举类型,定义为ExportType,取Single时表示打包一个特定的激活物体,比如说一个模型、一个场景等等;取All时表示打包所有选中的物体,比如一个场景。第二个参数表示打包的平台,这个不用多说了。因为博主的免费版的Unity3D不支持AssetBundle,所以这里没法给大家演示了,具体效果请自行测试,有问题的话给博主留言就是了。
加载AssetBundle
加载AssetBundle是一个从网络中下载资源的过程,因此需要使用Unity3D的WWW功能,这是一个简单的网络协议的封装,可以像浏览器一样访问某个URL地址或者是本地地址,访问WEB地址需要使用HTTP协议,访问本地地址需要使用File协议。我们来看一个具体的例子:
///
/// unity3d
/// WEB ——http://server.com/xxx.unity3d
/// ——file://.unity3d
///
IEnumerator LoadUnity3DFile(string url)
{
WWW www=new WWW(url);
yield return www;
if(www.error!=null){
Debug.Log(www.error);
}else{
AssetBundle bundle=www.assetBundle;
Instantiate(bundle.mainAsset,Vector3.zero,Quaternion.identity);
}
}
在这里我们直接使用bundle.assetBundle获取了全部的资源,如果只需要获取资源中的一部分,则只需要通过bundle.Load()方法就可以了,这里需要传入资源的名称。当我们使用完资源后可以通过bundle.Unload()方法来卸载资源,达到释放内存的目的。
从反编译《新仙剑OL》看AssetBundle打包
好了,下面我们以《新仙剑OL》这款游戏的AssetBundle的反编译来探索下在使用AssetBundle打包应该注意哪些问题。《新仙剑OL》这款游戏呢,是采用Unity3D引擎开发的一款横跨客户端游戏和网页游戏的网络游戏,游戏以《仙剑奇侠传》初代游戏剧情为主,玩家将第三人称视角再次跟随主人公展开一段荡气回肠的感人故事。这款游戏总体来说还不错吧,因为毕竟是网游,我们不能用单机游戏的视角去评价,具体的原因大家都是知道的。
好了,为什么我们要选择这款游戏呢?
* 第一,这款游戏的客户端只有30余M,体积小适合拿来研究(这就是AssetBundle的好处啊)* 第二,博主是一位仙剑玩家,一直希望有一天《仙剑奇侠传1》能够用3D技术重现,这个游戏满足了博主的好奇心
* 第三,网络上已经有朋友对这个游戏的打包进行了研究,这里感谢网友朋友提供部分.unity3d文件及相关文件。
我们选择的解包工具是一款叫做disunity的命令行工具,经过博主的尝试,这个工具真心强悍啊,可以解开.unity3d文件和.assets文件,可以拿到的数据形式有贴图、声音、模型等。具体的情况大家可以在稍后看到。
首先我们找到《新仙剑OL》的安装目录,然后我们就能发现一个叫做assetbundles的文件夹,这是怕大家不知道吗?这太明显了吧!我们打开文件夹会发现Charachers、NPC、Scene等等文件夹,继续往下找我们发现了好多的.unity3d文件,不过这些文件都是以.unity3d然后跟些随机字符串的形式存在的。根据网友朋友们的提示,这些文件就是.unity3d文件,不过游戏制作组为了干扰我们故意接了下随机字符在后面(呵呵,还有比这更弱的加密方式吗?)。博主看到这里的第一感觉就是想先用加载AssetBundle的方式来看看能不能将这些AssetBundle读取出来,因此果断改了文件扩展名,然后开始在Unity3D中读取,结果程序报错看来是我们想的简单了啊。没办法的办法,强行解包吧!在命令行中输入:
disunity extract C:\Users\Robin\Desktop\s049.unity3d
다음 프로그램 은 데스크 톱 에 s049 에 있 는 폴 더 를 만 들 고 폴 더 를 열 어 보 니 니 니 마 는 모델 의 격자 데이터(.obj)와 스티커 데이터(.dds)와 관련 된 Shader 를 직접 가 져 왔 습 니 다.이것 은 나 로 하여 금 갑자기 받 아들 일 수 없 게 한다.바로 Blender 를 열 어 격자 데 이 터 를 가 져 오 면 어린 시절 의 임 월 여 는 우리 앞 에 나 타 났 다.
블 로 거들 은 Blender 에서 모델 스티커 를 주지 않 기 때문에 유 니 티 3D 에 스티커 를 완성 하려 면 먼저 모델 을 FBX 형식 으로 내 보 내야 합 니 다.자,모형 을 유 니 티 3D 에 도입 한 후 스티커 를 모형 에 부여 하고 어린 시절 의 임 월 여 는 반 짝 이 며 등장 합 니 다.하하!
자,한 장 더 주세요.그런데 이 건 스티커 가 없어 요.여러분 이 누 군지 알 아 봐 야 돼 요.하하!
disunity 라 는 도 구 를 통 해 우 리 는 더 많은 자원 을 얻 을 수 있 고 나머지 내용 은 여러분 이 직접 탐색 하 세 요.이 부분의 연 구 를 통 해 우 리 는 다음 과 같은 관점 을 정리 할 수 있 습 니 다.여러분 들 은 Assset Bundle 이라는 기술 을 사용 할 때 주의 하 시기 바 랍 니 다.*가능 한 한 하나의 Asset Bundle 에 여러 개의 자원 을 포장 하 는 것 이 좋 습 니 다.이렇게 하 는 장점 은 다른 사람 이 Asset Bundle 을 불 러 와 서 당신 이 만 든 Prefab 를 얻 을 수 없다 는 것 입 니 다.*가능 한 한 하나의 예비 부품 을 다른 부분 으로 나 누 어 보관 하 는 것 이 좋 습 니 다.이렇게 하 는 장점 은 다른 사람 이 당신 의 예비 부품 을 받 더 라 도 완전 하지 않다 는 것 입 니 다.*전체 장면 을 포장 하 는 것 이 아니 라 동적 스 크 립 트 를 이용 하여 장면 을 불 러 옵 니 다.전체 장면 을 포장 하 더 라 도 스티커 와 모델 을 분리 해서 배치 해 야 합 니 다.(그래서 저 는 게임 의 장면 스티커 를 받 았 지만 소 용이 없습니다)*암호 화 된 방법 으로 로 컬 Asset Bundle 을 숨 기거 나 알 아차 리 기 어 려 운 저장 위 치 를 Asset Bundle 의 저장 위치 로 사용 합 니 다.명문 데이터 로 저장 하지 마 세 요.
자,오늘 의 내용 은 바로 이 렇 습 니 다.여러분 이 좋아 하 시 기 를 바 랍 니 다.Asset Bundle 포장 은 깊이 연구 할 만 한 문제 입 니 다.오늘 블 로 거들 이 제기 한 이런 관점 은 라 는 게임 의 포장 에 대해 de 의 견 해 를 제기 하 는 것 에 불과 합 니 다.만약 에 여러분 이 서로 다른 견 해 를 가지 고 있다 면 같이 교류 하 는 것 을 환영 합 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
게임 만들기 : 구현 된 헥스 맵 좌표계 구조구현해 본 결과, Hex의 좌표계는 교대로 어긋나는 형태가 좋다 헥스의 줄은 가로 일직선이 좋다 헥스를 세로로 잡아 보았다 구현 내용은 . 그리고, 날아다니는 좌표계가 좋을 것이라고, 썼습니다만, 실장해 보면 취급하...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.