1225

Twitter:@dn0t_ GitHub:@ogrew

子オブジェクトとしてInstantiateしたり、子オブジェクトまとめてDestroyしたり。

あるオブジェクト(親)に対してInstantiateで子オブジェクトを任意の数生成したり、あるいはそのオブジェクトの子オブジェクトをまとめて消したりしたいケースは多い。

[ContextMenu("XXXX")]コンテキストメニューに"XXXX"の名前で新たに項目が追加されて自由にメソッドを実行できます。よく使います。

子オブジェクト量産する

    void GenerateChildren()
    {
        for (int i = 0; i < _num; i++)
        {
            var parent = this.transform;
            var instance = Instantiate(_prefab, spawnPos(), Quaternion.identity, parent);
        }
    }

Instantiateの4つ目の引数にparentObj.transformを与えるとそれが親になります。 あるいはSetParent()を使った書き方もあります。どちらが一般的なのでしょうか?ぐぐったら、一応そのパフォーマンスを測った記事があったので載せておきます。

qiita.com

ちなみに余談ですが、今日定時後にまさにこんな感じのスクリプトを書いてPR作ろうとしたら動作確認で不審な動きをして「ど、どうなってるんだあああああ!」って1時間くらい悩んでいたら、なんてことはないinstance.setData 的な処理をやろうとして _prefab.setData とやってしまっていました。凡ミスですが、沼りました。助けてくれた先輩に感謝です。

子オブジェクト一括削除する

    void DestroyAllChildren()
    {
        for(int i = 0; i < transform.childCount; i++)
        {
            Destroy(transform.GetChild(i).gameObject);
        }
        transform.DetachChildren();
    }

ここではDestroyを使っていますが、実を言うとコンテキストメニューからのコマンド実行を最初から考えており、その際にedit mode(not play mode)でなんの気なしに実行したらエラーが出てしまい、読むと「edit modeでオブジェクトを削除したいんだったらDestroyImmediateを使って!」的なエラーメッセージが。

ということでそれにならってDestroyImmediateで書いてレビューお願いしたら先輩に「(今回みたいなケースならまあ使いたいのもわかるけど)非推奨だよ!」と教わったという経緯があります。

ヒエラルキー内のオブジェクトの操作をしたいときはplay modeで動作を確認する、これを肝に銘じます。

ちなみにDestroyはゲーム画面からオブジェクトを消去してくれますが実は裏では完全に削除されておらず、そのフレームの最後?あるいは次のフレームの頭?の処理で綺麗サッパリ消えるようです。(このあたりはUnity内のフローによるところなのでもう少し勉強が必要そうです。)

とはいえ、それがわかるとedit modeだと変な挙動を示す理由もわかります。

transform.DetachChildren();のところに関しては以下の記事の説明が簡潔でわかりやすいです。

cosmocleaner.hatenablog.com

f:id:taiga006:20200118010359g:plain

コンテキストメニューから操作しているので何のエビデンスにもならない動作確認GIFです。

"XXXX.app" requires a provisioning profile. に頭を抱える.

unityアプリの自動iosビルド化に頭をかかえる日々。 そういった頭痛の種の中でも先週一番大きかったのがerror: exportArchive: "XXXX.app" requires a provisioning profile.

...つまり「お前が指定したplistにはProvisioning Profileに関する項目がないぞ!」というやつ。

このエラーはすでにほとんどの開発ケースではぶつからないはず。

というのも今は認証周りはAutomatic manage signingさせておけば大抵のケースでうまくいく。 (今回は古いビルドマシンを使って作業をして、SigningをAutoではなくManualで設定する羽目になった。)

Provisioning Profileに関してはUnityで書いたビルドスクリプトでIDを正しく指定しているし、なんならそこから吐き出されたxcodeファイルを開いてSigningの項目を見てもちゃんとできているんだけれどいざコマンドラインから実行しようとすると上のようなエラーが出てしまう、、、しょぼーん。

どうしたものかと頭を抱えていると、とても参考になるQiitaの記事を発見。

UnityのiOSビルドを自動化させたい人はひとまずこれを見るのが2020年1月時点では一番良さそう。

そこでProvisioning ProfileのUUIDというのがあってそれをアーカイブ化、ipa化させるときにそれぞれコマンドラインから指定できることがわかった。

さて、本題はその調べ方。基本的には.mobileprovision形式のファイルは中身を見ることができない。 Xcodeから調べる方法もあるみたいだけど、もっと簡単な方法がある。


① 作ったProvisioning Profileをダウンロード
② mobileprovisionファイルに対して以下のコマンドを叩く

security cms -D -i sampleapp.mobileprovision | grep UUID -A 1

③ xcodebuildのオプションにPROVISIONING_PROFILE=XXX-XXXX-XXXX-XXXXXXXのような形式で追加


これでうまく行ってそんな馬鹿なってなった。 -exportProvisioningProfileってオプションはもう使えないよ、って情報を早々に見つけてしまったのが敗因。

それからmacのsecurityコマンドってのがよくわからん。このへんが公式のドキュメント?

UnlitShaderを読んで完全に理解した.

ちなみに

あらためて Carbon めっちゃ便利だな、と思った。ここまで長くても特に問題ない。

参考

booth.pm

amagamina.jp

UnityでHLSL入門(おもちゃラボさんの記事を読んで。)

はじめに

読んでね。 nn-hokuson.hatenablog.com

できたやつ

f:id:taiga006:20200111165852g:plain

学んだことメモ

f:id:taiga006:20200111170142p:plain

上のナンバリングに沿ってシェーダを記載。

         fixed4 frag(v2f i) : SV_Target
            {
                fixed4 black = fixed4(.1, .1, .1, 1.);
                fixed4 red  = fixed4(.9, .2, .1, 1.);
                float x = step(.2, i.uv.x) * step(.2, 1. - i.uv.x);
                float y = step(.2, i.uv.y) * step(.3, 1. - i.uv.y);
                return lerp(black, red, x * y);
            }

ボックス。
よく使うstep関数。i = step(a, x)i = (x > a) ? 1.0 : 0.0 になる。
lerp関数はglslでいうmix関数。つまり、 i = lerp(a, b, x) => i = mix(a, b, x) => x(0.0 ~ 1.0)を(a,b)間で線形補間 => i = a + x * (b - a) となる。

            fixed4 frag (v2f i) : SV_Target
            {
                fixed r1 = .11;
                fixed r2 = .13;
                fixed r3 = .08;
                fixed2 c1 = fixed2(.5, lerp(.5, .1, _SinTime.x ));
                fixed2 c2 = fixed2(.2, lerp(.7, .2, _SinTime.y ));
                fixed2 c3 = fixed2(.7, lerp(.4, .2, _SinTime.z ));
                fixed d1 = distance(i.uv, c1);
                fixed d2 = distance(i.uv, c2);
                fixed d3 = distance(i.uv, c3);

                return smoothstep(r1, r1 * 1.1, d1) 
                     * smoothstep(r2, r2 * 1.1, d2) 
                     * smoothstep(r3, r3 * 1.1, d3);
            }

長々しく書いていますが、やっていることは動く円3つを書いているだけです。ポイント、というか「へぇ~」となったのは_SinTime というか _Time 含めた時間に関するHLSLのビルドイン変数についてです。これらは float4 の型を持っています。最初これがわからずエラーを出していました。以下の表は公式のマニュアルによるもの。

名前 タイプ
_Time float4 ステージのロードからの時間 (t/20, t, t2, t3)。
_SinTime float4 時間の正弦: (t/8, t/4, t/2, t)
_CosTime float4 時間の余弦: (t/8, t/4, t/2, t)
unity _DeltaTime float4 デルタ時間: (dt, 1/dt, smoothDt, 1/smoothDt)

_Time.x_CosTime.y みたいな形で使う模様。ほへ~。覚えておく。

            fixed4 frag (v2f i) : SV_Target
            {
                fixed len = distance(i.uv, fixed2(.5, .5)) + _Time;
                fixed4 red = fixed4(.9, .2, .1, 1.);
                return red * (1.0 - smoothstep(.5, .9, sin(len *40)));
            }

②にも出てきたdistance関数とsmoothstep関数。distanceは名前そのまま。2点の距離を返す。distance(P.xy, Q.xy)。smoothstepもGLSLで頻繁に使う。smoothstep(min, max, a) min ~ max間でaの値をエルミート補間する。エルミート補間? という人は下の図で理解できるかと。

f:id:taiga006:20200111174335p:plain

            fixed4 frag (v2f i) : SV_Target
            {
                return step(abs(.4 * cos(_Time.y)), sin(50*i.uv.x));
            }

特にコメントなし。

            fixed4 frag (v2f i) : SV_Target
            {
                fixed2 st = i.uv * 4;
                st = frac(st);
                fixed d = distance(st, fixed2(.5,.5));
                return smoothstep(.4, .42, d);
            }

最初の2行が肝だと思う。1:1スケールをN倍してfrac(小数だけ見る)させることで0.0 ~ 1.0をN回繰り返すスケールを得る。こうすることでN*Nマスで表現の繰り返しを描ける。便利。

            fixed4 frag (v2f i) : SV_Target
            {
                fixed2 v = step(0, sin(25 * i.uv)) / 2;
                fixed4 f = frac(v.x + v.y) * 2;
                fixed r = lerp(.1, .2, _SinTime.z);

                fixed4 black = fixed4(.9, .9, .9, 1.);
                fixed4 red  = fixed4(.9, .2, .1, 1.);
                fixed4 c1 = smoothstep(r,r * 1.05, distance(i.uv, fixed2(.315,.31)));
                fixed4 c2 = smoothstep(r,r * 1.05, distance(i.uv, fixed2(.695,.69)));
                return f * lerp(black, red, (c1 * c2));
            } 

これはおもちゃラボさんの解説がわかりやすかった。縦横のストライプを 0.0 or 0.5 で表現してそれぞれ加算してfracさせれば市松模様になるというもの。

            fixed4 frag (v2f i) : SV_Target
            {
                return smoothstep(.1,.4, 1. - i.uv.y) * smoothstep(.1,.4, 1. - i.uv.x);
            }

これも説明不要かと。smoothstepのsmoothさがよくわかりますね。

                fixed2 st = i.uv * 3;
                st = frac(st);
                fixed4 black = fixed4(.1, .1, .1, 1.);
                fixed4 red  = fixed4(.9, .2, .1, 1.);
                fixed side = lerp(.3, .6, _SinTime.w);
                float x = step(side, st.x) * step(.3, 1. - st.x);
                float y = step(side, st.y) * step(.4, 1. - st.y);
                return lerp(red, black, x * y);

そうです、①×⑤の作品です。


ということであらためておもちゃラボさんの入門記事がよかったです。皆さんも是非。

参考

knowledge.autodesk.com

Unity公式チュートリアルをすすめる。

ちょうど1年前にこの講座でUnityにちゃんと入門した。

Udemy - ユニティちゃんが教える!初心者向けUnity講座

そのときはまさかこんな形でUnityエンジニアにジョブチェンジするとは思っていなかった。

ただこの講座で学んだことはすっかりどこにもメモが残されておらず、結局学んだこともほとんど記憶から消えてしまった。

もったいない。

当時のツイートが出てきた。そうだ、たしかに年越しをこれしながら過ごした記憶がある。

それにしてもSNSに動画を上げている余裕があるならやったことのメモくらいブログなりに残しておいてほしいものだ。

単純なゲームだったがエッセンスがつまっていた(ように思う)のでとりあえずなにか始めたい人におすすめしたい。

さて、次の仕事まで暇な時間ができたので今回のUnity入門は公式のチュートリアルを始めることにした。

この中から探した。

どれがいいとかわからにので一番購読されていそうな「Create with Code」を始めた。 40時間近いコースとなっているが、コードがある程度書ける人ならその半分ちょいで一周できると思われる。 f:id:taiga006:20191215222703p:plain

…と言ってもまだ完走していないのだが…。

まあ、気長に続けていこう。


2020.01.09 終わらせた。 f:id:taiga006:20200110001819g:plain


やったらメモ残す。

①障害物のある道路を車を操作して進むだけのゲーム
- public変数はInspector上から操作できる
- Vector3.forward -> (0,0,1) みたいな便利なのか何なのかわからないメソッドがある
- ゲームなどのインプット機構はプロジェクトごとに変更できる
- Edit -> Project Settings Input他、プロジェクトに関する設定を変更できる
- Scene Viewの視点操作が癖がある、といってもBlenderやTDから入ったからそう感じるだけだと思う
-Input.GetAxis("Horizontal")などでそのプロジェクトで設定されたHorizontalのキーの値を-1~+1の間で取得できる

f:id:taiga006:20191208171201p:plain

②動物版インベーダー
- オブジェクトの消失はDestroy(gameObject)で簡単にできる
- Random.Range(int min, int max) はmin≦x<maxとなる
- PrefabsはHierarchy上のオブジェクトをProjectにD&Dで作成できる(インスタンスからクラスのデータを吐き出す、みたいなイメージかな?)
- カメラの投影方法はCamera->ProjectionからOrthographic(正投影) or Perspective(遠近投影)が選べる
- InvokeRepeatingは指定秒数後に発火させる(そして繰り返す)ことができる(=コルーチンに近い仕組み?)
- オブジェクトの設定を更新したときPrefabにあるものに関してはOverridesで適用するか破棄するか選ぶことができる(クラスの情報を更新する感じ)
- GetKey => 連続的なキー選択、GetKeyDown => 瞬間的なキー選択 を検知できる

f:id:taiga006:20191209230113p:plain

③横スクロールジャンプゲーム(サウンド&エフェクト付き)
- GetComponent<name> で名前空間or型がnameのコンポーネントを取得
- unity内の物理についてはUnityEngine.Physicsで操作可能
- RigidBody(=物理演算を受けるコンポーネント)のConstraintsで位置や向きを任意に固定できる
- Collider(=衝突判定に使うコンポーネント)この2つはBlenderでおなじみ
- objectにtag付けできる
- tagの比較はgameObject.CompareTagで可能
- scriptもコンポーネントなので他スクリプトから呼び出すことができる
- ただしその中でpublic変数のみが呼び出せることに注意
- Animatorを使うとノードベースの条件分岐でアニメーションを切り替えられる
- ノードの矢印を押すとその状態遷移の条件がわかるのでそれをスクリプト上で操作すれば良い(SetTrigger(), SetBool(), SetInt() etc...)
- エフェクトを管理する一つのクラスにParticleSystemがある(コンポーネントではないっぽい。)
- ゲームのBGMはカメラに当てる。(Audio Sourceコンポーネント)
- scriptから音楽をいじる場合はAudioClipで音源自体を管理、AudioSourceで再生を管理

f:id:taiga006:20191215215010p:plain

④
- child object 親の状態に左右される(今回ではカメラの回転)
- local座標でのtransformとglobal座標でのそれをうまく使い分ける
- Physical MaterialはGameObject同士の衝突時の跳ね返り等について管理するコンポーネント、コライダのMaterialとして設定する
- OnTriggerEnter -> 接触&通過を検知(ColliderのIsTriggerをONにしておけばOK)
- OnCollisionEnter -> 接触&衝突を検知(衝突物、対象物ともにColliderとRigidbodyを持つ.)
- 動くもの同士の衝突判定=> Collision系
- どちらかが動かない衝突判定=> Trigger系
- StartCoroutine(Method()) -> IEnumerator() { yeild return WaitForSeconds(N); ....}; でN秒後に次の処理を発火させることができる(コルーチン)
- FindObjectsOfType<XXX> でXXX型の(アクティブな)オブジェクトをすべて取得できる.指定しなければすべてのオブジェクトを取得する.

f:id:taiga006:20200108233344p:plain

⑤
- 関数の宣言時に何も書かなければすべてprivateになる
- Array(List)クラスとList<T>クラスは似たような使い方ができるが、前者の要素は型に縛られないのに対して後者は<T>の型しか取らない。よって前者は取り出すときにチェック、キャストをしなければならない。(Listのほうが使い勝手が良い。)
- GameManager Scriptとかはよく使うので勝手にアイコンがGearのものになる。他にもあるのかな。特に便利には感じない。
- SceneManagerのライブラリを使うことでシーンの再読み込みなどが可能。
- Empty Objectのchildに複数のObjectをグルーピングさせてSetActiveさせると楽。

f:id:taiga006:20200108232951p:plain

Declarative Pipelineでビルドパイプラインをコード管理する.

Jenkinsで複数のジョブ実行をパイプライン化させる際に、メンテナンス性を考えてPipeline as Codeさせることにしました。 (Pipeline as Codeって普通に書きましたが、ググるとJenkinsの話しか出てきません。)

JenkinsでPipeline as Codeさせるのには専用のDSLが存在し、それを使ってJenkinsfileを書くことができます。ただし気をつけなければいけないのはこれには2つの記法が存在していて、一つは初期のScripted Pipelineというもので、こちらは現在は使用が推奨されていません(とはいえケースバイケースのようですが)。

ただ、インターネットに転がっている適当なスクリプトを「自分のところでもだいたい用法同じだから!」ってコピペして使おうとすると結構な割合でこちらの古い構文のものにぶちあたるので注意が必要です。(私はそうなりました。)

ということで今回は新しいほう(といっても3年ほど前に出た)のDeclarative Pipelineで単純なサンプルを書きました。

pipeline {
    agent any // どのノードで実行するか決める
    environment { // 環境変数をセットする
        workspace = "/path/to/jenkins/workspace"
        export_dir = "/path/to/jenkins/export"
    }
    stages {
        stage('build') {
            steps {
                echo 'Start Build'
                build job: 'build'
                echo 'Finish Build'
            }
        }
        stage('backup') {
            steps {
                echo 'Start Backup'
                build job: 'backup'
                echo 'Finish Backup'
            }
        }
        stage('test') { // test1 とtest2 は並列で実行される
            parallel { // stageの下で宣言
                stage('test1') {
                    sh './do_test1.sh'
                    sleep 5
                }
                stage('test2') {
                    sh './do_test2.sh'
                    sleep 5
                }
            }
        }
        stage('deploy') {
            steps {
                 echo 'Start Deploy'
                build job: 'deploy'
                 echo 'Finish Deploy'
            }
        }
    }
    post {
        always {
            echo '<--------all process has done.-------->'
            deleteDir() // 事後はワークスペースをきれいにする
        }
        success {
            echo 'SUCCESS :)'
            slackSend   channel: '#notifiy',
                        color: 'good',
                        message: "ビルドが完了したよ :smiley:"
        }
        unstable {
            echo 'UNSTABLE :\'
            slackSend   channel: '#notifiy',
                        color: 'warning',
                        message: "ビルドが終わらなかったよ :thinking_face:"
        }
        failure {
            echo 'FAILED :('
            slackSend   channel: '#notifiy',
                        color: 'danger',
                        message: "ビルドが失敗したよ :zany_face:"
        }
    }
}

f:id:taiga006:20200108191048p:plain こんな感じでどのタスクにどれくらい時間がかかっているかなどを可視化できます。 f:id:taiga006:20200108191212p:plain Slackにもちゃんとメッセージが送られています。

※とはいえ、上のはあくまでサンプルです。ビルドどうこう言ってるのに'Finish Deploy'とか書いてます。変にコピペしないでね。

仮にJenkinsをわかっていなくてもおおよそこのスクリプトによってどのような手順で処理が進むのかわかると思います。 ちなみにslackSendコマンドはSlack NotificationというPluginを入れて設定すれば使用できます。bot_userを使うようにすればカスタマイズ性も高まります。(もちろん、他に設定でメールなども送れます。)

上でScripted PipelineのサンプルとDeclarative Pipelineのサンプルを勘違いするなよー、って書きましたが、見分け方は簡単でblockのトップがnode or pipeline かで見分けられます。(さらにpararell対応する前か後かみたいなのもあるようですが…)

参考

jenkins.io

www.blazemeter.com

cocodrips.hateblo.jp

b-side.work

UnityEditor.MenuItemで自分だけのメニューを追加する

Unityのエディタ拡張の方法の一つとして自作のメニューバーを作るときに使えるAttributeがあります。それがMenuItemってやつです。

一番単純な例として、Asset/Editor/CustomMenu.csというスクリプトを以下のように書きます。

using UnityEngine;
using UnityEditor;

public class CustomMenu
{
    [MenuItem("CustomMenu/CallCat")]
    private static void CallCat()
    {
        Debug.Log("cat");
    }
}

using UnityEditor;をしています。保存した後、スクリプトを右クリックしてメニューから「Refresh」を選択。コンパイルエラーなどが起きていなければ、おそらくメニューバーに「CustomMenu」という新しいタブができているはずです。実行すると…

f:id:taiga006:20200106185708p:plain

さらにこのように追加した機能にはホットキーを割り当てることもできます。 (この関数は空のテキストファイルを生成します。)

using UnityEngine;
using UnityEditor;
using System;
using System.IO;

public class CustomMenu
{

    [MenuItem("CustomMenu/MakeText &t")]
    private static void MakeText()
    {
        string path = "./Assets/test.txt";
        if (!File.Exists(path))
        {
            File.CreateText("./Assets/test.txt");
        }
        else
        {
            Debug.Log("test.txt is already exists.");
        }
    }
}

f:id:taiga006:20200106185935p:plain

基本的なキーはどれでも使えそうです。ただし特殊記号を使わないホットキーを設定する場合は注意が必要です。

To create a hotkey you can use the following special characters: % (ctrl on Windows, cmd on macOS), # (shift), & (alt). If no special modifier key combinations are required the key can be given after an underscore. For example to create a menu with hotkey shift-alt-g use "MyMenu/Do Something #&g". To create a menu with hotkey g and no key modifiers pressed use "MyMenu/Do Something _g".

スクリプトリファレンス - MenuItem (class in UnityEditor)

しかし、テキストなどに限らずファイルを新たに生成したい場合はメニューバーよりもプロジェクトビューのCreateなどからできたほうが便利そうです…はい、できます!

using UnityEngine;
using UnityEditor;
using System;
using System.Collections;
using System.IO;

public class CustomMenu
{
    [MenuItem("Assets/Create/Dragon")]
    private static void CreateDragon()
    {
        Debug.Log("Created Dragon!!");
    }
}

f:id:taiga006:20200106190139p:plain

ここではやりませんが、HierarchyビューのCreateからであったり、コンポーネントコンテキストメニューに対しても任意のメニューを追加することができます。

アレンジ度高い!

参考

docs.unity3d.com

kan-kikuchi.hatenablog.com

ことだま。

正月に買ったJINSの調光レンズが結構いい。(JINSはこれをカラーコントロールレンズと呼んでいる。このあたりはオリジナリティを出さずに業界で統一してほしいなぁ。) もともと会社の同期が使っていたのを見たのがきっかけだった。ただ、サングラスに多い丸っこいメガネがてんで似合わない顔だちのため、いつものように長細いフレームのものを選択したら、さらに人相に胡散臭さが増してしまった気がする。それから今回は改めて視力検査をお願いした。というのも前のメガネは研究室時代から使っていたもので、PC作業がメインの今では度数が強すぎたのだ。ということで社会人3年目になってやっと度数を下げることとなった。

連休の最終日は21_21 DESIGN SIGHTのマル秘展に行った。特にどういったイベントかここでは説明しないけれど、一人で2時間たっぷり楽しむことができた。正月休みのはずなのに会場は沢山の人でごった返していた。展示の仕方がとても良かった。タイポグラファーやプロダクトデザイナー、建築家、様々なジャンルで「デザイン」に携わる人たちの原画であったりプロトタイプであったりが「一人1レーン」を成して配置されている。

個人としての1番の収穫は山中俊治がデザインを手掛けるオフィスチェアAveinに座れたこと。 椅子はアーロンチェアくらいしかいいものを実際に座ったことはないのだけれど、これは機動性、デザイン性どれも好みだった。(ただ定価20万というところに目を瞑れば…。) それから去年、この記事でも書いた原研哉の顔を初めて映像で拝見できたこと。 永井一正のデザインしたポスターのかっこよさを知れたこと。

どうやらイベント開催期間中に参加したデザイナーとのインタビュー録がpodcastで配信されているらしい。聴く。

…と、そんなことを考えていたらイヤホン壊れた。

12のツイートでふりかえる2019

2019年1月

TDSWやVJ概論に参加していろんなクリエイターの作品やシステムに触れて「自分でもシステムを1から組んでみたいな!」と思い制作に取り組み始めた。 ちなみに年始はUnityに入門していたっぽいSonyデジタル一眼レフカメラを買ったのも正月だった。

2019年2月

openCV×TouchDesignerで遊んだりしていた。 (上のデモはだいぶ精度が低い。)ついでにこのときInstagramAPIの厳しさを知った。 この月はPCD TokyoにいってなめさんのWSを受けたりもしていた。(一年後自分がスタッフになっているなんて…このときはまだ知る由もない。)

pcd-tokyo.github.io

2019年3月

会社でTouchDesignerなどを中心にデジタルアートを勉強するもくもく会を開くようになった。 結局4月の突然の秋葉原異動のせいで数回しか開催できなかったのが悔やまれる。 一人で最果タヒの個展に行った。 UR LIFESTYLE COLLEGEにハマった。 あとはひたすら社食で酒を飲んでいたようだ。

2019年4月

今のブームが来るちょっと前くらいからORCAに入門していた。職場が秋葉原になってそれまで書いていたPerlからGolangに使用する言語が変わったのでその勉強を頑張った。 この月はVJデビューしたり、初めてアーティストさんのMVを作らせていただいたりで忙しかったが、今となっては彼女とディズニーに行った楽しい思い出しかない。

2019年5月

4月に作ったMVを公開したのが5月。4月までの活動を顧みてもっとCGをやってみたいとなってBlenderをやりはじめたのも5月だった。この頃は週2,3のペースで作っては出して作っては出して…を繰り返していた。彼女とゲムマに行って散財したり、会社の友達と代々木公園でピクニックしたりした。それから2019年は久しぶりにIF I AMの24hの放送があったのでその実況とかしていた。あとこの月はひたすら漫画を爆買いしていた。後悔はない。

2019年6月

6月はとても精力的に活動していたようだ。牛タン巡りもその一つ。 それから初めてotocara名義でSOURCE CORD vol.3 でVJさせていただいたのもいい思い出。 極寒SESSIONを初めて見に行ったのも6月。 そのあとMBPの長い長いローンを終えたのでMSI GS65を買った。高校生依頼のWin機にいろいろ戸惑った。 あとはカヤックのコーポレートサイトで「みんなの理念解釈」に作文を投稿したのも6月。こちらはたくさん反響をいただきました。ありがとうございます。

2019年7月

夏は帰省する予定はなかったのだけどこれがあって急いで群馬に帰った。今年の年始も元気におせちを食べていたのでひとまず安心である。 チャネル#20を見に行って感動したり、築地で早朝からタピオカ飲まされたりのが7月。 会社の漫画好きの後輩の子にヤマシタトモコの本を借りて夜通し読んだりした。個人としては「ミラーボールフラッシングマジック」が一番好きだった。あとは彼女が体調を崩したのでお見舞いに行って追い返されたりもしている。

f:id:taiga006:20200104120550j:plain

あとはこれを一生懸命作っていた。

2019年8月

Podcastを始めた。無職で暇だった@haseと、そろそろ仕事がビミョーで新しいことに挑戦したい気持ちが高まっていた自分とで始めた。その後のSpotifyの動きなどを見ていても音声メディアは今後さらに伸びていくことは明白なので割と良いタイミングで始めたと思う。あとは会社のオフィスで流しそうめんをしたり、ゆるーく転職活動を始めたり、隣の人が夜逃げするのに出くわしたり、builderscon tokyoに参加したり、彼女と水元さきのさんの個展に行ったり、夏っぽいことをしたようなしてないような月日を過ごしていた。

2019年9月

みちのっくで上毛かるたを巡る旅をした。長く群馬にいてやったことないことをやれた(行けた)ので楽しかった。あとは深夜徘徊をひたすらしていた。「9月は深夜徘徊日和が多い。」覚えておきましょう。大枚をはたいてGLSLスクールに通い始めたのも9月から。それからJoeくんに依頼されてTDのWSの準備を粛々と始めた。TOUCHOUTを見に行った。

2019年10月

ということでTDSW主催のXスクエアでWSの講師を勤めさせていただいた。思えば自分がTouchDesignerを始めて最初に外に出て勉強するようになったきっかけがTDSWだったので非常に感慨深い気持ちである。それと講師をやる難しさ、楽しさをこのイベントを通して学ぶことができた。2020年以降も是非やっていきたいと思う。この頃は「まだ結婚できない男」が楽しみで1週間を生きていた。結婚式の友人代表スピーチを初めてやったのも10月だった。新婚初夜に夫婦を朝までボードゲームに付き合わせた罪は重い。色々落ち着いたのでGLSLスクールの復習をしつつ、Houdiniの勉強を再開した。

2019年11月

@shujihiraiさんのご紹介で短い幕間映像ではあったが、ライブの演出に携わらせていただいた。とても貴重な経験だったなー。それが終わってからはNodevemberに参加してBlenderもりもり作品を作っていた。そんなこんなで会社で色々あって気がついたら面白法人を辞めた

2019年12月

12月は怒涛だった。まず前半は前社の有給消化でのんびりする予定が、VJAMに出るための準備でどたどたしていた。あと謎解きに挑戦して彼女の頭の回転のよさに舌を巻いたりしていた。準備をしっかりできたので今までで一番納得の行く、そして学びの多かったVJがVJAMでできた。そしてその翌日には彼女とメディアージの忘年会のため仙台へ。非常に楽しい夜だった。その代わり今年のTouchDesignerのアドカレ担当記事は去年に比べてちょっと手抜き記事だったかな、という反省。PCD Tokyoのスタッフになったのも12月。全然力になれている気はしないが2月の本番に向けてできることはやっていきたい。チャネル#21を見に行った。@Phasma×@_irishoakのプレイが印象的。それからチケットが即完だったblendxjp4のために渋谷へ。ぽぷりかさんの発表に非常に感銘を受けた。できることとやりたいことと制約を並べて最適なルートを選択する。行き当たりばっかりが目につく自分はそういうことが全然できていないぁという思い。


(おまけ)2020年やりたいこと

  • 引っ越しの目処を立てる
  • (引っ越すために)お金を貯める
  • VJもしくは映像制作(公の場で発表する)を2019年より多くする
  • シェーダーに関する作品、もしくは技術記事を月に1つは最低書く
  • Unityをメインツールにして1回以上VJをする
  • 大学入学当初くらいまで体重を戻す
  • Podcastを続ける
  • XR作品を作る
  • ツイート数を減らす
  • 彼女といっぱい遊ぶ
  • 本業以外の収入源を得る
  • デザインを学ぶ

まあ、こういうのはたいてい移り変わっていってしまうのでひとまず思いつくことを。

それでは今年もよろしくおねがいします。

JenkinsでビルドできたらGoogleDriveに自動でアップロード

φ(・・ < これはメモです。

Jenkinsでビルドさせたapk, ipaファイルなどをGoogle Driveに自動でアップロードさせたい。 調べたところ、たぶん方法は3つある。

①GoogleDriveのクライアントアプリで常に同期させるようにしておく方法

メリット:ビルドのアウトプット先をその同期させるディレクトリにしておけばいい。楽。
デメリット:同期、なのでビルドするマシンでなにかトラブルがあったら過去のapkも消える?(復元できるだろうけど)
qiita.com

②"gdrive"というCLIツールでアップロードする方法

メリット:アップロード、ダウンロードをする、ので①より安全?シェル書くのも多分楽。
デメリット:サードパーティツールとしてGoogle連携することになる(あとgdriveメンテあんまされてない)
qiita.com

③ビルドスクリプト内でアップロードまでさせる方法(Google Drive SDK for Unityを使う)

メリット:Jenkinsもう頑張らなくていい、お前は十分だ
デメリット:使うSDKが増える

qiita.com