非日常デコレーション

一般 web developer の雑記です

勉強会と就活進捗状況

勉強会含めた就活イベント参加履歴

1/23 アカリクIT逆求人イベント
1/26 サイバーエージェント GAME TALK NIGHT
1/27 ?社企業訪問
1/28 ?社企業訪問
1/29 DeNA Tech Talk
2/_? 1Dayインターン
2/10 Donuts GO言語勉強会

1月3週目は冬のインターンの面接を3社ほど受けたりと、今年に入ってから大分就活が進んできたと思います。(長期インターンの2社は落ちてしまいましたが…)
ゲーム以外の勉強会にも参加したりして、とにかく役に立ちそうな技術に手広く触れてみたりしていますが、結局受ける企業はソーシャルゲームを作っている企業が中心になっていきそうです。
もちろんゲームに限らずにVRやAR/MRに技術的な面で取り組んでいる企業は多くあるのでそちらも数社受けてみるつもりです。最終的にどうするかは就活の進み具合によって変わってくると思います。
ちなみに今選考に進んでいる企業はゲームもVR/MRも全く(ほぼ)関係のない企業です。笑

次の記事では勉強会についてまとめたいと思います。

マザーボードって何?マザー3ならやったことあるよ

※今回はデスクトップPCをパーツから製作することに初挑戦したお話です。

製作動機

自宅にWindows環境がなかったので欲しかったのです。
正確には大学4年まで使用していた安物のノートがあったのですが、さすがに6年使ったものだったので。

総制作費用

なんとディスプレイ込みで69800円ほど。
OSはWindows7Premiumで、こちらは親父が購入してくれました。(17kほどします)

躓いたところ

・ピンヘッダの配線および光学ドライブやHDDの配線…電源→機器→マザボの接続が確立できてなかったのが原因
・USBのマウスやキーボードがOSインストール時に反応しなかった問題…PS/2のキーボードでやったりしましたが、結局BIOSのユーティリティ画面出してからOS起動させればよかったみたいですね。あとUSB2.0の方に接続するとかでも良かったっぽいです。(前面のUSBポートしか見えていなかった)
・ネットワーク設定…マザボのCDROMでドライバインストールするの忘れてた
・ドライバインストール時の再起動ごとに起動に失敗する…BIOSのboot priorityで光学ドライブが先頭に来ていたためHDDを先頭に設定しなおした

Windowsで何がしたかったのか

DirectXを使用したゲームの開発
・PC TV with nasneがMacをサポートしていなかった
・テレビの画面キャプチャして実況してみたかった
・自宅で研究できる環境が欲しかった…結局RDでやるんですが、Macbookだと画面が小さすぎるので ・あといろいろあったような

自作PC初挑戦でいろいろ苦労しましたが、これからどんどんプログラミングできるモチベーションも湧いたので
いい買い物だったと思います。いい経験にもなりました。

結局はどんなゲーム作ったの?

Unity週末BootCampに参加してきました

colopl.co.jp

参加動機

Unityでちゃんと終始一貫したゲームを作成する。

という意識をもって申し込みました。

学内の制作展でUnityを使ったゲーム(と言えるのか怪しい)作品を制作した経験はあるのですが、 ゲームらしいゲームを制作したことがなかったので今回からちゃんと課題意識を持って取り組もうとしたわけです。

正直言ってコロプラのゲームはほとんど遊んだことがなく、参加表明してから1,2つカジュアルなゲームを遊んだだけでした。 コロプラで有名なゲームといえばCMでよくやっている白猫・黒猫やバトガですね。

ちなみに自分が今までやってきたソシャゲは、
-GF(仮)
-パズドラ
-スクフェス
-グラブル -デレステ

ということであまりやってないです…。

ゲームは主に音ゲーをガチでやってるので、他のゲームにあまり手をつけていないです。
このスタイルは学部入学当時から変わっていません。
3Dゲームにあまり触れていない中、コロプラは3Dゲーム中心なので正直不安しかありませんでした。

結果

午前2時間で個人制作
午後4時間でチーム2人で共同制作
テーマは「擬音」
という課題

個人制作ではもじぴったんのようなパズルゲーム(これは結局未完成)、
チームでは"Repulsion"という「斥力」がコンセプトのゲームを作りました
斥力というアイデアは相方から出ました。
お互いほぼ初心者という状況の中、見た目はともかく1つの完結したゲームが短い時間でチームで制作できたことに感動を覚えました。
もっとすらすらコードを書けるようになりたいと思う一方、
こういう短期決戦では"発想"がものをいうことを痛感し、もっと思考を豊かにするために様々な作品(マンガ、映画などなんでも)に触れていこうと決意を新たにしました。 また、社員さんからのお話から、研究内容を仕事に活かそうとするなら、ゲーム以外にももっといろんな選択肢があるということを再認識し、これからの就活をもっとよく考え直してみようと思い直しました。そういう考え方の変革もあって、懇親会も大変有意義な時間となりました。

こうした、意識を改め直す機会がもらえるので、イベントにはどんどん参加していて正解だったと思います。
来週からのインターンも頑張りたいと思います。

Unityでチュートリアルシーン

仕上がりはこんなかんじ

f:id:mokotixfemilar:20151215162745g:plain

gif化がうまくいかずに4倍速になってます。 よく見たら竜巻⇨雷のシーンがバグってますね…。 余裕がないので修正しません。

動機

元々LeapMotionとUnityを組み合わせたゲームを開発しようとしていて、そのときにチュートリアルシーンを作りたくて結構迷ってしまったので記録のために書いてみました。 とても簡単なので他のゲームを作るときにも流用できると思います。汎用性はあまりないテキトーなコードですみません。というか個人的な備忘録です。

イベントの認識は元々はLeapMotionでやってたのでテキストはそのままですが、このコードではSpaceキーが押された時を認識してイベントを進めることにします。

//TutorialEvent.cs

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class TutorialEvent : MonoBehaviour
{
   //宣言したゲームオブジェクトにPrefabをInspectorで設定しておく
    public GameObject fire;
    public GameObject bomb;
    public GameObject thunder;
    public GameObject tornade;
  //イベントが進むフラグ管理
    public int EventFlag = 0;
    public bool ai;

    void Update ()
    {

        //円を描いてみよう
        if (EventFlag == 0) {
            if (Input.GetKeyDown ("space")) {
                Instantiate (fire);
                EventFlag = 1;
            }
        }
            
        //スワイプしよう
        if (EventFlag == 2) {
            if (Input.GetKeyDown ("space")) {
                Instantiate (bomb);
                EventFlag = 3;
            }
        }

        //オーケーサインを作ろう
        if (EventFlag == 4) {
            if (Input.GetKeyDown ("space")) {
                Instantiate (tornade);
                EventFlag = 5;
            }
        }

        //両手で輪っかを作ろう
        if (EventFlag == 6) {
            if (Input.GetKeyDown ("space")) {
                Instantiate (thunder);
                EventFlag = 7;
            }
        }

        if (EventFlag == 1 && ai == false) { 
            StartCoroutine (Wait ());
            ai = true;
        }

        if (EventFlag == 3 && ai == false) {
            StartCoroutine (Wait2 ());
            ai = true;
        }
        if (EventFlag == 5 && ai == false) {
            StartCoroutine (Wait3 ());
            ai = true;
        }
        if (EventFlag == 7 && ai == false) {
            StartCoroutine (Wait4 ());
            ai = true;
        }

    }
 //イベント発生までの間隔を管理するコルーチン
 //今回は3秒に設定してます
 //3秒経つと、effectタグをつけたPrefabが破壊されてイベントが進みます
    IEnumerator Wait ()
    {
        yield return new WaitForSeconds (3.0f);
        var effectobj = GameObject.FindGameObjectsWithTag ("effect");
        foreach (GameObject objs in effectobj)
            Destroy (objs);
        ai = false;
        EventFlag = 2;
    }

    IEnumerator Wait2 ()
    {
        yield return new WaitForSeconds (3.0f);
        var effectobj = GameObject.FindGameObjectsWithTag ("effect");
        foreach (GameObject objs in effectobj)
            Destroy (objs);
        ai = false;
        EventFlag = 4;
    }

    IEnumerator Wait3 ()
    {
        yield return new WaitForSeconds (3.0f);
        var effectobj = GameObject.FindGameObjectsWithTag ("effect");
        foreach (GameObject objs in effectobj)
            Destroy (objs);
        ai = false;
        EventFlag = 6;
    }

    IEnumerator Wait4 ()
    {
        yield return new WaitForSeconds (5.0f);
        var effectobj = GameObject.FindGameObjectsWithTag ("effect");
        foreach (GameObject objs in effectobj)
            Destroy (objs);
        ai = false;
    }
}

今度はシーンのUITextを動的に生成するコード。

//TutorialText.cs

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class TutorialText : MonoBehaviour {

    public TutorialEvent tutorial;

    void Start () {
            StartCoroutine("Process");
    }

    IEnumerator  Process(){
        yield return StartCoroutine(TheFirst());
        yield return StartCoroutine(TheSecond());
        yield return StartCoroutine(TheThird());
        yield return StartCoroutine(TheFourth());
        yield return StartCoroutine(TheEnd());
        yield return StartCoroutine(GoToMain());
    }

    IEnumerator TheFirst(){
    
        while (!(tutorial.GetComponent<TutorialEvent>().EventFlag==1)){

            this.GetComponent<Text>().text = "まずは円を描いてみましょう";
            yield return null;
        }

        yield return new WaitForSeconds(3.0f);
    }

    IEnumerator TheSecond(){
        
        while (!(tutorial.GetComponent<TutorialEvent>().EventFlag==3)){
            
            this.GetComponent<Text>().text = "次に手を横にスワイプさせてみましょう";
            yield return null;
        }
        
        yield return new WaitForSeconds(3.0f);
    }

    IEnumerator TheThird(){
        
        while (!(tutorial.GetComponent<TutorialEvent>().EventFlag==5)){
            
            this.GetComponent<Text>().text = "次に右指でOKサインを作りましょう";
            yield return null;
        }
        
        yield return new WaitForSeconds(3.0f);
    }

    IEnumerator TheFourth(){
        
        while (!(tutorial.GetComponent<TutorialEvent>().EventFlag==7)){
            
            this.GetComponent<Text>().text = "最後に両手の親指と人差し指で\n大きな輪っかを作ってみましょう";
            yield return null;
        }
        
        yield return new WaitForSeconds(3.0f);
    }
    
    IEnumerator TheEnd(){

        this.GetComponent<Text>().text = "チュートリアルは以上になります";
        yield return new WaitForSeconds(5.0f);

        this.GetComponent<Text>().text = "それでは間もなくゲームが始まります";
        yield return new WaitForSeconds(5.0f);
            
        this.GetComponent<Text>().text = "今のジェスチャーを駆使して、\n制限時間内にできるだけ\n多くのオブジェクトを破壊しましょう";
        yield return new WaitForSeconds(5.0f);
        
    }

 //チュートリアルシーンを抜けてゲームへ
    IEnumerator GoToMain(){
        Application.LoadLevel("MainScene");
        yield return null;
    }
}

Update()関数を使用するのが普通だと思ってたんですが、 どうやらこういった類のコードはコルーチンオンリーで管理したほうがやりやすいらしいです。 ちなみに上のコードは常にジェスチャの認識を見張っていないといけないため止むを得ずUpdate()を使用しています。なので苦労しました。

会社に立ち入るからには秘密を守ってもらうよ

昨日、SQUARE ENIX主催の「Graphics Tech Conference for Students」というイベントに参加してきました。

f:id:mokotixfemilar:20151127182741p:plain (これwebで公開されてないけど大丈夫かな(2012年までのはwebにあったしいいか
  

勉強会ということでKobitoにせっせとノートを取っていたのですが
誓約書に内容については公開を禁ずると明記されていたためせふせふな範囲で書きます。

このイベントは14:00~18:00までのカンファレンスで、途中オフィス施設見学を挟みつつ、スクウェアエニックス社のゲームにおけるCG技術に関する具体的な業務や体制についての講演を受け、その後、2時間の懇親会で社員さんや参加者の皆さんとざっくばらんな会話をするというものでした。

特に興味をそそられたのは研究開発で、競争に勝って先駆けるために必要な業務としてやり甲斐がありそうでした。怠け者の自分には適正がなさそうですが...

GoogleMicroSoftと同じ土俵で勝負するよりもその技術の恩恵に与ってコンテンツで勝負する」というのが、自分には性に合っていて、もしかしたらここが一番行くべきところなのかもしれないと思ったり。
他には海外の業務について、他の人が質問していた「人工知能機械学習」について、エフェクト制作についてなど、社員さんからお話を聞きました。
研究開発の人に自分の研究の話を一通りしたら「ぜひ一緒にやりましょう!」と冗談を言われたりなど。
とりあえず来月行われるインターンシップにも参加する予定なので、また社員さんに色々聞いてみたいと思います。

蛇足ですが、その前の週にあるコロプラ主催のUnityBootCampにも参加決まりました。
とりあえずゲーム作りまくりたいですネ
その翌日TOEIC(おそらく受験本当に最後)なのになぁ…orz

ツールの紹介

普段使用しているソフトについて書き足していきたいと考えています。
研究ではWindowsの入ったPC、個人ではMacbookを使用しています。

画像処理

PhotoShop,Illustrator

背景を透明色に変換からロゴの作成までいろいろできます。いろいろありすぎて書ききれません。 画像のサイズ変換だけはMacのプレビューからやってたりします。(枚数が多いと重い)

動画編集

AviUtl(Win)

動画の開始~終了フレームの設定をしたり、比較動画を作成するときに重宝しています。
以下のリンクからDLできます。
AviUtlのお部屋

比較動画の作成で参考にしました。
【Aviutl】比較動画の簡単な作り方【比較動画】 - Ψ(`∀´)Ψケケケ と (´・ω・`)ショボーン

Prism(Win)

動画フォーマットを変換できるツールです。avi⇨wmvにして容量を軽くするために使っています。

###MovieMaker(Win) Windowsにデフォルトで入っているソフトです。 AviUtlで作成した動画はavi形式でとても容量が大きいので、
パワーポイントに動画を埋め込む際にはこのソフトでwmv形式に変換しています。

QuickTime(Mac)

スクショの動画版(画面収録)が指定範囲でできたり、動画の時間幅のトリムができたりと重宝します。 保存した.movファイルをWeb公開用にgifにするときはPhotoShopを使います。 movなどの動画データをphotoshopでアニメーションgifにする方法 | バニデザノート

PhotoBooth(Mac)

インカメラを使用して動画の撮影ができます。

AfterEffects

www.adobe.com Adobe社の学生コンプリート版に付属しています。(月額3k) ※今見てみたら1580円/月らしいです
MADの作成とかしようかなと考えていますが未だあまり手をつけていません…。

バージョン管理

バージョン管理については自分はgitしか知らないのですが、以下の2つを使用してたりしてなかったり。 現時点でwindowsでgitは使用していません。

Microsoft Git Provider

VisualStudioのGitプラグインです。つい最近使い始めたのでまだ慣れていません。

Github

github.com
webで公開するので基本的にパブリックな形で管理することになります。
こちらはむしろオープンソースで、見ている人たちに活用してもらいたい目的で使用します。
専用AppのGithubDesktopを使うとやりやすいです。

SourceTree

Windows と Mac に対応した Mercurial/Git 無料クライアント | Atlassian
プライベートで使用したい場合にはこちらを使います。
自分はアプリ開発のインターンでチーム開発をする際に、リモート環境での開発が必要になったため使用しました。 こちらも専用Appがあります。ブランチや変更履歴などが見やすいです。

テキストエディタ

VimEmacs論争などが有名ですがちょいビムしかしたことありません。

SublimeText

プラグインが豊富で軽いしとても使いやすいです。 研究ではシェーダ編集用にしています。 個人ではPythonとかHtml書くときとか。

VisualStudio(Win)

研究で使ってます。いきなり大規模なMFCのプログラムを任されたので最初はちんぷんかんでした。今もですが。

Xcode(Mac)

MacC++swiftを書く際に使用しています。

Kobito

Markdown記法が使用出来るテキストエディタ。 勉強会などでノートとるときなどに利用しています(でもそこまで大したレイアウトにはならない)

mi(Mac)

html書くときに使ってたけどsublimeでええやんってことになりました。

スキルアップ勉強会を探す日常

GREE主催Creators' Meetupに参加してきました

connpass.com

11月12日19時頃から、開催場所は六本木ヒルズ森タワー。 何気に六本木したのは初めてだったためテンション上がりました。

最初の60分はスクエニ祖堅正慶さんによるサウンドクリエイターとしての苦悩の日々の紹介。 サウンドディレクターは1シーンだけでも 何百ものサウンドを制作・管理しなければならない だから直前の変更や漠然とした発注をするな!とのことでした (ディレクターやプランナーに対する皮肉が炸裂していました笑) 勉強会というよりは内部の実情を吐露しただけって感じでした

次の2時間が若干勉強になったかな? ゲームサウンドの変遷、モバイルゲーム制作における効果的なUIデザインについて、3Dゲームにおけるシェーダについて+VRゲームの紹介、 の3コースに分かれての講演で、僕は3つ目を選択しました。 最初のシェーダについてのプチ勉強会が少し刺激になって、 レンダリングパイプランに対する理解を深めることがシェーダ使いになるための第一歩みたいです。 (最近読んだ記事でシェーダは3Dよりもまずは2Dの画像処理で理解を深めるのが良いとの意見もありました。 まさに今僕が研究でやっていることでもあります。)

ちなみにVRゲームの紹介では、9月のTGSで紹介された下のゲームについてアルゼンチンのスタッフの方がお話をされました。

tgs.gree.net

「シェーダの開発を行うことでゲームエンジンの提供されている枠を超えた機能を実現することが可能になる」 と言う言葉で、先日の某社のswiftのライブラリ開発ハッカソンを思い出しました。 出来合いのものを再利用するよりも、自作のプログラムを作ることの方が重要であることを再確認しました。

今回は勉強会というよりも交流や刺激を求めに行ったのですが、 刺激の点ではまあまあ参加してよかったと思います。 今後もこうした勉強会があれば積極的に参加していきたいと思います。

追記

↓勉強会の資料がアップされていたので置いておきます GREE Creators’ Meetup #3【開催レポート】 | GREE Creators Blog