AK2Sのプログラム日記

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

探索アルゴリズム

プログラムのブログをすっごい放置してました(;´Д`) 自分用のメモ程度にこれから徐々に書いていきます。

探索アルゴリズムの種類

大雑把によく使われているもの - 線形探索 - 二分探索

線形探索

検索アルゴリズムの1つ。リストや配列に入ったデータの検索を行う。 先頭から順番に検索を行って、見つかれば終了する。

list = [3, 5, 1, 8, 9, 10, 45, 89, 0, 34, 97, 39, 32]
# sortされていなくても問題ない
item = 32
 
for index in range(0, len(list)):
    if item == list[index]:
        print(f"{index + 1}番目に、{item}を見つけました!")
        break
    elif index == (len(list) - 1):
        print(f"{item}は、listには存在しません")

二分探索

ソート済みのリストや配列に入ったデータ(同一の値はないものとする)に対する検索を行うにあたって、 中央の値を見て、検索したい値との大小関係を用いて、検索したい値が中央の値の右にあるか、左にあるかを判断して、片側には存在しないことを確かめながら検索していく。

大小関係を用いるため、未ソートのリストや大小関係の定義されない要素を含むリストには二分探索を用いることはできない。

if __name__ == '__main__':
    # ソートされてるのが前提条件
    list = [1, 3, 5, 9, 18, 20]
    low = 0
    high = len(list) - 1
    item = 1 #検索したい数値
    
    while low <= high:
        mid = (low + high) // 2 #//で、小数点以下切り捨てることができる
        guess = list[mid]
        if guess == item:
            print(f"見つかりました!{item}")
            break
        elif guess < item:
            low = mid + 1
        elif guess > item:
            high = mid - 1
    if guess != item:
        print(f"{item}は、listに存在しません")

【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について書こうかと思います!

 

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