おれんじりりぃぶろぐ

きっと何者にもなれないエンジニアのブログ

C#で特定の文字列を抽出する

数ヶ月に1度くらいの頻度でMatchと向き合わなければならないときが来るわけですが
毎度、1万3000年の時を超えて記憶を辿るはめになるので
次回からはそうならないようにメモしておこう。そうしよう。

"http://sample.com?id=2"からid=2を抽出したい。

using System;
using System.Text.RegularExpressions;

class MainClass {
    
    static void Main(){
        Regex r = new Regex("id=([0-9]+)");
        Match m = r.Match("http://sample.com?id=2");
        Console.WriteLine(m.Groups[0].Value);
    }
}
id=2

数字の2だけ抽出したい。

using System;
using System.Text.RegularExpressions;

class MainClass {
    
    static void Main(){
        Regex r = new Regex("id=([0-9]+)");
        Match m = r.Match("http://sample.com?id=2");
        Console.WriteLine(m.Groups[1].Value);
    }
}
2

簡単じゃん。

MacにUnityのキャッシュサーバーを導入してみる

概要

ビルド時間、Switchプラットフォーム高速化のため Unityのキャッシュサーバーを導入してLaunchAgent登録するところまでやってみました。

インストール

バージョン6以上からはGithubでの管理になりました。

Readme通りnpmでインストールできます。

npm install unity-cache-server -g

npm入れてない場合はあらかじめインストールしましょう。

起動スクリプト作成

適当なディレクトリに以下のスクリプトを用意します。

com.unity3d.CacheServer.sh

#!/bin/sh

export PATH=/usr/local/bin:$PATH

PORT=8126

/usr/local/bin/unity-cache-server --port ${PORT} --log-level 5

権限設定を忘れずに行いましょう。

chmod 744 com.unity3d.CacheServer.sh

port 8126はデフォルトです。

LaunchAgentへ登録

こちらの~/Library/LaunchAgents/com.unity3d.CacheServer.plistにplistを作成します。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.unity3d.CacheServer</string>
    <key>ProgramArguments</key>
    <array>
        <string>(先ほど作ったディレクトリ)/com.unity3d.CacheServer.sh</string>
    </array>
    <key>KeepAlive</key>
    <dict>
        <key>SuccessfulExit</key>
        <false/>
    </dict>
    <key>RunAtLoad</key>
    <true/>
    <key>StandardOutPath</key>
    <string>/tmp/com.unity3d.CacheServer.out</string>
    <key>StandardErrorPath</key>
    <string>/tmp/com.unity3d.CacheServer.err</string>
</dict>
</plist>

登録方法はこちらです。

launchctl load ~/Library/LaunchAgents/com.unity3d.CacheServer.plist

解除はこちらです。

launchctl unload ~/Library/LaunchAgents/com.unity3d.CacheServer.plist

UnityのPreference登録

f:id:orange_lily27:20190115111152p:plain

ローカルだけではなくリモートの登録も可能です。 チーム開発している場合などは、便利かもしれません。

プライバシーポリシー

Fantastic Monsterは、以下のとおり個人情報保護方針を定め、個人情報保護の仕組みを構築し、個人情報保護の重要性の認識と取組みを徹底することにより、個人情報の保護を推進致します。

個人情報の管理 Fantastic Monsterは、お客さまの個人情報を正確かつ最新の状態に保ち、個人情報への不正アクセス・紛失・破損・改ざん・漏洩などを防止するため、セキュリティシステムの維持・管理体制の整備徹底等の必要な措置を講じ、安全対策を実施し個人情報の厳重な管理を行ないます。

個人情報の利用目的 お客さまからお預かりした個人情報は、アプリ内でのデータ保存のみに利用します。

個人情報の第三者への開示・提供の禁止 Fantastic Monsterは、お客さまよりお預かりした個人情報を適切に管理し、次のいずれかに該当する場合を除き、個人情報を第三者に開示いたしません。 お客さまの同意がある場合 お客さまが希望されるサービスを行なうために当社が業務を委託する業者に対して開示する場合 法令に基づき開示することが必要である場合

個人情報の安全対策 Fantastic Monsterは、個人情報の正確性及び安全性確保のために、セキュリティに万全の対策を講じています。

ご本人の照会 お客さまがご本人の個人情報の照会・修正・削除などをご希望される場合には、ご本人であることを確認の上、対応させていただきます。

法令、規範の遵守と見直し Fantastic Monsterは、保有する個人情報に関して適用される日本の法令、その他規範を遵守するとともに、本ポリシーの内容を適宜見直し、その改善に努めます。

お問い合せ Fantastic Monsterの個人情報の取扱に関するお問い合せは下記までご連絡ください。 sheepandwolf.1013@gmail.com

Unityで作ったアプリで端末の電源ボタンを押してもアプリが復活する問題に遭遇した

現象

Unityで開発中のアプリにてAndroidの特定端末でタイトルの現象に遭遇しました。 アプリ起動中に電源ボタンを押してサスペンドさせても数秒後に勝手にロック画面も表示されずアプリが復活してしまうという現象です。 なんと自己主張が強いアプリです。

対処法

BuildSettingsのDevelopment Buildにチェックが入っていたのでOFFにしたところ現象の発生はなくなりました。 全ての端末で起きるわけでもなくAndroidの特定の端末のみで起こるので厄介な問題でした。 (今回、自分が試した端末はAsus Zenfone5でAndroid Nでした) Android ManifestのOrientationとか色々いじりましたが、Unityの余分な仕様というオチでした。

参考

現象は少し異なりますが対処方法は同じでした。

Unityを使って女の子二人を動かすまで

成果物

f:id:orange_lily27:20180801014559g:plain

使用したツール

やったこと

MagicaVoxcelを使って簡単なモデリングをし、blenderでリギングを行いました。さらに、Unityにインポートしてアニメーションをつけるまでを紹介します。

モデリング

MagicaVoxcelを使って頑張ってモデリングをします。 ひととおりモデリングが終わったら右下のobjで書き出しを行います。

f:id:orange_lily27:20180801015548p:plain

リギング

次にblenderを使ってリギングを行います。 こちらで紹介されている素体用のアーマチュアを使わせてもらいました。
アーマチュア、objの順に取り込んでボーンの位置合わせを行います。 右クリックでアーマチュアの頂点を選択することができ頂点移動ができます。 「Remove Doubles」で重複頂点を削除するのも忘れないようにします。
Editモードにすることで左ウィンドウに「Remove Doubles」が出てきます。 f:id:orange_lily27:20180801020420p:plain

Objectモードに再び戻します。 メッシュ -> アーマチュアの順に選択をします。順番が大切です。Shiftを押しながら選択することで複数選択できます。 Ctrl + Pで「Make Parent」->「Armature Deform With Automatic Weights」でメッシュをボーンに関連付けができます。

最後にFbxとしてExportします。

リギングに関してはMixamoという自動で行ってくれる便利ツールがあるのですが、頭が大きすぎるからか髪の毛と腕がくっついてしまって今回は使うことができませんでした。

Unity

さきほど作ったFbxをUnityにD&Dします。

InspectorでAnimationTypeをHumanoidにします。

Configureを押して緑の人間が出てきたら成功です。Musclesで各部位をスライドさせることで動作チェックも行います。これで同じHumanoidTypeのAnimationClipを使い回すことができます。

モデルに色がついていない場合は、MagicaVoxcelのObj出力時に.objと同時にできた.pngを使ってMaterialを作成します。 MaterialのShaderはMobile/diffuseにしてpng画像をセットします。

最後に動かすためにアニメーションを設定していきます。 Unity Chanの3DモデルのAnimation Clipを使いました。

今回はAnimationControllerを使用しないSimpleAnimationを使ってアニメーションをつけました。 こちらの記事を参考にさせてもらいました。

f:id:orange_lily27:20180801014559g:plain

参考

Googleドキュメントにソースコードを綺麗に挿入する

いくつか試しましたが、「Code Block for Google Docs」というアドオンが良かったです。

[アドオン] -> [アドオンを取得] -> 「Code Block for Google Docs」で検索して追加できます。
使い方は、[アドオン] -> [CodeBlocks] -> [Start]から整形することができます。
コードを選択して[Format]を押すと整形されます。

こんな感じで表示されます。 f:id:orange_lily27:20180518203417p:plain

UnityでGCの回数を計測する

GC.CollectionCount()を使ってGCの回数を取得することができます。 GC.CollectionCount(0)はプロセスを起動してからのGC回数を返してくれます。

int startGcCount = GC.CollectionCount(0);

// GCが走りそうな処理

Debug.Log($"GC回数: {GC.CollectionCount(0) - startGcCount}回");