More Related Content
Similar to 【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説 (20)
More from Unity Technologies Japan K.K. (20)
【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
- 5. Addressable Assets の良さみ
• Resourcesのシンプルさとアセットバンドルの自由度を実現
• ロードの依存関係や非同期処理を、複雑なコードを書かずに実現
• (Scriptable Build Pipelineで) ビルドやプレイモード時の動作もカスタマイズ可能に
• 開発を助けるツール類の提供
• C#
- 6. Addressable Assets システム のステータス
• 現在はプレビュー版
• Unity 2018.2から利用可能
• Package Managerでインストール
• 今すぐさわってみるためには
manifest.jsonの書き換えが必要
{
"dependencies": {
"com.unity.addressables": "0.0.22-preview"
}
}
- 7. Addressable Assets と Resourcesの違い
共通点
違い
(進化点)
• 固定の文字列(アドレス・パス)を使ったロードができる
• アセットの明示的なロードやアンロードができる
• 非同期でのロード処理ができる
• プレイモード開始前に自動で必要な更新が行われる
• アセットの実際の配置を自由に変更できる
• 自由な文字列をアドレスとしてつけられる
• ラベルやAssetReferenceが使える
• ロード方法やビルド方法などをカスタマイズできる
- 10. public AssetReference m_ref;
private GameObject m_character;
void Start ()
{
Addressables.Instantiate<GameObject>(m_ref)
.Completed += op => { m_character = op.Result; };
}
// Update is called once per frame
void Update () {
if (m_character != null)
{
m_character.transform.Rotate(90f * Time.deltaTime, 30f * Time.deltaTime, 60f * Time.deltaTime);
}
}
非同期でPrefabをロードして、完了したら回転するサンプルコード
- 11. public AssetReference m_ref;
private GameObject m_character;
void Start ()
{
Addressables.Instantiate<GameObject>(m_ref)
.Completed += op => { m_character = op.Result; };
}
インスタンス化したいアセット
を設定する
Step 1
- 12. public AssetReference m_ref;
private GameObject m_character;
void Start ()
{
Addressables.Instantiate<GameObject>(m_ref)
.Completed += op => { m_character = op.Result; };
}
GUIではリストから選択可能(フィルタ付き)
- 13. public AssetReference m_ref;
private GameObject m_character;
void Start ()
{
Addressables.Instantiate<GameObject>(m_ref)
.Completed += op => { m_character = op.Result; };
}
アセットを非同期にロードして、
インスタンス化する
Step 2
- 14. public AssetReference m_ref;
private GameObject m_character;
void Start ()
{
Addressables.Instantiate<GameObject>(m_ref)
.Completed += op => { m_character = op.Result; };
}
全部が終了した時に呼びたい
処理を登録する
Step 3
- 18. void OnTriggerEnter (Collider other)
{
… … …
Addressables.ReleaseInstance(other.gameObject);
Addressables.ReleaseInstance(gameObject);
}
IEnumerator SpawnWaves()
{
yield return new WaitForSeconds(startWait);
while (true)
{
for (int i = 0; i < hazardCount; i++)
{
var hazardAddress = hazardLocations[Random.Range(0, hazardLocations.Count)];
Vector3 spawnPosition = new Vector3(Random.Range(-spawnValues.x, spawnValues.x), spawnValues.y,
spawnValues.z);
Quaternion spawnRotation = Quaternion.identity;
// ADDRESSABLES UPDATES
Addressables.Instantiate<GameObject>(hazardAddress, spawnPosition, spawnRotation);
yield return new WaitForSeconds(spawnWait);
}
yield return new WaitForSeconds(waveWait);
… … …
}
}
敵キャラを出して、ぶつかったら自機と敵を破棄する
サンプルコード
- 19. void OnTriggerEnter (Collider other)
{
… … …
Addressables.ReleaseInstance(other.gameObject);
Addressables.ReleaseInstance(gameObject);
}
IEnumerator SpawnWaves()
{
yield return new WaitForSeconds(startWait);
while (true)
{
for (int i = 0; i < hazardCount; i++)
{
var hazardAddress = hazardLocations[Random.Range(0, hazardLocations.Count)];
Vector3 spawnPosition = new Vector3(Random.Range(-spawnValues.x, spawnValues.x), spawnValues.y,
spawnValues.z);
Quaternion spawnRotation = Quaternion.identity;
// ADDRESSABLES UPDATES
Addressables.Instantiate<GameObject>(hazardAddress, spawnPosition, spawnRotation);
yield return new WaitForSeconds(spawnWait);
}
yield return new WaitForSeconds(waveWait);
… … …
}
}
敵のウェーブを生成する
}
- 20. void OnTriggerEnter (Collider other)
{
… … …
Addressables.ReleaseInstance(other.gameObject);
Addressables.ReleaseInstance(gameObject);
}
IEnumerator SpawnWaves()
{
yield return new WaitForSeconds(startWait);
while (true)
{
for (int i = 0; i < hazardCount; i++)
{
var hazardAddress = hazardLocations[Random.Range(0, hazardLocations.Count)];
Vector3 spawnPosition = new Vector3(Random.Range(-spawnValues.x, spawnValues.x), spawnValues.y,
spawnValues.z);
Quaternion spawnRotation = Quaternion.identity;
// ADDRESSABLES UPDATES
Addressables.Instantiate<GameObject>(hazardAddress, spawnPosition, spawnRotation);
yield return new WaitForSeconds(spawnWait);
}
yield return new WaitForSeconds(waveWait);
… … …
}
}
ぶつかったら両方のオブジェクトを破棄
}
- 21. void OnTriggerEnter (Collider other)
{
… … …
Addressables.ReleaseInstance(other.gameObject);
Addressables.ReleaseInstance(gameObject);
}
IEnumerator SpawnWaves()
{
yield return new WaitForSeconds(startWait);
while (true)
{
for (int i = 0; i < hazardCount; i++)
{
var hazardAddress = hazardLocations[Random.Range(0, hazardLocations.Count)];
Vector3 spawnPosition = new Vector3(Random.Range(-spawnValues.x, spawnValues.x), spawnValues.y,
spawnValues.z);
Quaternion spawnRotation = Quaternion.identity;
// ADDRESSABLES UPDATES
Addressables.Instantiate<GameObject>(hazardAddress, spawnPosition, spawnRotation);
yield return new WaitForSeconds(spawnWait);
}
yield return new WaitForSeconds(waveWait);
… … …
}
}
Addressablesから
インスタンス化したら・・・
Addressablesからリリースする
- 30. List<object> assets = new List<object>();
var op = Addressables.PreloadDependencies("MyLabel", null);
op.Completed += (res) =>
{
assets.AddRange(res.Result);
};
yield return op;
事前にアセットを先読みするサンプルコード
“MyLabel”ラベルのアセットに
関連するアセットを全てロード
- 31. List<object> assets = new List<object>();
var op = Addressables.PreloadDependencies("MyLabel", null);
op.Completed += (res) =>
{
assets.AddRange(res.Result);
};
yield return op;
事前にアセットを先読みするサンプルコード
ロードが完了したら、
結果のデータをうけとる
- 32. List<object> assets = new List<object>();
var op = Addressables.PreloadDependencies("MyLabel", null);
op.Completed += (res) =>
{
assets.AddRange(res.Result);
};
yield return op;
事前にアセットを先読みするサンプルコード
ロードが完了するまで待つ
- 42. Addressable Assets と Resource Manager
Addressable Assets Resource Manager
アセットにアドレスをつけられるようにし、アドレスを使ったア
セットのロードや管理が出来るようにするシステム
Resource Managerの上に構築
ユーザーコードで自由に拡張可能
アセットを様々な場所から、様々な方法で、非同期に、ロード・
インスタンス化・管理・アンロードを出来るようにするシステム
ユーザーコードで自由に拡張可能
- 43. Addressable Assets Resource Manager
2つのシステムの役割分担
ResourceLocationを受け取って、依存関係情報やキャッ
シュ情報などを参照しながら適切なAsyncOperationを構
築する
リソースの参照カウントを管理し、自動的にリソースの解放を
行う。
プレイモードの Fast Mode や Virtual Mode、RM Profiler
などの開発に便利な機能を提供する
アセットに「アドレス」つけるための機能を提供する
アセットの実体とアドレスの対応表(コンテンツカタログ)を
生成する
起動時にグループ設定情報をロードして、各種Providerを
登録し、コンテンツカタログをロードして、Resource
Managerを初期化する
アドレスでロードする際に、ResourceLocationに変換する
- 44. Resource Manager & Addressable システム
Addressables
Resource Manager
Resource Locator
Resource Provider
ResourceManagerRuntimeDataResource Location Map
SceneProviderInstance Provider
- 50. Resource Manager + Addressables
Resource Manager
Addressablesでの初期化処理
TextDataProvider
JsonAssetProvider
ContentCatalogProvider
BundledAssetProvider
LocalAssetBundleProvider
RemoteAssetBundleProvider
ResourceManagerRuntimeData
(settings)
SceneProvider PooledInstanceProvider
ビルド時にグループ設定から生成
- 51. Resource Locator
(Contents Catalog)
Resource Manager + Addressables
Resource
Manager
Resource
Provider
ユーザーコード
アドレス
(文字列や
AssetReference)
ResourceLocationを
渡してロードを依頼
Resource Providerを探して
適切な相手にロードを依頼
受け取ったAsyncOperationに完了時処理を追加して待つ
AsyncOperationを返す
アドレスをResourceLocation
に変換、依存関係追記
Addressables Resource Manager