Addressables 0.7.4 ~ 1.1.4 不具合まとめ
Analyzeが正しく動作しない
何が起きる
同じバンドル内に同じリソースへの参照が複数含まれる場合,そのリソースをバンドル間の重複として検出してしまう。
原因
GUIDとバンドルの対応表を作成している部分で重複チェックが行われていない
Analyze実装当初からのバグ
対処
重複ファイルの保持を List<> から HashSet<> に書き換え
code:CheckBundleDupeDependencies.cs
(NG) public List<string> DuplicatedFiles;
↓
(OK) public HashSet<string> DuplicatedFiles;
など
code:CheckDupeDependenciesBase.cs
(NG) internal Dictionary<GUID, List<string>> GetImplicitGuidToFilesMap()
↓
(OK) internal Dictionary<GUID, HashSet<string>> GetImplicitGuidToFilesMap()
など
DownloadDependenciesAsyncの進捗が取れない
何が起きる
PercentComplete が常に0
原因
ChainOperation が PercentComplete に対応していない
Addressables 0.7.4 で DownloadDependenciesAsync が ChainOperation を使うようになったため顕在化
対処
ChainOperation を PercentComplete に対応させる
以下を ChainOperation.cs に追加
code:ChainOperation.cs
protected override float Progress
{
get {
if (m_DepOp.Status == AsyncOperationStatus.None)
{
return m_DepOp.PercentComplete * m_depWeight;
}
return m_depWeight + m_WrappedOp.PercentComplete * m_wrapWeight;
}
}
ここで m_depWeight と m_wrapWeight は2つの処理の区間の重み付け。同じなら2つとも 0.5
例えば Init() で指定
code:ChainOperation.cs
public void Init(
AsyncOperationHandle<TObjectDependency> dependentOp,
Func<AsyncOperationHandle<TObjectDependency>, AsyncOperationHandle<TObject>> callback,
float dep_weight = 1f, float wrap_weight = 1f)
{
m_DepOp = dependentOp;
m_DepOp.Acquire();
m_Callback = callback;
float total_weight = dep_weight + wrap_weight;
m_depWeight = dep_weight / total_weight;
m_wrapWeight = wrap_weight / total_weight;
}
DownloadDependenciesAsync ではダウンロード処理は dependentOp のほうなので重み付けは例えば 99:1 にする。
結果を捨てるなら(型変換が必要無くなるので)ChainOperation を使わないよう改造するのでも良い。
1.1.7 で修正されました
ただし,m_DepOp の PercentComplete を返すだけなので正確な値ではない
Chaola.icon