Unity5の教科書 6章 クソゲー爆誕
6章は雲をジャンプしていくやつなんですけどね。。雲を適当にドラッグアンドドロップでフィールドにおいたら超つまんないの。
Unity WebGL Player | ClimbCloud
いやー、ゲームバランス取るのってとっても難しいですね。
物理シミュレーションとか当たり判定とか全部Unityがやってくれるのね。スプライトアニメーションもドラッグアンドドロップで大抵のことはできるし。デバイスの傾きセンサーとかもラップしてくれて使いやすいし。メニュー、ゲームの画面遷移も後先考えずに一行ですよ。すごい時代になったものです。本当にアイデアのみが必要な世界になったのかな?
Unity5の教科書 2D&3Dスマートフォンゲーム入門講座
- 作者: 北村愛実
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2016/06/22
- メディア: Kindle版
- この商品を含むブログを見る
それはそうと相当炎上していたプロジェクトを強制消火させたので今日は遊ぶ時間がとれてたのしー
Unity5の教科書 5章
そのまま
Unity WebGL Player | CatEscape
ホントわかりやすいね。この本。サクサク。
Unity5の教科書 2D&3Dスマートフォンゲーム入門講座
- 作者: 北村愛実
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2016/06/22
- メディア: Kindle版
- この商品を含むブログを見る
Unity5の教科書 4章
WebGLで書き出してみました。
Unity WebGL Player | SwipeCar
ビルド時間かかるわー。macbookproのcorei5のメモリ16G積んでいても30分ぐらいかかる。
ちょっと辛いわー。
教科書のソースの抽象度が一定ではないので一定にした。
関数の抽象度は一定にすべき。ソースの書き方を指南する本ではないのでmain的なupdate関数にまるまる書くのは理解を助けるのには役立つけどプロダクションコードではきちんとメソッド分割すべき。まぁ、メソッド分割とかコードの抽象度の統一とかは業務系システムのセオリーでゲーム畑はどうなのか知らんけど。メソッドコールが速度的に耐えられないとかいう文化があるのかもしれない。
@GameController
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using System; public class GameDirector : MonoBehaviour { GameObject car; GameObject flag; GameObject distance; // Use this for initialization void Start () { this.car = GameObject.Find ("car"); this.flag = GameObject.Find ("flag"); this.distance = GameObject.Find ("Distance"); } // Update is called once per frame void Update () { float length = getLength (); if (length >= 0f) { setText ("to Goal," + length.ToString ("F2") + "m"); } else { setText ("GameOver"); } } float getLength () { return this.flag.transform.position.x - this.car.transform.position.x; } void setText (String str) { this.distance.GetComponent<Text> ().text = str; } }
@CarController
using System.Collections; using System.Collections.Generic; using UnityEngine; public class CarController : MonoBehaviour { // 速度 float speed = 0; // 初期場所 Vector2 startPos; // Use this for initialization void Start () { } // Update is called once per frame void Update () { // スワイプの長さを求める detectMouse (); // 移動 move (); // 減衰 decay (); } /** * スワイプの長さを求める */ void detectMouse () { if (Input.GetMouseButtonDown (0)) { this.startPos = Input.mousePosition; } if (Input.GetMouseButtonUp (0)) { Vector2 endPos = Input.mousePosition; float swipeLength = endPos.x - this.startPos.x; this.speed = swipeLength / 500.0f; play (); } } /** * 移動 */ void move () { transform.Translate (this.speed, 0, 0); } /** * 減衰 */ void decay () { this.speed *= 0.98f; } /** * 音声再生 */ void play () { GetComponent<AudioSource> ().Play (); } }
Unity5の教科書 2D&3Dスマートフォンゲーム入門講座
- 作者: 北村愛実
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2016/06/22
- メディア: Kindle版
- この商品を含むブログを見る
Zabbix3でJavaアプリログのExceptionを補足してメールぶっ飛ばす
世の中には看過してよいExceptionと看過してはいけないExceptionがあります。
我らがZabbixでJavaアプリケーションログのExceptionを検知してメールをぶっ飛ばす方法を考えます。
背景
NullPointerExceptionがおきてエラーページに飛んでいた状態に気づかずに1ヶ月ぐらい放置してしまってお客様に指摘されて直すとかありました。
もっと先に気づいて闇に直すことをできるようにしたいと同僚に言われ検証してみる。Javaアプリに手をいれることを考えたが、Javaアプリは糞重いのでこれ以上処理を増やしたくない。
そこでzabbixに登場していただくことにしました。
もちろん無視して良いExceptionもあるので発生したExceptionをメールに載せる、というのを今回はやりたいと思います。
メールがきたらログを見に行くワークフローを想定。
productionでは便利に使えるsmtpサーバーがあるとおもいますが、今回は検証ということでsmtp.gmail.comを使います。
また、本来はアプリごとに一発で決めれるテンプレートを作るべきですが、検証なので直接ホストにアイテム等突っ込みます。
3年ぶりぐらいにzabbix触りました。
環境
- アップグレードしっぱいしてこわれたUbuntu14か16かわからないサーバー
- Zabbix3.x(パッケージシステムで入ったやつ)
zabbixのインストール
適当にググってください。いっぱい出てくる
DBの日本語化はZabbixの日本語文字化けを解消する方法 - geek.conf.2を参考にしました。
1.アイテム
名前 :適当 タイプ:Zabbixエージェント(アクティブ) キー:log[/var/log/test.log,"([^ ]*Exception)",,,skip,\1] データ型:ログ 更新間隔(秒):1(適当) ヒストリ保存期間(日):7(適当)
2.トリガー
名前:InfoExceptionTrigger(適当) 深刻度:情報 条件式: {zabbix-server:log[/var/log/test.log,"([^ ]*Exception)",,,skip,\1].strlen()}>0 and {zabbix-server:log[/var/log/test.log,"([^ ]*Exception)",,,skip,\1].nodata(5s)}=0 正常イベントの生成 障害イベント生成モード:複数
- 条件式は正規表現でExceptionの値を取り出していること
- 5秒たったら正常復帰
今回は検証なので/var/log/test.logを監視している。
ちょっと残念なところはトリガーが2回ずつ呼ばれてメールが発信されてしまうこと。nodataが原因らしいけどうまい解決方法が思いつかない。
3.メディアタイプ
メールタイプで作成
zabbix gmail smtpとかでググると設定がでてきますね。
gmailを使う場合は「セキュリティの弱いプログラムを許可」しないとだめっぽい。
何回かメールぶん投げているとprevent sign in attempt みたいなメールが来て、そこに許可のためのURLが乗ってる。
捨てgmailアドレスを使うことをおすすめ。何れにせよgmailは一日500通の送信制限があったとおもうので実運用には向かないですね。
4.アクション
適当につけた名前をつなげる。
3で作ったメディアタイプをつなげる。
メッセージの件名:{TRIGGER.STATUS}: <{ITEM.VALUE1}> :{TRIGGER.NAME}
とすることでNullPointerExceptionとかRuntimeExceptionとかが件名にはいるので気にしなくて良いExceptioonは本文見なくても良くなるのでおすすめ。
6. 確認
echo "aaa " `date "+%Y%m%d%H%M%S"`Exception bbbb >> /var/log/test.log
とかしてメールが届けはOK。検証完了です。
一回のExceptionでトリガーが2回、回復が1回の3通メールが飛びます。
7.感想
やっぱりZabbixはややこしい。変にスクリプト書くよりも標準機能でなんとかするのが後の人のことを考えた方法だと思う。あと、本番投入の際にはきちんとワークフローの設計もふくめて検討して設定しないと早晩ぐちゃぐちゃになるのがZabbix。あとおれはインフラ系ではないのでZabbixのことはよくわかっていない。
Unityで遊んだ。
nn-hokuson.hatenablog.com
なんか1時間で遊べるシューティングが作れるってよ。本当に1時間で出来たわ。本買ってもうたわ。
10年ぐらい前に「ゲームプログラマになる前に覚えておきたい技術」を読んだときは死にそうになったものだけれど。
めっちゃ楽やね。衝突判定書かなくて良いとか。。UnityでC#のプログラム覚えましたって人は信用出来ないね。これは楽すぎる。
これでクロスプラットフォームとかすごいねぇ。久々にC#書いたけど良いね。書いたとも言えない行数だけど。キャストするのではなくComponent取る感じがSeasarのDIっぽい。
自分で爆発音をつけてみるカスタマイズをしてみた。LINEアプリで録音して共有でメールに飛ばして適当にカットして、と。最速でアセット用意するメソッドかもしれん。
Github pagesで公開してみました。
Unity WebGL Player | SampleShooting
Chromeでも動くね。Firefoxは知らん。