渋谷ほととぎす通信

完全趣味でやってる技術メモ。※所属団体とは一切関係がありません。

Unity SpriteRendererで表示した画像をドラッグして端から端までピッタリ表示する

f:id:esakun:20190424203414p:plain:w450

結論

  • X座標ドラッグ可能距離 = 画像サイズ / PixelPerUnit - orthographicSize * (Screen.Width / Screen.Height)
  • Y座標ドラッグ可能距離 = 画像サイズ / PixelPerUnit - orthographicSize

で割り出せます。
※平行投影カメラが前提

以下のコードをドラッグ処理部分に記述する想定です。

以上です。

Unity2019 PackageManagerがメニューに表示されなくなった時の対処法

2018.3.7f1からUnity2019にアップデートした際に起こったPackageManager周りのトラブル共有です。

タイトルの通り、WindowからPackageManagerの項目が表示されなくなる現象が発生しました。

Unity2019では使用できないバージョンがmanifestで指定されているという旨のコンパイルエラーが出ていました。
というのも下記のキャプチャの通りUnity2019.1.0f2ではPackageの下位バージョンを指定できなっています。

f:id:esakun:20190417171155p:plain:w450
※指定できました。場所が変わっていました。

解決法

  1. previewパッケージを一時的に外す
  2. Unityを再起動

f:id:esakun:20190417095247p:plain
↑の子たちを一時的に削除して、再起動。

これで僕は解決し、PackageManagerと再開することができました。

以上

環境

  • macOS HighSierra 10.13.6
  • Unity2019.1.0f2

コルーチンの引数にはref、outは使用できない

タイトルの通り、コルーチンで少しハマったので共有です。

IEnumerator Hoge (ref int foo)
{
    yield return null;
    foo = 1;
}

このようにIEnumeratorを返す関数にはrefやoutが使えず、以下のようなエラーが出力されます。

error CS1623: Iterators cannot have ref, in or out parameters

C#の仕様としてイテレータにはref、outを使用することはできないようです。

こちらのStackOverflowでやり取りされている内容を読むと、はは〜ンってなります。 stackoverflow.com

結論

コルーチンにref、outは使えない。

Unity Undefined symbols for architecture arm64というエラーがXcodeで吐かれたときの対応

iOS向けネイティブプラグインを書いて、Unityでビルドしたらこのようなエラーに見舞われました。その備忘録です。

Undefined symbols for architecture arm64:
  "_OBJC_CLASS_$_MFMailComposeViewController", referenced from:
      objc-class-ref in CustomPlugin.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

arm64に対応していないっぽい

Undefined symbols for architecture arm64:

このエラー内容からarm64に対応していないように受け取れます。 自分が作成したプラグインが、arm64に対応していないというネイティブ知識がほぼない僕にとって、かなりきついエラー内容ですが、本題はここでは無くその先にあります。

単純な参照エラーである

"OBJC_CLASS$_MFMailComposeViewController", referenced from: objc-class-ref in CustomPlugin.o

この辺りに答えが書いてあります。 CustomPlugin.oが、MFMailComposeViewControllerを参照できていないというのが今回のエラーの原因です。 MFMailComposeViewControllerを検索するとMessageUI.frameworkが必要なようです。
参考 : iphone - MFMailComposeViewController doesn't link for simulator - Stack Overflow

Plugins/iOS/MessageUI.frameworkという形でUnityプロジェクト内に配置してあげれば、Xcode書き出し時に自動で含めてくれます。

frameworkの場所や、導入方法についてはコチラの記事にまとめています。よろしければどうぞ。

おまけ

f:id:esakun:20190404123137p:plain

Xcode上では↑のようにエラーを教えてくれますが、もっと詳細を見るときは、右クリックしてReveal in Logをクリックすると良いです。


以上です。

参考

UnityのAndroidビルドでApplication.persistentDataPathが取得できない件

UnityでAndroid向けビルド時、C#6.0の新機能文字列補間におけるハマり案件共有です。

実機でApplication.persistentDataPathがNullになる

var path = $"{Application.persistentDataPath}/hogehoge";
Debug.Log(path);

と記述すると、UnityEditor上では正常なのですが、Android実機ではpathの中身はNullになります。

var path = Application.persistentDataPath + "/" + hogehoge;
Debug.Log(path);

というふうに記述すると取得できます。
ちなみに$"{Application.streamingAssetsPath}"も同様に取得できません。

ハマりました。以上です。

環境

  • Unity2018.3.7f1
  • Android 7.1.1
  • monoビルド

こちらもどうぞ

Android向けIL2CPPビルド失敗時に2点考えられること

UnityでAndroid向けにIL2CPPビルドした際に以下のようなエラーが出た場合の対策をメモしておきます。

Exception: /Applications/Unity/Hub/Editor/2018.3.7f1/Unity.app
/Contents/il2cpp/build/il2cppcore/il2cppcore.dll did not run properly!

il2cppcore.dll did not run properly!このエラーです。

上記のエラーと同タイミングで別のエラー内容が出ていると思うので、答えはそちらから探します。

調査すると2パターンの原因があるようです。
※この記事では一旦monoビルドに逃げるということは致しません。

日本語名パスが含まれる

Unityプロジェクトまでのパスに日本語が混じっているとビルドは失敗するようです。
あまり想定されないケースですが、Assets配下に日本語名のPrefabが入ってたりしても問題はありません。

参照エラー

僕の場合はコチラが原因でした。

エラーログ内に以下のような記述がある場合、参照エラーが起きています。

error: undefined reference to 'Hoge_'

この場合、Hoge_メソッドが存在しないということなので、エディタの全文検索でHoge_を探します。
以下のように、iOS向けプラグインなのに#if UNITY_IOSでくくっていなかったのが原因でした。

【誤】

[DllImport("__Internal")]
private static extern string Hoge_();


【正】

#if UNITY_IOS
    [DllImport("__Internal")]
    private static extern string Hoge_();
#endif

このように修正することでエラーを修正することができました。

以上です。

環境

  • Unity2018.3.7f1

参考

Unity ビルド後のAndroidManifest.xmlの書き出し場所

Android開発している際に、AndroidManifest.xmlをごにょごにょ書き換えることが多々あります。最終的にビルド時に書き出されるAndroidManifest.xmlの位置をメモしておきます。

Unityプロジェクトルート/Temp/gradleOut/build/intermediates/
merged_manifests/debug/processDebugManifest/merged/AndroidManifest.xml

最終的に書き出されるAndroidManifest.xmlは上記のパスに書き出されます。


以上

Unity Xcodeビルド時に必要フレームワークを自動的にセットする

今更感があっても、自分が分からなかったら記事にする大庭です。
とあるプラグインを導入しているとき、Xcodeのビルド設定にフレームワークを別途追加しないといけないという要件があり、ジェンキンスでビルドを自動化しているので、その辺りも自動化させてみます。

Plugins/iOS/フォルダに入れるのが楽

昔のUnityではポストプロセスでいろいろやらねばならなかったっぽいですが(未調査)、現在(Unity2018.3)ではフレームワークファイルを一式Assets配下に入れればOKです。
ただ、Plugins/iOS/フォルダに入れてやると自動的にiOSのプラグインとして設定されるのでオススメです。

そもそもフレームワークファイルどこにあるの?

Xcodeアプリの中にあります。

例えばCloudKit.frameworkであれば、以下のディレクトリに格納されています。

Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform
/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/

f:id:esakun:20190319161039p:plain:w250

libz.tbdだったら以下にあったりしますが、.tbdファイルはUnityプロジェクトに入れるではだめです。

Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform
/Developer/SDKs/iPhoneOS.sdk/usr/lib

.tbdファイルはPostProcessBuildを使う

こんな感じでPostProcessBuild処理を書かないと自動的にインポートされないのでご注意を。

そもそもアプリの中身が見れない

Xcodeのバージョンで微妙に場所が違ったりするらしいので、実際に潜って確認したほうが良いかもしれません。 「見かたが分からないよう」という方は、ターミナルで以下のコマンドを実行すると中身がFinderで開きます。

open /Applications/Xcode.app/Contents

では良いXcodeライフを。


以上です。

環境

  • Xcode 10.1

参考

iOS、Android実機でTouchScriptがuGUIのScrollViewの挙動をおかしくさせた時の対処法

f:id:esakun:20150730215258g:plain:w450

AssetStore上でリリースされている最新のTouchScriptを使っているシーンで、uGUIのScrollViewを使用すると、UnityEditor上では正常に動作しますが、iOSやAndroid上では、少し動かしただけですごい量スクロールしてしまいます。

TouchScriptを使用していないシーンで実行すると正常に動くため、TouchScriptが怪しいということはすぐに分かりました。

TouchScriptのissueに上がっていた

ググった結果、

まさにこちらのチケットの状況に陥り、数時間あわあわしてしまいました。

こちらのやり取りにあるようにdevelopブランチを入れると、正常に動くようになります。
もしAssetStoreからDLして使ってて上記のような状況に陥っている場合は、githubからdevelopブランチのソースを使ってみると直るかもしれません。

Riderエディタ上でマウスホイールすると拡大縮小するのを止める

f:id:esakun:20190109100114p:plain
そういうものだと思って少し諦めていた、意識しないようにしていた案件なのですが、RiderでC#を書いている時、いきなりギュン!!!っと文字が拡大(または縮小)する時があります。

そう、マウスホイールです。
※正しく記載すると⌘+マウスホイール

私はマジックマウスを使っているので、ホイールを回している気はないのに、そう判定されてしまう時がしょっちゅうあります。

頻繁にRiderで拡大縮小が起きてしまい、その度に適度なテキストサイズに戻すのが億劫になってきたので、この設定を止めることにしました。

f:id:esakun:20190215145805p:plain

Preferences > Editor > General > Change font size (Zoom) with Command+Mouse Wheelのチェックを外すです。

以上です。良いRiderライフを。

関連しそうなコチラの記事もどうぞ。

参考

CRI ADX2×Unity サウンドのループ再生方法

UnityでCRI AD2を使ってループサウンドの実装方法をメモっておきます。

CRI ADX2の思想的に、サウンドの設定はサウンドデータ側に埋め込んでおきましょう。ということなので、ループの設定自体もサウンドファイル内に埋め込まれる形になります。

AtomCraftを使って作業をしていきます。

マテリアルフォルダ内の各サウンドのインスペクタを開きます。
※ファイルを選択すると表示されます。

f:id:esakun:20190212124701p:plain:w450
上記のようにループ情報の上書きをTrueにし、ループタイプをループに設定します。

これだけでCriAtomExPlayer.Startしてやるとループ再生されます。

最後に

CueInfoからループ設定しているかどうかっていう情報が取れるかなと思ったのですが、そのような情報はありませんでした。どこかで取れると良いのですが、、、、要調査です。

以上

Unity2019.1.0b1、b2のリリースノートをサラッと読んで気になったところ

Android: Added Android notch support

Androidがノッチに対応したようです。

Android: Added OpenGL ES 3.2 support

AndroidがOpenGL ES3.2対応。

Android: Added support for ASTC HDR texture formats

AndroidがASTCのHDRテクスチャをサポートしたようです。 そもそもASTCをAndroidで使えるの?って思いましたが、下記の記事によれば、使える機種もあるようです。
AndroidでASTCを使える条件 - LIGHT11

Editor: Added support for referencing Assembly Definition Files with GUIDs instead of assembly names. Enable with "Use GUIDs" option in Assembly Definition File inspector. Enabled by default for new Assembly Definition Files.

AssemblyDefinitionがGUIDに対応したようです。 今まで文字列参照だったので簡単に名前は変えられませんでしたが、GUIDで参照する設定が増え、リネームもし放題となりました。Use GUIDsにチェックを入れます。
f:id:esakun:20190212000035p:plain

ちなみにこの設定はstaticな設定のようです。

以前このようなイケてないという記事を書きましたが、少しは改善してきているようです。効果のほどは未検証なので分かりません。

Editor: Console : added text based filtering for the console entry list

f:id:esakun:20190212000833p:plain
Consoleに1~10行まで一度に表示する行数を指定することができるようになりました。

Editor: Console : callstack now clickable. Hyperlinks will take you to the source code line for any function calls listed in the stack

f:id:esakun:20190212001227p:plain

図のようにコンソールのコールスタックがハイパーリンクになってソースコードに飛べるようになりました。また、ログの検索もできるようになっているため、Console Enhancedは終焉を迎えそうです。

UnityアセットConsole Enhancedが超絶便利な件 - 渋谷ほととぎす通信

Editor: new keyboard Shortcut Manager configuration interface.

f:id:esakun:20190212002322p:plain
UnityにもやっとキーボードショートカットをまともにいじれそうなUIが追加されました。調べただけで触っていないので使いやすいのかどうかは分かりません。

Particles: Experimental support for using the C# Job System to manipulate particle data

ShurikenがC#ジョブシステムにExperimentalに対応しているらしい。

Editor: Improve performance when interacting with Model Inspector with some large meshes

大きなメッシュをインスペクタに表示したときのパフォーマンスが上がったようです。

Profiler: Increased minimum memory usage for profiler to 4MB in Players and 64MB in the Editor.

もともとどのくらいかは分かりませんが、Profilerが使用する最小メモリ量が上がるようです。

Editor: Added API for managing shortcuts in the editor (UnityEditor.ShortcutManagement)

先に紹介したショートカットのAPIも用意されているようです。

Editor: Added GameObjectUtility.GetMonoBehavioursWithMissingScriptCount and GameObjectUtility.RemoveMonoBehavioursWithMissingScript to be able to remove MonoBehaviours with a missing script from a game object.

ミッシングコンポーネント状態のGameObjectを探しやすくなりそうです。

最後に

ほかにも気になる点はまだまだあるのですが、サラッと読むだけでは理解できないものが多く、それらは記載せずストックしてます。後日調べようかと。特にグラフィックス周り。

個人的にはコンソールの改善(コールスタックのハイパーリンク化部分)は作業効率に直結しそうなので、早く導入したいところです。

CRI ADX2と自分の感覚的がずれていてハマったポイント3点の共有

絶賛Unity×CRI ADX2を触っているのですが、自分の感覚とずれていて、少しハマったところをメモしておきます。

1.一時停止メソッドを叩いてもステータスはPlaying

CriAtomExPlayer(Unityで言うAudioSource的なもの)には、ステータスが存在し、そのEnumが以下のように定義されています。

public enum Status {
    Stop = 0,      /**< 停止中          */
    Prep,           /**< 再生準備中        */
    Playing,        /**< 再生中          */
    PlayEnd,        /**< 再生完了       */
    Error,          /**< エラーが発生 */
}

Pause的なステータスは無いので、てっきりStopステータスになるかなと思って実装したら動かず、、、。
よくよくログ出力して調べるとPlayingステータスのままでした。

2.SetVolumeするだけではボリュームは反映されない

これはCRI ADX2あるあるかもしれないです。

_player.SetVolume(0.5f);
// 更新関数を呼ぶ
_player.UpdateAll();

更新関数を呼んであげないとパラメータは反映されません。
※UpdateAllの他にUpdateという関数もあります

3.再生すると音がキュルキュル鳴る

先日執筆したこれ↑↑ ヘッドホンでテストしていたのでビビりました。

最後に

ただ、ADX2のC#コード内にビッシリとコメントアウトが書いてあるので、ちゃんと読めばハマり続けることはありません。そこはGood!。

そして、だいぶADX2と仲良くなれてきました。

昨年12月頃にMac版のAtomCraftがリリースされていたようで、タイミングが本当によかったです。
そのためだけにWindowsに切り替えるとかめんどいですわ。

CRI ADX2を使用したらUnity上で音がキュルキュル鳴った時の対処法


こちらの記事を参考にADX2をUnityで使用するセットアップをしました。分かりやすく説明されているのでオススメです。

ただ、1点ハマりました。
先の記事があくまでADX2LEについて書かれているもので、僕はプロ版のADX2を使っていました。
ツールのUIが、ほぼ同じで最終的なビルドまでスムーズに進み、Unity側のセットアップも終わって再生した途端、

キュルキュルキュルキュル...

ビルド設定を色々いじったりしたのですが、分からずで、「ADX2 音 キュルキュル」とググって解決しました。

LE版の音源を再生しようとしている

f:id:esakun:20190206144334p:plain
キューシートのバイナリビルド画面ですが、ここでターゲットをPublicにしてはいけません。
下記の公式ヘルプによると、キュルキュル鳴る理由の一つに

ADX2LEのデータをADX2で再生しようとしている。

とあります。

僕は先程のQiita記事の通りにPublicをターゲットにビルドしてしまっていたことが原因のようです。

ターゲットをPCに設定してビルドことで無事にUnity上でも正常に再生できるようになりました。

その他にもハマったポイント

こちらの記事にまとめています。

以上

Unity製MobileNotificationsのローカルPush通知アイコンをアプリ起動時に消す

www.shibuya24.info

先日執筆した記事の中で出てきた問題点が解決したのでその共有。

f:id:esakun:20190205180513p:plain:w150

通知をタップしたら通知アイコンも消えるのかなって思っていたらですね、消えません...。

Unity製Mobile NotificationsでローカルPush通知を実装する(無料) - 渋谷ほととぎす通信

このように通知アイコンを消す方法がわかりませんでした。

@AnzNetJpさんから情報を頂き解決できました。ありがとうございます。

void OnApplicationFocus()
{
#if UNITY_IOS
    iOSNotificationCenter.ApplicationBadge = 0;
#endif
}

このようにバッジの表示は別途処理を書かないといけなかったんですね。。。

解決できてよかったです。

以上