読者です 読者をやめる 読者になる 読者になる

AK2Sのプログラム日記

フリーランスプログラマのプログラムに関する日記です

【Unity】LeanTweenの拡張

どうも~AK2Sです!

Unityを使っていると様々なTweenライブラリがありますよね?

代表的なもので言うと…


・iTween:https://www.assetstore.unity3d.com/jp/#!/content/84

・DOTween:https://www.assetstore.unity3d.com/jp/#!/content/27676

・LeanTween:https://www.assetstore.unity3d.com/jp/#!/content/3595


でしょうか?

 

私個人では、LeanTweenをいつも使用しています。

なんでかというと、LeanTweenはAndroid/iOS向けに開発されており挙動が軽い、オープンソースっていう点ですかね?

 

iTweenは使用すれば使用するだけ結構ゴミが貯まるのであまり使ってなくて、DOTweenはDLL化されており内部が見えない、バグがあった場合修正待ちになるしエラーを隠蔽してる。

 

まぁDOTweenはSequenceとYieldinstructionで更新タイミングが選択出来るってことくらいかな?個人的に良いなーと思うのは。

それ以外に使うって利点が特になかった(Vitaだととても不思議な挙動を見せたのでそもそも信用してない

 

まぁそんな事でLeanTweenを使用している訳ですが、LeanTweenをもっと使いやすくしたいなーと思ってDOTweenと同等までとは流石にいきませんが機能を拡張してるので公開してみます!

 

github.com

 

拡張スクリプトは2つあって

・LeanTweenExtensions.cs

・LeanVirtual.cs

LeanTween.valueとかからアクセスするのが面倒なのでTransformやらなにやらを拡張していたりしてます。

あとはLeanTweenは必ずGameObjectが必要になるので、LeanVirtualでその辺をLeanTweenのEmptyを代用して隠蔽してます。

 

そのうち自分でもTweenライブラリをちょっと作ってみようかなーとか思ってます、今あるUnityのTweenライブラリでは表現出来ないことがあるので…。

 

それでは今日はここまで!

良いプログラミングライフを(。-ω-)zzz

 

 

 

【Unity】Editor&スマホ端末のマウスとタッチを共通で処理する

こんばんは、AK2Sです!

タップエフェクト*1を実装した時にEditorとスマホ端末で入力位置を検出する際、UnityEditorだとマウススマホ端末だとタッチで検出しないといけません。

 

マウスに関しては必ず1点ですが、タッチは数点ありますので他の人はどんな感じに入力をまとめてるのかなーとか思ってネットで調べてたら、だいたいタッチは1番目のタッチしか使ってないんですよねぇ(実装したいタップエフェクトは指2本以上使う可能性がある…!

Input::touches::fingerIdでタップした指が何番目の指なのか情報を保持しているのでそちらを使って対応してみました!

 

ちょっとスクリプトが長いのでURLだけ貼り付けておきます(ヽ´ω`)

InputPointer.cs

github.com

 

使い方はこちら↓

まずStart関数でInputPointerをInitializeしてあげます、そうするとInputPointerのインスタンスが生成されますので、そちらでマウスとタッチ両方のイベントの管理を行っています。

(Initializeの引数が記載されていませんがデフォルト引数で2個まで管理出来るようになってます!

 

次にUpdate関数で管理しているInputPointer::Pointerのインスタンスを取得して、管理しているPointerの現在の状態が取得出来るようになっています!

サンプルのスクリプトの挙動としては、画面をクリックorタッチするとパーティクルが発生してそのまま指を離さない場合は、クリック位置orタッチ位置に追従するようにパーティクルが発生します(*´ω`*)

 

管理するPointerの数はドラッグのパーティクルと数を合わせているので、そのままfingerIdと連動させているという感じです!

 

それでは今回はここまで!

何かご質問やご指摘があればご連絡ください(∩´∀`)∩

 

 

 

*1:画面をタッチした時に表示されるエフェクト

【Unity】Webviewの表示

どうもこんばんは!AK2Sです(ヽ´ω`)

今週に入ってからお仕事でAndroid/iOS用にWebviewの実装を行ってました!

Unity5.3↑からかな?iOS9の仕様により少し仕様が変わってましてちょいと苦戦してたので、もしかしたら同じ事で悩んでいる人がいるかもしれないのでまとめておきます(*´ω`*)

 

1.使用ツール/プラグイン


Engine - Unity5.4.0f3

プラグインhttps://github.com/gree/unity-webview (greeから提供されているプラグイン)

OS - OS X EI Capitan version 10.11.5

 

※このプラグインを使用したWebviewをEditorで確認するには、Macでしか動作しません!

 

2.unity-webview使用方法


2-1.unity-webviewのダウンロード


 https://github.com/gree/unity-webviewからzipファイルをダウンロードし解凍を行います。

f:id:AK2S:20161019012112p:plain

解凍が終わったら、次に新しいUnityのプロジェクトを作成し(UnityWebviewSampleとした)解答したフォルダの中に入っている unity-webview.unitypackage をプロジェクトにインストールします。

→ Directory:unity-webview-master/dist/unity-webview.unitypackage 

f:id:AK2S:20161019012251p:plain

f:id:AK2S:20161019012257p:plain

2-2.サンプルの作成


UnityWebviewSample.csとし以下のようなスクリプトを作成する。

f:id:AK2S:20161019012434p:plain

UnityEditorに戻りHierarchyに空のオブジェクトを作成し、先ほどのサンプルスクリプトをアタッチする。

GameView上でWebviewが表示されたら成功です。

f:id:AK2S:20161019012508p:plain

 

3.各プラットフォームの設定


3-1.UnityEditor


Unity5.3よりiOSのセキュリティが強化されたことにより上記の方法のままではEditorで確認できなくなりました。

      f:id:AK2S:20161019012618p:plain

     このように、NSAppTransportSecurity(http://dev.classmethod.jp/smartphone/iphone/ios-9-     intro-ats/)により警告がログに表示されGameViewが白紙で表示されます。

 

3-1-1.NSAppTransportSecurity対処法


 

これを対処するにはInfo.plistファイルの更新が必要となります。

EditorのInfo.plistの格納場所を調べるには、unity-webviewプラグイン内の WebviewObject.cs :: Init 内にログを仕込むことにより確認が出来ます。

f:id:AK2S:20161019012749p:plain

f:id:AK2S:20161019012759p:plain

この場合だと file:///Applications/Unity/Unity.app/Contents/Info.plist がEditorでの対象ファイルとなります。

 

Info.plistに以下を加えてください。(面倒なのでGistを端折る(;´Д`)

---------------------------------------------------------------

<key>NSAppTransportSecurity</key>

<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
---------------------------------------------------------------
これで警告が表示されず、UnityEditor上でもWebviewが表示されるようになります!
 
3-2.iOS
 
3-2-1.NSAppTransportSecurity対処法

Edit → Project Settings → Player から Other Settings を選択します。

      f:id:AK2S:20161019013152p:plain

Allow downloads over HTTPのフラグをTRUEに設定します。(Unity5.2.1以降はデフォルトでTRUEに設定されているそうです。

 

UnityでのUpdate負荷テスト

はい、どうも~AK2Sです!

先日はGitHubうpしただけでギブアップしてしまいました(;´Д`)

とのことで、UnityでのUpdateの負荷の検証を行いましたので結果を!

 

1.MonoBehaviourインスタンス3万個同時にUpdateさせる

UpdateTest/Assets/Tester/Test01 at master · AK2S/UpdateTest · GitHubf:id:AK2S:20161017214742j:plain
2.MonoBehavioru1個に3万個のインスタンス参照を持たせ、Updateを一つにまとめる

UpdateTest/Assets/Tester/Test02 at master · AK2S/UpdateTest · GitHubf:id:AK2S:20161017214021j:plain

 

3.Task構造を作成し、Interfaceを介してMonoBehaviourを継承したクラスをUpdateさせる

UpdateTest/Assets/Tester/Test03 at master · AK2S/UpdateTest · GitHubf:id:AK2S:20161017214226j:plain

 

4.Task構造を作成し、Interfaceを介してC#のクラスからTransformの参照を持ちUpdateさせる

UpdateTest/Assets/Tester/Test04 at master · AK2S/UpdateTest · GitHubf:id:AK2S:20161017214410j:plain

 

結果は処理が早い順で… 1 > 4 > 3 > 2

やはりUpdateを一つでまとめたものは処理早いですね(´・ω・`)

 

Updateを呼ばなくてもMonoBehaviourを継承してるだけで例外なく遅くなる…まぁでも使わないだけマシかな?

 

今回のテストではListではなくArrayを使用しています。

それは単純にListよりArrayを使用した方が配列へのアクセスが早いから!

 結構これは当たり前の事だったりします。

 

でも使用用途的に可変か不変かでも実装方法は変わってくると思いますのでケースバイケース

個人的にゲームはCPU/GPUキツくなってくるときが必ずあると思うので、MonoBehaviourを継承しててもいいのでUpdateは一つにまとめるべきだと思う(´・ω・`)

っま、MonoBehaviour継承しないと結構取り回しがきついですけどねw

 

それでは負荷テストについてはここまで!

次回はUnityのWebviewについて書こうかと思います!

 

それでは良いプログラミングライフを!(∩´∀`)∩

 

UnityでUpdateをまとめた時の効果

ひとまずサンプル用GitHubを公開します!

 

github.com

詳細については後日まとめます( ´∀`)

delegate(デリゲート)のコールチェック

どうも~こんばんは、AK2Sですヽ(゚∀。)ノ

皆様いかがお過ごしでしょうか?

最近は10月なのに寒暖差が激しいので体調を崩さないようにご注意ください!

 

さてさて、今日はdetegateについてお話しようかと思います。

 

delegateとは? delegate (C# リファレンス)


delegate は、指定されたメソッドまたは匿名メソッドをカプセル化するために使用される参照型です。

delegateとは「委譲」という意味で簡単に言うと同じ型の同じ引数のメソッドを代わりに実行しますよーというものです。

 

うちもこの業界に入ってから「delegate」という単語を聞いた時

( ゚д゚)ポカーン

となりましたが、幸いC++をやっていたため「関数ポインタ」で納得できました。

 (こんな人でもゲームプログラマーになれます…っ!

 

ここはでC#にある定義済みdelegateでサンプルを書いてみましょう。

 どうでしょうか?コンソールログにHogeが出力されると思います。

 

このような感じにメソッドを登録して、代わりにコールする…

イベントハンドラー的な扱いが出来るのがdelegateです。

 

delegateは自分でも定義出来るので、様々な型が対処出来ます!

自分定義のdelegateを登録するには

デリゲート - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

こちらのリンクを参照してみてください!

 

さてさて、ここでdetegateの使い方がわかったところでこのdelegateを匿名関数で使用してみたいと思います。

 

匿名関数とは? 匿名関数 (C# プログラミング ガイド)


匿名関数は、デリゲート型になるところであればどこでも使用できる "インライン" ステートメントまたは式です。 これを使用すると、名前付きデリゲートの初期化や、名前付きデリゲート型の代わりにメソッド パラメーターとして渡すことができます。

 

つまりこういうことです↓

 this.Hogeの次に何やら変な記号 () があると思いますが、これはラムダ式と言うものです!

このラムダ式を使うとメソッドの定義が省けるって訳なのです…!便利ですね!

そしてこのラムダ式を使用してる部分匿名関数です!(認識合ってるかな…?(;´Д`)

 

さて、ここまでは前説でここからが本題です!

 

delegate使用時のコールチェック


皆さんはこのようなコードを書いたことありませんか?

こんな感じにpublicでメソッドをコールして、処理してdelegateで処理が終了したことを通知して…そして通知する時にdelegateのNULLチェック!

 

自分は結構こういうNULLチェックが面倒と思う方なので、何か共通点を見つけてUtility的なものを作成するんですよね(´・ω・`)

 

そして今回GitHubC#定義済みdelegateに対応したdelegateのクラスを追加しました!

AKLib/DelegateExtensions.cs at master · AK2S/AKLib · GitHub

AKLib/Dlg.cs at master · AK2S/AKLib · GitHub

使用方法はこちら↓

 

このようなサンプルの感じに使用すればいちいちNULLチェックしないでdelegateがコール出来ます!

そして両方のdelegateサポートクラスには返り値でboolが返ってきますので、正常にメソッドがコールしたか否かの判別も出来ます!

 

さて、今日はここまで!

それでは良いプログラミングライフを!(*´艸`*)

Unityでのメモリの破棄方法

こんばんは~AK2Sです!

 

C#ではあまり気にしないメモリですが、ゲーム作成となると結構メモリがシビアだったりしませんか?

UnityForVitaだと使用できるメモリが128MB~256MBしかなくかなーり四苦八苦してました(最近のスマホ端末だと1GB前後はあるかな?

そこでその時に自作して使用していたメモリ関連のクラスを先日、使用する機会が出来たので整理がてら紹介したいと思います(ΦωΦ)

※ある程度C#のメモリを知っている人向けの話になります


Unityでソースコードを書いている時にこんなコードを書いた事はないでしょうか?

ここで気になるのがOnDestroyのnullチェックです。

初めてプロパティにアクセスした時にNewをしてインスタンスを生成する、if文等でインスタンスが生成されない場合がある処理など、インスタンスをまだ生成していない時にOnDestoryをコールする可能性がある場合Nullチェックを行わなくてはいけません。

 

これを回避するには…

  • Fieldで定義した時に一緒にNewしておく
  • コンストラクタでNewをしておく

などの処理が必要になります。

Unityの場合はSerializableで自動的にNewされている場合があるので、後者では対応出来ない場合があります…。

 

そこでこういったケースを回避する為に作成したのが、今回紹介するMemoryクラスです!

github.com

 

使い方はこちら↓

Nullチェックがないぶん随分とスッキリしましたよね?

MemoryクラスのDelete系のメソッド破棄を宣言することによりメソッド内でNullチェックを行い、それぞれの型に応じたメモリの解放を行っております。

 

もちろん、OnDestroy以外でもIDisposableを継承したクラスや破棄したい時に使用しても大丈夫です!

ちなみにMemoryメソッドにrefリファレンスオーバーロードされているのは、アクセスを早くするためです。

また、プロパティで定義した変数refリファレンス使えませんのでこちらにも対応出来ます!

 

それでは今回はここまで!

それでは良いプログラミングライフを!(∩´∀`)∩