如雨露の日記

学んだことを適当に書いていくサイト

Puredata拡張オブジェクトのWindowsコンパイルする方法

今まで下のサイトの通りにPure Dataのコンパイルを行っていたのですが、初期の設定が面倒だったので別のやり方が出来ないのか調べてみました。

theartofzero.php.xdomain.jp

 

ぶっちゃけ自信はないのでもし間違っていれば指摘していただけると泣いて喜びます。

dll開発してればみんなVisual Studioは入れていると思うのでインストールしている前提で話を進めます。

Visual Studioをインストールしていれば入っているであろう開発者コマンドプロンプトを開き、プロジェクトのフォルダへ移動。

フォルダ内には必要なライブラリーも含め.libが存在するようにしてください。

んで、これを入力(Pd公式のチュートリアルのhelloworldをコンパイルしてます)。

cl /LD helloworld.c pd.lib /link /export:helloworldsetup

~.cやexport:~の部分は各自適切に置き換えてください。

もしライブラリー追加してるのであればpd.libのあとに~.libと入力すればいけるはず。

実行してdllが作成されており、それがPure Dataで問題なく動作していれば成功です。

Inno Setupを使ってみる

ちょっとWindowsインストーラーを作成することになったので色々調べてました。

有償で高機能なものはある程度みつけられたのですが、とある機能を実装したかったのと無償で商用利用したかったのでそれらは使うことができません。(金払え)

そこで探している最中にみつけたInno Setupを利用することにしました。

Inno Setupはオープンソースで開発されているインストーラーの作成ソフトです。

設定をいちいち書いてく必要がありますが、その分自由度が高いです。アイコンが差し替えられたりとかインストール後にサイトに飛ばしたりとか、定数でOSのパスの問題を解決してくれてるのはありがたい。

インストールとかは公式から各自やってください(ぶん投げ)

あ、あとチュートリアル的なサンプルコードと記述の方法はこちらを参考にしてください。こちらのサイト様が優秀すぎて私が基本的なことを書く必要がないですね。

何かわからないことがあれば、英語で調べると大体他の人がやろうとしててstackoverflowあたりに同じことが質問されているはずです。

次の更新時にはInno Setupを使ったインターネットからのダウンロード処理かZipの解凍処理を書くと思います。(タイトル詐欺だと今気が付いた)

Visual StudioでPuredataのデバッグをする

お久しぶりです生きてます。

今回は研究室で使ってるPuredataの記事です。

Puredataって何ぞという方はぐぐってくださいませ~。

といっても今回の記事はそんなに大したことありません。

Puredataは自作のオブジェクトを作ることができますが、デバッグの手段がないと色々と不便なので調べました。

作業量はほとんどありません。

まずはVisual Studioのプロジェクトのプロパティを開いて

構成プロパティ→デバッグを選択。

コマンドにPuredataのexeを選択し、作業ディレクトリにPuredataのbinを選択してください。

f:id:ninataka_japan:20160619230232j:plain

これでビルド時にPuredataが起動します。

設定が終わり、コードも作成したらデバッグを始めましょう。

f:id:ninataka_japan:20160619230949j:plain

ローカル Windows デバッガーのボタンを押せばビルドと同時にPuredataが起動します。

あとはPuredataからビルドしたオブジェクトを読み込んで実際に動作させます。

ブレークポイントが設定できるので、それを上手く利用してデバッグしていきましょう。

Facebook Bot APIをさくらインターネットのレンタルサーバーで動かしてみた

最近BOTが熱いですね。

一斉に情報を送信できたり、対話形式でのやりとりから情報を入手できるというのはとてもよさそうです。

さて、今回はSPAJAMというハッカソンでFacebook BOT APIを使ってみて色々と可能性を感じたのと情報がまだ少ないかなと思ったので導入的なものを書いてみました。

さっそく解説をしていきたいと思います。

こちらで開発者登録をしてない方は登録してください。

Facebook開発者 - 開発者向けFacebook

登録が完了したら、画面右上のマイアプリから新しいアプリを追加してください。

f:id:ninataka_japan:20160418142523j:plain

WWWでウェブを選んで適当なApp名を入れたらSkipしちゃって構いません。

 

f:id:ninataka_japan:20160418143919j:plain

Appを作ったら、Facebookページを作成 | Facebookから架空の人物やら適当に作ってください。

作ったらAppの画面に戻って左下にあるMessangerからトークンを生成しましょう。

生成するといってもFacebookのページを選ぶだけです。

その下にあるWebhookでユーザーからメッセージが飛ばされたときにコールバックされるURLを指定できます。

最初はFacebook側から送信されるものをきちんと処理しているかチェックされているようなので、正しくコードを書いてください。

public function hook() {
$hub_verify_token = "FacebookBotTest"; // 適当なトークン
if ($_GET['hub_verify_token'] == $hub_verify_token) {
echo $_GET["hub_challenge"];
} else {
echo 'error';
}
}

hub_verify_tokenの部分は自分で作成します

中身はなんでも大丈夫ですが、Facebook側から送るトークンと一致するようにしてください。

上手く行けばこのような画面になると思います。

なお、SSLが必要で送信先のURLはhttpsであるのが条件です。

さくらインターネットのコントロールパネルのドメイン設定→共有SSLを利用するに設定してください。

f:id:ninataka_japan:20160418155344j:plain

これで、アクセストークンとWebhookの設定が完了です。

では、BOTを起動しましょう。

curl -ik -X POST "https://graph.facebook.com/v2.6/me/subscribed_apps?access_token="

 この<token>の部分に生成したページアクセストークンを設定してください。

 問題なければ

"success":true

と帰ってくるはずです。

これで問題なくBOTが動作するはずです。

ただ、今の段階ではBOTから何も帰ってこないので先ほど設定したWebhookのURLの中身を書き換えましょう

public function hook() {

define('VERIFY_TOKEN', 'あなたが設定したトークン');
$method = $_SERVER['REQUEST_METHOD'];
$access_token = "あなたのアプリのアクセストークン";


if ($method == 'GET' && $_GET['hub_mode'] == 'subscribe' &&
$_GET['hub_verify_token'] == VERIFY_TOKEN) {
echo $_GET['hub_challenge'];
} else if ($method == 'POST') {

// メッセージ受信
$json_string = file_get_contents('php://input');
$json_object = json_decode($json_string);
$from_user_id = $json_object->entry{0}->messaging{0}->sender->id;
$message = $json_object->entry{0}->messaging{0}->message->text;

//メッセージ作成
$post = <<< EOM
{
"recipient":{
"id":"{$from_user_id}"
},
"message":{
"text":"{$message}"
},
"notification_type": "REGULAR"
}
EOM;

$url = "https://graph.facebook.com/v2.6/me/messages?access_token={$access_token}";
$headers = array(
"Content-Type: application/json"
);

$curl = curl_init($url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$output = curl_exec($curl);
}
}

 改行されてないな・・・見難くてすみません。

 これで動くはずです。

動かない方はコードの中にerror_logを出力するようにして内部で何が起きてるのかを確認できるようにしてみてください。

私のはこのような感じです。

f:id:ninataka_japan:20160418221704j:plain

これはただ単にメッセンジャーから受け取った文章と同じ文章を返すだけですが、簡単に出来ますね。

トークン関係で悩むやつなんていないよね。

 

StateMachineBehaviourを使ってみる

Unity5ではステートにStateMachineBehaviourを継承しているスクリプトがアタッチできるようになり、そのステートの再生中にコールバックが呼ばれます。

一覧

・OnStateEnter ステートが呼ばれたとき(Updateの最初)

・OnStateUpdate ステートが呼ばれたとき(最初と最後以外のUpdate)

・OnStateExit ステートが呼ばれたとき(Updateの最後)

・OnStateMove MonoBehaviour.OnAnimatorMoveの直後

・OnStateIK MonoBehaviour.OnAnimatorIKの直後

 

実際に追加してみるとこの様な感じです。

f:id:ninataka_japan:20150727195158j:plain

1つだけではなく、複数スクリプトをアタッチすることが出来ます。

なので処理を細分化し、よりコンポーネント指向っぽい感じになりますね。

写真だと移動スクリプトと向きの変更スクリプト、アニメーションの速度変更スクリプトです、前者2つはともかく後者はなんでこんなことしてるか不思議に見えますよねw

Player制御のスクリプトがすっきりしそうです。というかUpdate内

のコードがほとんどなくなりました。

f:id:ninataka_japan:20150727195849j:plain

f:id:ninataka_japan:20150727203243j:plain

ちょうど今は敵キャラクターの制御を作成していて、EnemySTMを継承させてMoveというスクリプトからEnemyControllerの処理を呼び出しています。

敵キャラクター、プレイヤーの制御もこれでだいぶ作りやすくなったのではないでしょうか。

Photon Unity Networkingを試してみる(Animation)

原因がわかりました。

それは後述するとして、さっそくやり方を書いていきます。

今回はアニメーションを使うので前回と違ってアニメーションをしてくれるキャラクターが必要です。

 ここからSDユニティちゃんをダウンロードしましょう。

インポートした後にPrefabsのSD_unitychan_humanoidをHierarchyにD&Dした後にアタッチされているスクリプトを全てRemove Componentしてください。

今回はmecanimのアニメーションはシンプルにしました。

新しくAnimatorを作成してアニメーションを2つ追加しましょう。

f:id:ninataka_japan:20150717190446j:plain

 float型のRunSpeedをParametersに作成して

遷移条件を0.1でそれぞれGreater,Lessに設定してください。

f:id:ninataka_japan:20150717190448j:plain

f:id:ninataka_japan:20150717190449j:plain

作成したAnimatorをSD_unitychanのAnimatorのControllerにアタッチ。

これでmecanimは作成完了。

さて、UnityChanControllerのスクリプトはこちら

RunSpeedに値を流し込んでアニメーションが遷移するようになっています。

 後はこのようにコンポーネントを追加して

f:id:ninataka_japan:20150717190902j:plain

中身はこの様に設定してください。

f:id:ninataka_japan:20150717191135j:plain

これで完成!!、のはず

これをResourcesフォルダに新しくPrefabを作成してこれまで設定をしたSD_unitychanをプレハブ化してください。(私はUnityChanとしてプレハブ化しました)

あとはNetworkManagerの中のPhotonNetwork.Instantiateで生成するオブジェクトをプレハブ化したSD_unitychanに変更してビルド、実行してみてください。

このようになりましたか?


uploaded by ninataka_japan on GIFMAGAZINE

なっていれば完成です。お疲れ様でした。

なお、私が時間がかかっていた部分は同期オブジェクトが静止しているにもかかわらず、同期先でオブジェクトが動いていたことです。原因はPhoton Transform ViewのSynchronize PositionのExtrapolate Optionの設定ミスでした。

Extrapolateは、速度と最後の更新から経過した時間と位置を元にオブジェクトの今の位置を推定します。そのため、速度があまり変わらないオブジェクトに適していますが今回のようにユーザーが走らせたり止まらせたりできるものでは使わないほうがいいでしょう。

私はこちらもSynchronize Valuesにしていたので同期オブジェクトが動いてしまっていたんですね。

基本Disableにしたほうがいいかもしれません。

今回は以上です。

 

ユニティちゃんライセンス

このコンテンツは、『ユニティちゃんライセンス』で提供されています

UnityでGoogle Street Viewを表示させる

思った以上にアニメーションの同期に時間がかかっています。アニメーションは同期しているのですが、なぜかPositionがカクカクで・・・。

なので先にこっちを記事にします。

さて、Google Street Viewみなさん試したことありますよね?

今回はUnityでGoogle Street Viewを表示させてみようと思います。

コードはこちら

googleのstreet viewのURLを叩くときに経度と緯度、画像のサイズ、画像の向き、ズームとかいろいろ指定できるみたいです。すごい。

基本的にはlatitude,longtudeを変えるだけで使えると思います。

Skyboxの6面画像をStreet Viewから取得して張り付けしているだけなので特に変わったことをしているわけでないかと。

Skyboxは動的に作成しようとしたのですが、ビルドした後でエラーで怒られていたので外部からmaterialを生成してShaderをSkybox/6 Sidedにしたものをスクリプトにアタッチしてください。