他のディレクトリにあるAndroidアセットを参照するにはどうすればよいですか?


9

私のプロジェクトは当初Android向けではなく、そのアセットは次のディレクトリ構造に沿って編成されています(ASCIIアートが適切にレンダリングされることを願っています)。

/
+- engine/
 |    +- src/
 |     |      enginefile1.cpp
 |     |      ...
 |     `- textures/
 |            texture1.tex
 |            ...
+- game/
 |    +- src/
 |     |      gamefile1.cpp
 |     |      ...
 |    +- textures/
 |     |      gametexture1.tex
 |     |      ...
 |    +- ios/
 |     |      [various iOS-specific files]
 |     `- android/
 |           | build.xml
 |           | AndroidManifest.xml
 |           +- jni/
 |           |     Android.mk
 |           +- assets/
 |             [other Android-specific files]
 `- othergame/

およびのソースファイルの相対パスをポイントしているgame/android/jniため、私のディレクトリはほとんど空です。実際には、プロジェクトにソースファイルを追加または削除するときに変更する必要がないように、適切なも含まれています。Android.mkengine/srcgame/srcMakefileAndroid.mk

両方enginegame必要性がAndroidのビルドに同梱されるという資産を提供しています。build.xmlこれらのアセットを手動でコピーせずに参照したいと思います。ビルド時にアセットをコピーしてから削除するルールは受け入れられますが、もちろん、ゼロコピーソリューションの方が望ましいでしょう。これは理にかなっていますか?他の人はどのようにしてこのクロスプラットフォームのビルド問題を解決しましたか?

回答:


1

はい、絶対に他のディレクトリのファイルを使用できます。所有しているアセットをassetsディレクトリ(ディレクトリの兄弟res)に配置し、AssetManagerてそれらにアクセスします。

ビットマップをロードするには、が必要ですBitmapFactory。解像度に依存する画像をロードする場合は、追加の作業を行う必要があります。

ビットマップを複数回ロードする場合は注意してください。生のファイルハンドルを処理するため、既存のビットマップオブジェクトなどへの参照をすばやく検索できるようにするリソース/メモリマネージャーを実装する必要があるでしょう。アーキテクチャによってWeakReferencesは、ゲームデータ全体がメモリに残ってしまわないように、これを行う必要がある場合があります。(通常のAndroidリソースではResourceManager、これらすべてがで処理されます。)


アセットを同じディレクトリに配置することは(resまたはそれであるかassets)、まさに私がやりたくないものです。私は両方の質問に言ったようにengineしてgame私は出荷したいという資産を提供しています。
sam hocevar 2011

アセットをassetsディレクトリにリンクまたはコピーするためのプリコンパイルスクリプトを追加して、ゲーム固有のディレクトリ構造を保持できるようにします。Windowsシンボリックリンクの場合:windows7home.net/how-to-create-symbolic-link-in-windows-7
Anm

プリコンパイルスクリプトがおそらく最も便利な解決策ですが、回答にそれが含まれていれば、受け入れられるように短い例を含めておくとよいでしょう。(私は他の回答でもまったく同じコメントをしていることに注意してください)
sam hocevar '20

1

Antビルドプロパティ「asset.dir」は、アセットディレクトリの名前を提供します。デフォルトでは「アセット」ですが、「../ assets」のように変更できます。これにより、ディレクトリ全体のパスが変更されますが、Android固有のリソースがある場合でも、「res」ディレクトリを使用できます。


1

ここでの他の回答があなたの質問に答えないのは不思議です...彼らはすべてあなたが1つだけのアセットディレクトリが欲しいか、またはassets /の代わりにres /を参照することを想定しています。

また、複数のアセットディレクトリが必要です。

私は<aapt>antモジュールと何時間も戦い、やっとあきらめて、もっと簡単な方法があることに気付きました。

<target name="-package-resources"...>タグをant使用するマスタービルドファイルからタグをコピーandroid_sdk_dir/tools/ant/build.xmlし、プロジェクトに貼り付けましたbuild.xmlbuild.xml事前に作成されたプロジェクトの最後にあるコメントでbuild.xml説明されているように、マスターが含まれる直前にタグを貼り付ける必要があります)。zipアセットを.ap_ファイル(${out.absolute.dir}/${resource.package.file.name}antファイルのその時点)に追加するために単に実行する2番目のセクション:

    <target name="-package-resources" depends="-crunch">
        <!-- only package resources if *not* a library project -->
        <do-only-if-not-library elseText="Library project: do not package resources..." >
            <aapt executable="${aapt}"
                    command="package"
                    versioncode="${version.code}"
                    versionname="${version.name}"
                    debug="${build.is.packaging.debug}"
                    manifest="${out.manifest.abs.file}"
                    assets="${asset.absolute.dir}"
                    androidjar="${project.target.android.jar}"
                    apkfolder="${out.absolute.dir}"
                    nocrunch="${build.packaging.nocrunch}"
                    resourcefilename="${resource.package.file.name}"
                    resourcefilter="${aapt.resource.filter}"
                    libraryResFolderPathRefid="project.library.res.folder.path"
                    libraryPackagesRefid="project.library.packages"
                    libraryRFileRefid="project.library.bin.r.file.path"
                    previousBuildType="${build.last.target}"
                    buildType="${build.target}"
                    ignoreAssets="${aapt.ignore.assets}">
                <res path="${out.res.absolute.dir}" />
                <res path="${resource.absolute.dir}" />
                <!-- <nocompress /> forces no compression on any files in assets or res/raw -->
                <!-- <nocompress extension="xml" /> forces no compression on specific file extensions in assets and res/raw -->
            </aapt>
<!--
NEW XML STARTS HERE
-->
            <exec executable="zip" failonerror="true">
                <arg value="-r" />
                <arg value="${out.absolute.dir}/${resource.package.file.name}" />
                <arg value="my_assets_directory_1" />
                <arg value="my_assets_directory_2" />
                <arg value="my_assets_directory_3" />
            </exec>
<!--
NEW XML ENDS HERE
-->
        </do-only-if-not-library>
    </target>

この方法には、ソースツリーとapkでアセットのディレクトリ構造をより自由に定義できるという利点があります(exec zip異なる引数で複数回実行できzip、実行するスクリプトでラップすることもできるため)zip、あなたの中に複数の電流のディレクトリからソースツリー)。また、ファイルごとに圧縮を制御し(zipには圧縮を抑制する-0オプションがあります)、制限された、拡張子ごとのみの非圧縮タグを使用する必要はありません。

これに注意してください ant xmlはantビルドプロセスのzipalignの前に来るので、APKとAndroid Javaのアライメントのニーズを満たす「zip互換」アーカイブを取得します。

私の場合、NDKベースのアプリがあり、Cコードからのみこれらのアセットにアクセスしたいと思います(apkパスは問題ありません)。これらのアイテムにアクセスするために標準のAndroid Javaアセットの呼び出しを使用する必要がある場合、それらがアセットという名前のzip内のパスにある必要があるかどうかはわかりません。その場合は、関連するソースツリーフォルダーに移動してを実行するexecスクリプトを実行することで、上記のトリックを適用できcdますzip


0

私の頭の外では、私はres /以外では何も使用できないと思いますが、コピーを使用して開発サイクルに追加のコストをかけたくない場合は、代わりにそれらを移動するか、またはシンボリックリンク...


一部のファイルはゲーム間で共有さengineれており、別のリポジトリにあるディレクトリにとどまる必要があるため、ファイルを移動することはできません。シンボリックリンクは許容できるかもしれませんが、それらがWindowsで適切に機能するかどうかは不明ですが、それでもによって自動的に同期されるという問題がありますbuild.xml
sam hocevar

2
@Sam-ファイルをリポジトリに残しておいてもかまいませんが、ビルドフレームワークでプレコンパイルステップを作成し(Ant build.xmlファイルのように)、Androidプロジェクトに必要な場所にファイルをコピーします。これは、マルチプラットフォームゲームでアセットを共有する場合の一般的な方法です。Antコピータスクを参照してください:ant.apache.org/manual/Tasks/copy.html
Anm

プリコンパイルスクリプトがおそらく最も便利な解決策ですが、回答にそれが含まれていれば、受け入れられるように短い例を含めておくとよいでしょう。(私は他の回答でもまったく同じコメントをしていることに注意してください)
sam hocevar '20

0

AntプロジェクトではなくMavenプロジェクトを使用していた場合、android-maven-pluginandroid:apk mojoresourceDirectory構成オプションを使用して、resフォルダーを簡単に再定義できます

  <plugin>
    <groupId>com.jayway.maven.plugins.android.generation2</groupId>
    <artifactId>android-maven-plugin</artifactId>
    <version>${android.maven.version}</version>
    <configuration>
      <resourceDirectory>${project.basedir}/res</resourceDirectory>
    </configuration>
    <extensions>true</extensions>
  </plugin>

悲しいことに、Antの使用からMavenの使用に移行する意思がない限り、この回答はあまり役に立たない可能性があります...


0

UNIX OSを使用している場合は、それらをハードリンクして、バージョン管理にres/ディレクトリを無視するように指示できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.