読者です 読者をやめる 読者になる 読者になる

ただの適当な開発記

会社勤めしつつUnityでアプリ作ってる人の雑記

すた丼好きが集まるmastodonインスタンス「Maすた丼」を建てました

Mastodonの流行に乗ってみたよ

masutadon.com


APIでいろいろやってみたかったから建てただけなんですが、せっかくなんで趣味のすた丼でくくりました
今いる人は基本的に知り合いだけなんですが、誰でもどぞー

クライアントアプリを作っていく予定

「オセロ返し」を作りました

昨日は会社でゲームジャムがありました。
皆で集まって好きなゲーム作ろ〜的なイベントです。
弊社にはまったく仕事向きではない謎のお洒落空間があるのですが、そちらで朝の10時から集まりゴリゴリ開発をしておりました。

成果物

で、出来たのがこちら


オセロ返し_1

成果物発表会のときに参加者の前でこの動画を見せた所、「オセロやるのは必要なの?」という意見が多くでましたが、
絶対に必要です
様式美を大事にしていきたいのです。

アセット

今回使用したアセットはこちらです

オセロ盤とかオセロの駒とかは自前でなんとかなったんですが、手のモデルがどうしても欲しかったので購入しました。

申請

思えば最後にストアにゲームをリリースしたのは2016年の1月です。

play.google.com

2017年4月から社会人生活も4年目に入り、エンジニアとしての歴も4年目になります。
今年度は会社に属さない活動により一層力を入れていきたいので、個人で制作したアプリのリリースも積極的にしていきます。
手始めにこのクソゲーをリリースしようと思います笑

AppleもGooglePlayも両方共開発者ライセンスが切れているので、更新のお金を払わなければなりませんね。。
リリースの準備ができ次第ライセンスを更新して各ストアに申請します。

今後の方針みたいなのを書こうとしたら期せずして長ったらしくなりそうだったのでまた別の記事で書きます。
というわけで以上!

Inspector上の反復作業はなるべく減らし隊 ~Reset編~#Unity

UnityでInspector上で同じような操作を何回もするケースって結構あると思います。

個人的に最近一番多かったのが、
Trigger検知をしたいオブジェクトに対してColliderとRigidbodyをアタッチし、Collision判定と重力をオフる操作
です。

f:id:cocokyoro:20170320015749p:plain

こういうやつ。

これ毎回手作業でやってると、いつか絶対付け忘れたオブジェクトが出てきます。
で、それに気づかず実装して予期せぬオブジェクトが物理的な当たり判定を持っちゃってどっか飛んでく、といったバグが起こりうるわけです。

こういうのを起きないようにするためにPrefabがあるのでは?という意見もあると思いますが、作成したPrefabの抽象度によりけりだと思うので、今回はInspectorで操作せざるを得ない状況ということで。

Inspector上での反復作業を避けるには幾つか対応方法はあります。

そのうち自分がよく使うのはReset関数+RequireComponentでInspector上の設定をスクリプトからやってあげるというもの。


Resetの使い方例

RequireComponentで指定した型のComponentが自動でアタッチされます。

[RequireComponent(typeof(Collider))]

とやると下記のようなエラーがでます。

f:id:cocokyoro:20170321011018p:plain

Colliderじゃなくて継承先のColliderクラスを指定してあげましょう。

そして、ResetはGameObjectにスクリプトがアタッチされた瞬間に呼ばれます。
Resetの中で値を設定してあげればInspectorを直接いじる必要はありません。
Unity - スクリプトリファレンス: MonoBehaviour.Reset()

> Reset はインスペクターでデフォルト値を設定するときにもっともよく使用されます。

リファレンス的にもこの使い方を推奨しているようです。

複数ボタンがスクロールする画面を作るときに便利な「MultiButtonScroller」をリリースしました#Unity #AssetStore

リリースしました

UnityAssetStoreに自作アセットの第2段をリリースしました

値段は15$になっております

経緯

カジュアルゲームを作るときに毎回ステージ選択画面を作るのが面倒なので、レイアウトを簡単に設定できてメニューを作れるアセットがあったらいいなということで作りました。

f:id:cocokyoro:20161214234116p:plain
こんな画面とか

f:id:cocokyoro:20161214234127p:plain
こんな画面とか

f:id:cocokyoro:20161214234152p:plain
こんな画面が簡単に作れちゃいます


チュートリアル

チュートリアル動画はこんな感じです

レイアウトを楽に作りたいという方は是非お買い求めを!


小話

実装

今回のアセットはDataDrivenでどんなdataクラスを定義してもうまいこと動くような作りになってますが、ここはEnhancedScrollerというアセットを参考にしています

このアセットも様々な要素をスクロールさせるためのものなんですが、汎用的な作りになっているため自分で自由なビューとデータを用意して使用することができます。
こちらもおすすめです。

申請

今回は2回のリジェクトの後、3回目の申請で通過しました。

ちなみに審査はUnityTechnologiesなので英語です。

・1回目
ドキュメントがわかりづらい

→ ドキュメントを消して動画のチュートリアルを作成

・2回目
動画のチュートリアルがあるのはいいことだと思うんだけども、パッケージ内に含める文章のチュートリアルをしっかりつくってくれ。pdfかtxtかrtfでよろすく。

パワポチュートリアル作ってpdf出力したものをパッケージに含める

って感じでした。

前回↓は7回くらいリジェクトされたのでそれよりはスムーズにいきました。

今後カジュアルゲーム作るときは自分もこのアセットをどんどん使っていこうと思います!

次のバージョンではスワイプに対応する予定(むしろ今は対応していないのかというのはさておき)

てなわけで以上!

2016年11月の収益

12月の3分の1が過ぎてしまったタイミングで先月のアセットストアの収益報告です

収益

はいドン

f:id:cocokyoro:20161210110424p:plain


先月の2倍ということですた丼が2杯分買えますね。


今月はこちらのアセットについて変更したのはチュートリアル動画を追加したくらい。

www.youtube.com

もともとこの動画は一番最初のv1.0.0を申請したときから入っているはずだったのですが、Draft情報を間違って削除してしまったので追加されたのは1ヶ月半後でした。もっと早く気づけばよかった。。


12月

先月次のアセットを申請したのですが、これがなかなか通らない(;´Д`)
現在2回リジェクトされております。

チュートリアルのurlとして下記の記事を記載しました。
cocokyoro.hateblo.jp

しかしAssetStoreの中の人からは次のような返答が

We ask that you include offline documentation in your package in the format of .pdf, txt or rtf. It is okay to have more extensive online documentation but the offline documentation should include enough instruction for the user to understand the basics of the package.

pdf,txt,rtf 形式のチュートリアルを作ってパッケージに含めてちょうだいとのことで、文字のチュートリアルをこれから作るところです。めんどくさい

年内に残り2つのアセット申請したいでふ

開発合宿@山喜旅館

この週末に山喜旅館に開発合宿に行ってきました。

参加者は大学時代のサークルのメンバー4人。

伊豆伊東温泉の格安旅館、会席料理と24時間入浴の自家源泉、山喜旅館 TOP

この旅館は元祖開発合宿旅館らしく、いろんなとこで既に紹介されてますね。

www.find-job.net

1日目

この旅館はJR伊東駅が最寄りです。
f:id:cocokyoro:20161126150250j:plain

1日目はこちらで開発開始。
f:id:cocokyoro:20161126151455j:plain


驚くべきことに普段自分が使ってるツールの会社の皆様(ぼかし)もこの日に宿泊だったようで、食事の時に声をかけさせていただきました。

施設自体はとてもいい旅館だったのですが、会議室を予約し忘れるという痛恨のミスを犯してしまいました。
会議室でみんなでもくもくというのを想定していたんですが、結果旅館の一部屋でみんなでもくもく開発することになりました。館内どこでもwifiが繋がったのが救い。
延長コードやマルチタップは完備されていたのは流石でした。

宿泊した部屋はオーシャンビュー。
f:id:cocokyoro:20161126165642j:plain

というか、めっちゃ海が近い。
歩いて3分くらいで海にいけます。

夜ご飯はこんな感じ。
f:id:cocokyoro:20161130165926j:plain
(゚д゚)ウマー

夜は息抜きにみんなで散歩に行きました。

f:id:cocokyoro:20161126202547j:plain

そんなこんなで、深夜1時くらいまで作業。


2日目

10時にチェックアウト
会議室を予約していたらチェックアウト後も昼過ぎまで使用できるみたいです。

次なる作業場所を求めてとりあえず熱海へ。

「熱海 wifi

で検索して出てきたカフェに狙いを定める。


着いたのはこんな感じの小洒落たカフェ。

f:id:cocokyoro:20161127131028j:plain
caferoca.jp
とてもいい感じのカフェでした。

こんなオシャレ空間でも、どかどかとキーボードタイピングをする4人組。

小一時間ほど作業をした後、昼食を摂り次の作業場所へ。
ちなみに昼食は海鮮丼を食べようとしていたが値段や混み具合の関係でなかなか決まらず結局地元の人が行ってそうな焼肉屋で済ませることに。肉が美味しかったのでよし。

次の作業場所に決まったのはこちら

atami.ooedoonsen.jp

お台場では有名な大江戸温泉物語の熱海版です。

入館時に「お台場の大江戸温泉と当館はコンセプトが違いますので、お台場のようなくつろげるスペースはございません」という説明を何回か受ける。過去に何かクレームがあったのだろか。

実際入館してみると、ちょうどいい作業スペースはあるわ卓球台はあるわ露天風呂はオーシャンビューだわで最高でした。ここで日帰り入浴規定の3時間を過ごす。

その後熱海駅のカフェや土産屋で時間を潰し、踊り子号みたいな電車で東京へ帰ったのでした。


成果物

で、肝心の成果物ですが。
なんかぷよぷよテトリスが合体してるやつを作ってます。
ブロックの積み重なり方はテトリスで、消え方がぷよぷよ。そして、指定したタイミングでだけぷよぷよの落ちる動作が発動するというもの。

webGLでビルドしますので少々お待ちを(;´Д`)



次回は1月に開催予定
次はちゃんと会議室を抑えよう

Sinatra+Herokuでgithubのwebhookレシーバをつくる

久しぶりにunity以外の内容です
githubでプルリクエストをマージした際にそのイベントを取得してどうこうやりたかったので、書いてみた
一番最初はgoogle app scriptのdoPostをつかってレシーバにしようと思ったけど、これがどうにもうまくいかない..
しょうがないのでherokuサーバーを立ててそこで取得することに

今回は簡易的なものでいいやということでRuby on RailsではなくSinatraで書くことにしました

Heroku上でRubyを動かす手順は公式ページ通りにやればOK

devcenter.heroku.com

Deploy your application to Heroku

ここの手順までやればOK

上記ページ通りにやると次のようなコードを書いてあると思いますが、これを書き換えます

require 'sinatra'

get '/' do
  "Hello, world"
end

今回はただgetで叩くだけではなく、post通信で送られてきた情報をつかってどうこうしたいので、

require 'sinatra'

get '/' do
  "Hello, world"
end

post '/notify_merged' do
  #何かする
  "post result"
end

こんな感じでpostの受け口を書く。

受け口が出来たらgithubのwebhookに登録する。

githubでsettings -> Webhooks -> Add webhookを選ぶ

f:id:cocokyoro:20161123180633p:plain

PayloadURLには「herokuのurl+postのパス」を記載
上の例でいうと https://それぞれで違う.herokuapp.com/notify_merged
という感じ

次はwebhookのトリガーの設定。
今回はプルリクエストに関するイベントだけを受け取りたいので次のように設定

f:id:cocokyoro:20161123181344p:plain

これでプルリクエストに関連する動作があるたびにイベントが送られます。

では先程のコードの方に戻ってプルリクのイベントを受け取ったあとの処理を書きます。

プルリクエストのタイミングでgithubからは以下のような情報が送られてきます。
Event Types & Payloads | GitHub Developer Guide

今回はマージリクエストのタイトルとコメントをとってきたいので、こんな感じ

require 'sinatra'

get '/' do
  "Hello, world"
end

post '/notify_merged' do
    body = request.body.read
 
   if body == ''
      status 400
    else
      parsed = JSON.parse(body)
      merge_info = parsed['pull_request']
      action = parsed['action']
      merged = merge_info['merged']
      #今回はクローズしてかつmergeされたプルリクの情報を拾う
      if(action == 'closed' && merged)
        title = merge_info['title']
        comment = merge_info['body']
        var response = "タイトル:"+title +"/コメント:" + comment
        #responseを使って何かするときはここで
        response
      end
    end
  end

これをherokuにpushしたあとに実際にプルリク投げて取り込んでみると..

f:id:cocokyoro:20161123221407p:plain

こんな感じでレスポンス返ってきます

以上!