【Unity】コマンドプロンプト(CMD)を開くEditor拡張
gifはechoでTESTと言わせているだけです.
Unityからプロセスを起動する
ざっと以下のスクリプトでgifのようなことができます.
以下の部分はcmd.exeに投げるコマンドなので,ここを変えれば当然いろいろなことができます.
"/k echo TEST"
ここを
"/c echo TEST"
とするかCallの引数 isHide を true とすることでウィンドウを隠せます.
ご自由にご活用ください.
Unity-QuickSheet入門 ~SpreadSheetを読みこむ~
Unity-QuickSheetでSpreadSheetを読んでScriptableObjectをつくる.
Unity-QuickSheetとは
github.com
ざっくりExcelやSpreadSheetをScriptableObjectにすることができます.
本家のドキュメントはこちら.
Google Howto · Unity-QuickSheet
本記事は大体焼き増しです.
大きく2ステップ
- OAuthのセットアップ
- Unity側で受け取りのセットアップ
ドライブにアクセスするためにOAuth2をセットアップ(Setting up OAuth2 for accessing Google Drive)
SpreadSheetを作る
一行目はフィールドの名前に利用されます.
なのでIntとかFloatといった名前はやめましょう.
そしてValueもやめましょう.(体験談)
理由は後々わかりますが,シート名をHogeDataみたいにすると悲しいことになります.(体験談)
OAuth2の設定をする
プロジェクトを作る
このページからやります.
http://console.developers.google.com/
プロジェクトを作ります.
名前とかは適当で大丈夫です.
OAuthClientIDを取得する
サービス名を設定する
IDの作成にはサービス名の設定が必要だと言われたらおとなしく設定します.
サービス名は適当で大丈夫です.
気を取り直してOAuthClientIDをつくります.
アプリケーションの種類はその他で名前は適当です.
うまくいけばこんな画面がでるはずです.
OKで閉じます.
設定用JSONをダウンロードする
ここからダウンロードします.
手に入れたJSONを使ってClientIDとClientSecretを入力します.
以下のフォルダーにGoogle Data Settingsというアセットがあるはずです.
Assets/QuickSheet/GDataPlugin/Editor
I have OAuth2 JsonをチェックしてJSONを参照するとClientIDとClientSecretは自動的に入力されます.
入力されたらStart Authenticationを押します.
ブラウザが開いて進めていくとこんな画面がでます.
これがアクセスコードなので,AccessCodeに貼り付けます.
Finish Authencationを押して完了です.
ランタイムパスとエディターパスは公式によると
Runtime Path: Data/Runtime Editor Path: Data/Editor
これで十分らしいので何も考えず設定します.
後ほどわかりますがRuntimePathはランタイムに使われるスクリプトが置かれ,EditorPathはエディターで使われるスクリプトが置かれます.
フォルダーがないと後でエラーします.(つまりこの場合Assets/Data/Runtimeを用意しておく必要があります.)
以上でOAuthのセットアップは完了です.
Unity側でデータを受け取るScriptableObjectを作る
Unity上での操作です.
設定ファイルをつくる(Creating Google Spreadsheet Setting File)
場所はどこでもいいですが,私はToolというフォルダを作りました.
ファイル名とシート名を入力してImportボタンを押すと以下のようになります.
(なお,シート名がDataとなっているのは完全に失敗です.)
Typeを設定してGenerateします.
うまくいけばRuntimePathとEditorPathにスクリプトがつくられます.
以下のようになった人は
フォルダが用意されていません.RuntimePathとEditorPathにあたるフォルダをつくっておきます.
スプレッドシートのデータをインポートする(Importing Spreadsheet Data)
受け皿になるScriptableObjectをつくります.
Downloadボタンを押せば
以上です.お疲れ様でした.
【Unity】ReadMeつくるEditor拡張
ReadMeをつくる
見ての通りの選択フォルダにReadMe.txtをつくる.
それだけの拡張です.ええ,それだけです.
自分用gistですが,ご自由にお使いください.
日本語がInspector上に出ない問題
UnityはBOM付きUTF-8じゃないとInspectorに表示できないので,
エンコーディングを固定してやる必要があります.
このあたりの詳しい説明は以下の記事様が参考になります.
blog.nishimu.land
私はこちらのVisualStudioの拡張機能で対応しました.
ForceUTF8 (with BOM) - Visual Studio Marketplace
参考はこちらの記事様
【C/C++】scanfでループしたので標準入力から数値を受け取ることについてまとめる
scanfでループする
以下のコードは不正な入力(例えばabc)を与えると無限ループします.
/* scanfに不正入力をするとループするテスト */ #include <stdio.h> #include <stdlib.h> int main(void){ int x = 0; while(true){ printf("Please input x\n"); scanf("%d", &x); printf("x = %d\n", x); if(x == -1) break; } return EXIT_SUCCESS; }
この原因はscanfが予期しないデータの入力によって,
バッファのデータをそのまま残して動作を終了していることにあります.
scanfは予期しない入力があると無限ループに陥る(C学習中) - 虎塚
変換指定文字列で、期待していなかったデータを入力すると、 バッファのデータをそのまま残し、動作を終了してしまいます。
fflush(stdin);
scanf("%*c");
このあたりも試してバッファのクリアを狙ってみましたが,思うような動作には至りませんでした.
fgetsのあとatoiする
// 独自関数fgetiを実装する // ほぼ問題ないがatoiが範囲外の処理ができない #include<stdio.h> #include<stdlib.h> #include<string.h> #include<limits.h> #define N 512 int fgeti(int*, FILE*); int main() { int x; while(true) { printf("Please input a number\n"); if (fgeti(&x, stdin) == EOF) { continue; } printf("x = %d\n", x); } } int fgeti(int* p, FILE *fp) { char buf[N]; if (fgets(buf, N, fp) == NULL) { return EOF; } *p = atoi(buf); if(*p == 0 && (strcmp(buf, "0\n")!=0)) { return EOF; } return 1; }
こうすることで大抵の処理には耐えますが,範囲(INT_MIN〜INT_MAX)外と
123abcのような頭に数字のついた入力に耐えません.
文字列から数値への変換 - forest book
なお,atoiは変換できない文字列の際に0を返すことにも注意です.
【C言語】atoi関数|ato関数群(atoi, atol, atoll, atof)完全解説 | MaryCore
fgetsのあとstrtolする
atoiよりエラーに強いstrtolを使って
strtoiという関数を定義しました.
strtolは第二引数のendptrに変換出来ない文字列を格納します.
C言語関数辞典 - strtol
// 独自関数fgetiを実装する // atoiからstrtoi(自作)に変更 // これでどんな入力にも対応できる...はず #include<stdio.h> #include<stdlib.h> #include<string.h> #include<limits.h> #define N 512 int fgeti(int*, FILE*); int strtoi(const char*); int main() { int x; while(true) { printf("Please input a number\n"); if (fgeti(&x, stdin) == EOF) { continue; } printf("x = %d\n", x); } } int fgeti(int* p, FILE *fp) { char buf[N]; if (fgets(buf, N, fp) == NULL) { return EOF; } *p = strtoi(buf); if(*p == 0 && (strcmp(buf, "0\n")!=0)) { return EOF; } return 1; } int strtoi(const char* str) { char* endptr; long lstr = strtol(str, &endptr, 10); if (*endptr != '\0' || lstr < INT_MIN || INT_MAX < lstr) { return 0; } return (int)lstr; }
少なくともscanfで直接受け取るよりは堅牢かと思います.
【Unity】CloudBuildをつかって作ったiOSアプリ(IPA)をコマンドラインでiTunesConnectにアップする.
ITunesConnectにアップロードする
p12ファイルとProvisioning Profileの作成は終わっていて,CloudBuildは動いているものとします.
こんな感じですね.
こういう状況になっていない人は,こちらの記事様がわかりやすいかと思います. macdays.hatenablog.com blog.naichilab.com
今回はCloudBuildからダウンロードできるIPAをiTunesConnectにアップロードする方法です.
CloudBuildを行うとIPAファイルをダウンロードできますが,直接iTunesConnectにアップロードする仕組みはないようです.
altool
altoolというものを使います.これはXcodeに付属しています.
簡単に使えるようにPATHにいれてしまうことをおすすめします.
パス名の途中にスペースがあるのでご注意ください.
export PATH=$PATH:/Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Support/
ターミナルを開き直すか,以下のコマンドで更新します.
source ~/.bash_profile
これでaltoolが簡単に使えるようになりました.
アップロード
altool --upload-app -f NAME.ipa -u MAIL@ADDRESS -p PASS
大文字のところは適宜変えてください.
なお,Windowsの方はApplication Loaderというものを使う必要があるようです.(一ヶ月だけ無料です.)
ここで,PASSの部分ですが,App用パスワードが必要です.
設定していない方はこちらを参考に用意してください.
support.apple.com
以上になります.
参考
【Unity】キャラクターをポイントクラウド化するスクリプト
Meshtopologyを変更する
実際はMeshtopologyを変更するだけです.
こんなことができます.
youtu.be
つまり可愛くはなりません.
使い方
アタッチしてスクリプトの上で右クリックしてGo.
以上です.
終わったらRemoveComponentしてください.
ソースコード
Modify MeshTopology with one button.
解説みたいなもの
既存のモデルのメッシュをコピーしてから,トポロジを変更します.
コピーしないと既存のモデルのメッシュが壊れます.壊しました.
元のモデルのとこにメッシュのコピーが作られます.
点の大きさはまた別の処理が要ります.
このあたりです.
notargs様 wordpress.notargs.com
参考
Unity Forum
https://forum.unity.com/threads/how-do-i-duplicate-a-mesh-asset.35639/
【Unity】uGUIのImageに空間フィルタをかけるシェーダー
uGUIのImageに対するフィルタ処理をGPUでやれます.ご自由にお使いください.
フィルタ処理
ソーベルフィルタの例
マテリアルのプロパティを変えれば色々な3x3の空間フィルタがかけられます.
ソースコード
Unity ShaderLab "Custom/UI/Filtered" uGUIのImageに空間 ...
インスペクタ
Cutoutを0以外にすれば明るさが低い部分を切り捨てられます.
シェーダーだけで完結するためにマトリクスを作る部分で無駄があります.
ご了承ください.