AkiIroブログ

初心者なりにゲームとプログラミングのことについて書いていきます。

【Unity】コマンドプロンプト(CMD)を開くEditor拡張

f:id:AkiIro:20180910225729g:plain
gifはechoでTESTと言わせているだけです.

Unityからプロセスを起動する

ざっと以下のスクリプトでgifのようなことができます.

Unityからコマンドプロンプトを起動するスクリプト.

以下の部分は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/
プロジェクトを作ります. f:id:AkiIro:20180820231945p:plain 名前とかは適当で大丈夫です.

OAuthClientIDを取得する

f:id:AkiIro:20180820232248p:plain
サービス名を設定する IDの作成にはサービス名の設定が必要だと言われたらおとなしく設定します. f:id:AkiIro:20180820232336p:plain サービス名は適当で大丈夫です.

気を取り直してOAuthClientIDをつくります. f:id:AkiIro:20180820232430p:plain
アプリケーションの種類はその他で名前は適当です.

うまくいけばこんな画面がでるはずです. f:id:AkiIro:20180820232922p:plain
OKで閉じます.

設定用JSONをダウンロードする

ここからダウンロードします. f:id:AkiIro:20180820233345p:plain

手に入れたJSONを使ってClientIDとClientSecretを入力します.
以下のフォルダーにGoogle Data Settingsというアセットがあるはずです.

Assets/QuickSheet/GDataPlugin/Editor

f:id:AkiIro:20180820233039p:plain
I have OAuth2 JsonをチェックしてJSONを参照するとClientIDとClientSecretは自動的に入力されます.
入力されたらStart Authenticationを押します.
ブラウザが開いて進めていくとこんな画面がでます.
f:id:AkiIro:20180820234139p:plain
これがアクセスコードなので,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)

f:id:AkiIro:20180820234508p:plain
場所はどこでもいいですが,私はToolというフォルダを作りました.
f:id:AkiIro:20180820235447p:plain
ファイル名とシート名を入力してImportボタンを押すと以下のようになります.
f:id:AkiIro:20180820234648p:plain
(なお,シート名がDataとなっているのは完全に失敗です.)
Typeを設定してGenerateします.
うまくいけばRuntimePathとEditorPathにスクリプトがつくられます.

以下のようになった人は

f:id:AkiIro:20180820234906p:plain
フォルダが用意されていません.RuntimePathとEditorPathにあたるフォルダをつくっておきます.

スプレッドシートのデータをインポートする(Importing Spreadsheet Data)

受け皿になるScriptableObjectをつくります.
f:id:AkiIro:20180820235416p:plain
Downloadボタンを押せば
f:id:AkiIro:20180820235703p:plain
以上です.お疲れ様でした.

【Unity】ReadMeつくるEditor拡張

ReadMeをつくる

f:id:AkiIro:20180604003939g:plain
見ての通りの選択フォルダにReadMe.txtをつくる.
それだけの拡張です.ええ,それだけです.
自分用gistですが,ご自由にお使いください.

gist.github.com

日本語がInspector上に出ない問題

UnityはBOM付きUTF-8じゃないとInspectorに表示できないので, エンコーディングを固定してやる必要があります.
このあたりの詳しい説明は以下の記事様が参考になります.
blog.nishimu.land

私はこちらのVisualStudioの拡張機能で対応しました.
ForceUTF8 (with BOM) - Visual Studio Marketplace
参考はこちらの記事様

pronama.azurewebsites.net

【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学習中) - 虎塚

標準入出力関数(1)

変換指定文字列で、期待していなかったデータを入力すると、 バッファのデータをそのまま残し、動作を終了してしまいます。

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は動いているものとします.
f:id:AkiIro:20180121022605p:plain
こんな感じですね.

こういう状況になっていない人は,こちらの記事様がわかりやすいかと思います. 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

以上になります.

参考

blog.kishikawakatsumi.com

【Unity】キャラクターをポイントクラウド化するスクリプト

Meshtopologyを変更する

実際はMeshtopologyを変更するだけです.
こんなことができます.
f:id:AkiIro:20171118232721p:plain
youtu.be

つまり可愛くはなりません.

使い方

f:id:AkiIro:20171118231351p:plain
アタッチしてスクリプトの上で右クリックして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でやれます.ご自由にお使いください.

フィルタ処理

f:id:AkiIro:20171115033633p:plain ソーベルフィルタの例
マテリアルのプロパティを変えれば色々な3x3の空間フィルタがかけられます.

ソースコード

Unity ShaderLab "Custom/UI/Filtered" uGUIのImageに空間 ...

インスペクタ

f:id:AkiIro:20171115033906p:plain Cutoutを0以外にすれば明るさが低い部分を切り捨てられます.

シェーダーだけで完結するためにマトリクスを作る部分で無駄があります.
ご了承ください.