渋谷ほととぎす通信

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

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
}

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

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

以上

Unity製Mobile Notificationsで無料でローカルPush通知を実装する

f:id:esakun:20190204205721p:plain:w450

Unity製のモバイル端末向けローカルPush通知パッケージMobile Notificationsというものを試しました。

必須要件

  • Android 4.1以降
  • iOS 10以降

検証してみたところ、Android7.1端末、8.0端末、iOS12のiPhone6sで動作確認は取っています。現在Preview版とのことですが、とりあえず動いてはいます。


使い方は簡単で、Pluginsフォルダを汚すことなく各プラットフォームごとの処理をC#コードを書いていくだけです。

Android版の対応

比較的、実機確認までが容易なAndroidから説明していきます。
Mobile NotificationsをインストールするとProject SettingsMobile Notification Settingsという項目が追加されます。各プラットフォームのタブがあるので、Androidを選びます。 f:id:esakun:20190205124059p:plain:w450

Androidは通知アイコン設定のみで、非常にシンプルです。

項目 内容 備考
Identifier アイコンID 重複してもエラーにならないので注意
Type 種類(small or large) smallの場合はアルファ抜き白になる

f:id:esakun:20190205124852p:plain:w450
ヘッダに表示されるアイコンが、TypeがSmalle Iconです。

f:id:esakun:20190205122703p:plain:w450

f:id:esakun:20190205122727p:plain:w450

このように通知されます。この通知UIをタップするとアプリが立ち上がります。

  1. 通知チャンネルを登録
  2. 通知を予約する

通知によってアイコン、文章を変更することができます。
アイコンは予めアプリに埋め込んでおく必要がありそうですが、文言はマスターに登録しておくなどすれば自由に変更することが可能です。

抜粋コードですが、以下のような実装になります。

通知チャンネルを登録

AndroidNotificationCenter.RegisterNotificationChannel(new AndroidNotificationChannel
{
    Id = ChannelId,
    Name = "Default ChannelName",
    Importance = Importance.High,
    Description = "Channel Description",
});

通知を予約する

AndroidNotificationCenter.SendNotification(new AndroidNotification
{
    Title = title,
    Text = body,
    SmallIcon = "icon_0",
    LargeIcon = "icon_1",
    FireTime = System.DateTime.Now.AddSeconds(afterSec),
    Number = 1
}, ChannelId);

どちらもAndroidNotificationCenterクラスを通して処理を書きます。
ちなみに、通知音を変更することは現状できません。アップデートに期待です。

通知アイコンが出ない問題

Number = 1と設定しているが通知アイコン(アプリアイコン付く番号アイコン)が表示されない問題に出くわしております。どなたか解決方法知りませんかね...?

iOS版の対応

※本記事ではCoreLocation frameworkについては言及しません。あくまで時間をトリガーに通知させます。

f:id:esakun:20190205175139p:plain:w450
iOSはAndroidと違ってまあまあ設定項目がありますが、今回はアプリ起動時に通知許可を確認するのでRequest Authorization on App Launchにチェックを入れます。ローカル Push通知だけであれば、これ以上特に設定する項目はありません。

f:id:esakun:20190205173037p:plain:w450
※このようにアプリ初回起動直後に通知の許可確認ポップアップが表示されます。

Android版との違い

  • 通知許可ポップアップを任意のタイミングで出せる(Androidはそもそも不要)
  • Push通知アイコンは動的変更不可
  • 実機で確認するためにはApple Developer Programが必要
iOSNotificationCenter.ScheduleNotification(new iOSNotification()
{
    Title = title,
    Body = body,
    ShowInForeground = true,
    Badge = 1,
    Trigger = new iOSNotificationTimeIntervalTrigger()
    {
        TimeInterval = new System.TimeSpan(0, 0, afterSec),
        Repeats = false
    }
});

通知ポップアップが許可されれば、上記のようなコードを実行するだけで通知は予約されます。

スリープ時通知 アクティブ時通知 通知アイコン
f:id:esakun:20190205173216p:plain:w160 f:id:esakun:20190205173246p:plain:w160 f:id:esakun:20190205173234p:plain:w160

このような感じにC#を書くだけで通知してくれます。

通知アイコン消せない問題

f:id:esakun:20190205180513p:plain:w100

Androidに引き続きiOSでも1点問題が発生しまして、通知をタップしたら通知アイコンも消えるのかなって思っていたらですね、消えません...。
この件に関しては、また別途検証しようと思います。

※解決しました↓↓

まとめ

ネイティブプラグインを扱うことなく、C#のみでローカルプッシュ通知を実装できました。
また Unityが公式でサポートしているという点が心強いです。
早くPreviewが取れてもらいたいものです。Unity2019のどこかですかね。。。?

今回のサンプルのフルソースは以下です。
通知をキャンセルしたり、他にもいろいろやりたい場合は、このままではできませんが、ただ、動くことを確認するくらいなら問題ないかと思います。

// 10秒後に通知
LocalNotificationWrapper. ReserveNotification("タイトル", "本文", 10);

こんな感じで使います。

以上です。

環境

  • Unity2018.3.2f1
  • Mobile Notifications 1.0.0 preview

参考

Unity TouchScriptの実機ビルドエラーにハマる

Unityアセットストアには2013年頃から存在するTouchScript。
手軽にタップやドラッグ、ピンチインアウトなどの特にモバイルデバイスではよく必要とされるが、実装するのは少し面倒くさい、これらの機能をお手軽に追加することが出来るヘルパーアセットです。

僕が最後に触ったのは2014年頃。

久々にTouchScriptを導入する機会があり、その際にハマったポイントがあったので共有しておきます。

実機ビルドでコケる

続きを読む

これだけはやっておきたいRider設定ランキング

f:id:esakun:20190109100114p:plain:w450

PCが新しくなり、諸々気持ちが一新し、普段Unity開発で使っていたRiderも初期化されました。
設定ファイルをそのままインポートすれば良いのですが、あえて最低限これだけはやっておきたい設定が何だったのかをランキング形式で確認したいと思います。

Riderの環境

  • Rider2018.3
続きを読む

Unity RenderTextureのメモリを解放するのはReleaseが良いの?Destroyが良いの?

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

RenderTextureのメモリ確保と解放タイミングを確認し、Release関数、Destroyどちらでも解放されることが分かりました。
2種類どちらを使った方が良いかという考察をしています。

普通に考えると、RenderTexture自体がクラスなのでGCを抑えるためにnewの回数は減らしたいので、DestroyせずReleaseを使って再利用可能にしておくのが良いのではないかという予測が立ちます。

実際に実機とつないだUnity ProfilerでCPUプロファイリングして確認します。

環境

  • macOS HighSierra 10.13.6
  • iPhone6s iOS12.1
  • Unity2018.3.0f2
  • Xcode10.1


以下の表はW2048×H2048px ARGB32bit 1枚のRenderTextureの生成、Blit、Release、Destroyをプロファイリングした結果です。

続きを読む

Unity RenderTextureのメモリ確保と解放タイミングの落とし穴

RenderTextureを動的にスクリプトから生成して、Blitしてごにょにょするというフローの中で、どのタイミングでメモリが確保され、いつ解放されるのか確認したいと思います。

メモリのプロファイルということでUnity製MemoryProfilerを使います。
本環境はUnity2018.3.0f2なので、PackageManagerから0.1.0-preview.3をダウンロードします。

続きを読む

【WIP】Unityを使ってクリスマス的な何かを制作して季節を体感していきたい

僕は普段1日の大半を室内で過ごしています。外に出ている時間なんて計算すると4%位です。
気づけばそろそろクリスマス。娘がサンタさんに手紙を書いている姿を見かけました。

ということで、本ブログも季節感を取り入れていこうと思い、クリスマスをテーマになにか作るという行為を始めました。

続きを読む

Unity2018.3.0からDynamicResolutionがiOSやAndroid端末で使えるようになっているので検証

先日リリースされたUnity2018.3の新機能をなめている最中です。本記事ではDynamicResolutionについて検証します。

DynamicResolutionとは?

ランタイム中にレンダーターゲットの解像度を変更することができる機能です。
例 : 1920×1080で描画していたものを、動的に1280×720の解像度に落としたり戻したりすることが可能
リッチなイメージエフェクトや無駄に高い解像度端末のせいで、フラグメントシェーダの負荷(GPU負荷)が高くなってしまった状態を打破する手段の1つとして考えられます。

重要なのは解像度を変更するしないを、カメラないしはレンダーテクスチャ個別に選択できるという点です。

Unity的には2017.3のタイミングでXbox Oneでサポートしていました。
Unity 2017.3がリリースされました! – Unity Blogより

Unity2018.1でPS4に対応した模様。
Unity 2018.1 リリース – Unity Blogより

Unity2018.3で、ついにiOS(Metalのみ)、Android(Vulkanのみ)*1に対応しました。

Mobile improvements include Dynamic Resolution Scaling support for Vulkan and Metal, Android AppBundle generation support and faster APK package build times on Android with APKzlib.

Introducing Unity 2018.3 – Unity Blog

ということで、手持ちのiPhone6sで検証してみます。
※iOSなのでMetalは必須

*1:その他にNintendo Switch、tvOS(Metalのみ)に対応しています

続きを読む

Unity2018.3.0からGCを作動させないGarbageCollectorというAPIが追加されている

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

先日Unity2018.3.0が正式リリースされ、リリースノートを粛々読んだり、Unityブログを舐めている最中です。

気になった機能の一つとして、GCをコントロールするAPIが提供されたようなので検証しておきます。

GarbageCollectorクラスを使う

UnityEngine.Scriptingネームスペースに、GarbageCollectorというスタティッククラスが追加されています。機能としてはとてもシンプルで、GCをONにするかOFFにするかをセットするだけです。

コードとしては以下のような感じになります。

ご存知の通り、本来GCはシステムが気を利かせて正常にプロダクトが動作するように実行しているお掃除です。
それを開発者側で止めることが出来るようになったのは、嬉しいことですが責任も乗っかってくるため、用法用量を守って正しく使う必要がありそうです。

環境

  • Unity2018.3.0f2

ひとこと

島村楽器店で電子ピアノについての各メーカーの特徴を伺ったところ、ローランド最高ということだけわかった。