Terrariaのサーバーを建てました!
生存報告
ご無沙汰しております。
実に1年半ぶりのエントリでございます。
近況はいろいろありましたが、いつか書きます。きっと。
VPS契約しました
さて、先日ConohaVPSを契約しました。
月\900で24時間稼働ということで遊び倒してやろうと思っている次第です。
など既にいろいろ手を付けています。が、公開には至っておりません。
盆休みを使って公開まで漕ぎ着けたいですね。
本題:テラリアしようぜ
皆さん、Terraria知ってますか!?
知らない人はググってください!
知ってる人は一緒にマルチプレイしましょう!
先のVPSでテラリアのサーバープログラムを稼働させてます!
こういうのホストしたことないので決め事がよくわからないんですけど、
ワールド詳細
- 名前:Prismworld
- サイズ:ミディアム
- 現在ノーマルモード
注意事項など
- 24時間繋げますので好きなときに遊んでください
- 他人が建築した(らしい)ものは壊さないでください
- 誰かが置いていったものを盗るなとは言わないので、貴重品の管理は各自で
- 肉壁を倒す時だけは教えて下さい(ハードモード入っちゃうので)
とりあえず以上のような感じでやってみたいと思います!
興味のある方はTwitterなりコメントなりで連絡ください!
よろしくお願いします。
ゲームジャムゆるふわ勢のゲーム作りたいマンがGGJ2015で死んだ話
Global Game Jam 2015
世界各地で一斉にゲームを作り始め、2日後には完成させなければいけないというデスマーチなイベントが開催されました。それがGlobal Gam Jamです。
僕が参加したのは石川県のJAIST会場、一般参加でした。
ちなみに記事を書くまで期間が空いてしまったので内容は曖昧です。
チームAlive-march
チーム分けはハイライト法で行われました。
そして結成されたチーム「Alive-march」!
「なんとかしてデスマーチを回避する」というヘッドラインアイデアの元に結成。
メンバーは5人全員プログラマ(学生)で他のことに挑戦したいorちょっとだけ出来る人が少しと言った感じでした。
僕はゴリゴリとコードを書いてました。ちょっとだけマネジメントもしました。
開発の話(環境編)
JAIST会場では事前にUnityインストールしておいてね、とアナウンスもあったので初めからみんなUnityで開発する気マンマンのようでした。
集まったメンバーではUnityの他にUE4なんかも候補に上がってました。
最終的に僕達のチームが採用していたツールはこんな感じ
- 開発:Unity4.6
- プロジェクト共有:Slack
- ゲームパラメータ作成:Excel
- 3Dモデル作成:(忘れた)
開発にUnityを使うのはいいのですが、プロジェクト共有にSlack使ったのは失敗でした。
というのは、統合したプロジェクトのunitypackageを受け取る側は毎回、Assetフォルダの関係のあるファイルを削除していたからです。
各々の成果物をSlackでunitypackageとして上げて1人が責任を持って統合するスタイルだったのですが、統合されたファイルをいまいち反映出来ない現象(よく考えれば自然)があったので上の対処法を取りました。
今思えばなかなかクレイジーでした。
また、ゲームのデータを予めいくつか用意してそれを読み込む方式となったのでその辺だけExcel使いました。
神クラス(笑)
最初の会議でゲームの内容、クリア条件、ゲームオーバー条件などを話し合って必要となるコンポーネントを整理しました。
全員プログラマだったのでここはスムーズでした。
関連ある機能で作業を分担し、僕は主にゲームの進行に関連している機能を書きました。
ゲーム管理体と言えばシーン遷移、あとはデザイナーがゲーム全体のバランスを調整するパラメータなんかを調整できるように持つものだと考えています。
オブジェクト指向的にはシーン遷移は切り分けて設計するものかもしれません。
とにかく、当初はシーン遷移を行い、いくつかのパラメータを保持するだけのはずでした。
しかし最終的にはいわゆる神クラスとなってしまいました。
やっていることを書き出してみます。
- シーン遷移
- メインシーンの進行
- UI管理体に仕事を割り振り
- ゴミ処理(シーンに要らないオブジェクトを破棄)
多すぎィ!
なぜこうなってしまったのか
なぜこんなことになったのかは明らかで、
- ゲーム全体を管理する人と、メインシーンを管理する人を混同した
- 終盤、「もう全部あいつ一人でいいんじゃないかな」になった
からです。
1.に関してですが、製作を始めてまず取りかかったのはメインシーンの流れを作ることです。
これは当然です、アルファ版発表もありますし。
メインシーンの流れは誰が作るか、ゲーム管理体(GameManager)だろうと考えてゴリゴリと書きました。
このシーンが完成してくると次に他のシーンを作るか、となります。
そして他のシーンをメンバーにぶつ切りで作ってもらい、統合する人(僕)が受け取り、繋ぎ合わせるわけです。
じゃあシーンを繋ぐ人は誰だろう、そりゃGameManagerだろうとなりGameManagerにはシーンを繋ぐ責務が追加されました。
こうして、本来切り分けられるはずの責務を1人で全うする存在が出来たことにより、GameManagerはその便利さから、あらゆるオブジェクトと繋がりました。
最初の設計を振り返ると分かるのですが、最初にゴリゴリと書いたメインシーンの管理はもともとGameManagerの仕事では無かったんですね。
神クラス作り始めたから多分これはデスマーチだな! #ggj_jaist
— くりあ (@clear10_foo) 2015, 1月 24
2.に関して。メインシーンの管理と一言で言えば簡単ですが実際は当然とても処理が多いのです。
さらに保持するデータもたくさんあります。
そうすると、メンバーの間で
「この値って誰に聞けば分かるの?」「GameManager」
「指示されたら仕事するようにしたけど誰が指示してくれるの?」「GameManager」
の会話が広げられ、
となったわけです。
全知全能の神クラスをつくって、創造主に仕事をポイするチームAlive-march #ggj_jaist
— きんぱく@卒研瀕死マン (@gold_leaf_9541) 2015, 1月 25
GGJで神クラス作ってたマンだけど、GUIに必要な情報をパッケージにして渡したりゲーム管理情報を意地でもpublicにしなかったのは良かったと言える。ただ他のオブジェクトが神が指示しないと仕事しないし低級オブジェクトを直接殺すまでしてたのはまさに神クラス(笑)だった。
— くりあ (@clear10_foo) 2015, 1月 26
結果、終盤はチームメンバーからメソッド追加とメソッド呼び出しの申請で度重なるアップデートに追われました。
さらに統合作業&バグフィックスもあったので、死ぬほど忙しかったです。
どうすればよかったのか
対策はいくらでも考えられると思います。
例えば、コンポーネントA→GameManager→コンポーネントBとなっている部分をコンポーネントA→コンポーネントB(末端のことは末端間で解決)としたり、別のオブジェクトの仕事をGameManagerが呼び出すのではなく、仕事をしていいかGameManegerに聞いて自分で仕事をするようにしたりだとか。
結局言えるのは、
- 切り分けられることは切り分ける
- 能動的に仕事をさせる
ということでしょう。よく言われることですが今回、痛いほど実感しました。
そうは言ってもやはり
しかしゲームジャムです。
製作期間が極端に短いのでそんなに丁寧に設計している余裕もないでしょう。
妥協点を決めてある程度妥協してでもゲームをより良くするのが大切です。
今回のことはもちろん反省していますが、これもゲームジャムならではの経験だと思います(神クラスはさすがに妥協しすぎ)。
昔誰かが言っていたのですが、
「コードは綺麗に書け、最後に汚してもいいように」
が今回の教訓となりました。
まとめ
ゲームジャムは超短期間でチーム開発が経験することが出来るめったにない機会だと考えます。
良い経験になるし、なんだかんだ楽しいので一度は参加してみると思います。
ただし進捗によっては高確率でデスマーチが発生します。回避したい人は夜間開放されない会場で参加するのがいいでしょう。
ちなみに今回作ったゲームはGGJのサイトにもありますが、
で遊ぶことが出来ます。バグだらけですが、お楽しみください。
他のチームの作品も2日間とは思えない作品なので遊んでみるといいかもしれません。
チームメンバーも今回のレポート記事を書いているようなので、そちらもぜひ。
Global Game Jam @JAISTに行ってきました - nyaruratoものづくり記録
【速報版】Global Game Jam 石川サテライトへ行ってきた - akira-kashiの日記
Python勉強したのでBeautifulSoupでWEBスクレイピングやってみた
こんにちは、くりあです。
いつもは大学の講義だったりUnityだったりでCやC#ばかり書いているのですが、最近Pythonを勉強し始めました。
そういうわけでせっかく勉強したので前から興味のあった「WEBスクレイピング」やってみました。
クローラー/スクレイピング Advent Calendar 2014
クローラー/スクレイピング Advent Calendar 2014 - Qiita
この記事は「クローラー/スクレイピング Advent Calendar 2014」の16日目の記事です。
やってみたこと(概要)
ある月のゲーム発売日を知りたくなったときにshellを開きPython2.7を使ってこんな風に調べることが出来ます。python publish_calender.py 2014/12
ちなみに出力はこんな感じ。
2014年12月発売のゲームカレンダー 1日 シムシティ:コンプリートエディション [オンラインコード](エレクトロニック・アーツ)[PC] 2日 Terraria(505 Games)[PS4] テイルズ オブ ジ アビス [オンラインコード](バンダイナムコゲームス)[3DS] (略) 30日 WiiU/Wii/PS4/PS3用マイク『USBシンプルマイク』(ゲームテック)[PS4] アストラエアの白き永遠 オリジナルサウンドトラック プラス(FAVORITE)[ゲームCD] 31日 Kingdom Hearts III(Ps4)[PS4] The Lego Movie Videogame(Whv Games)[3DS] Witcher 3: The Wild Hunt C.E.(Warner Bros Games)[Xbox One] Kingdom Hearts III(Xbox One)[Xbox One] Tomb Raider Platinum Hits(Square Enix LLC)[Xbox360]
こちらのカレンダーから最低限のところだけスクレイピングしてコンソールやファイルに出力するようにしました。
ゲーム 発売日
BeautifulSoup
今回スクレイピングするのにBeautifulSoup4を使用しました。いわゆるHTMLやXMLのパーサーで簡単にWEBから要素を取得出来ます。jQueryっぽい印象ですね。
これがとっても便利なライブラリで最近いろんなところをターゲットに遊んでます。
スクリプト完成までの流れ
簡単にちゃんとした出力が得られるまでの流れを挙げてみます。苦労した点もいくつか。- BeautifulSoup4の導入
- ターゲットとなるhtml(のソース)を決定
- ターゲットのソースをぼんやり眺める
- コードを書いてみる
- HTMLエンティティとエンコーディングに悩まされる
- 解決、機能拡張
- 完成
ざっくりとこんな感じでした。
WEBスクレイピングやってみようと思ってすぐにBeautifulSoup使おうと決めていました。
ちょっと試してなんとなく使い方を掴みました。
次にどのWEBページを狙うのかを決めました。これは僕が便利だな、と思うことから適当に。
さてターゲットも決まってまず最初にしたのは、ソースコードを眺めることです。
そのWEBページがどういう構成で成り立っているのかをなんとなく掴みます。
「こんな感じで書けそう」と思い付くまでぼんやり眺めましょう!
要素の親子関係を意識するとわかりやすいかもしれません。
思いついたら後はコードを書いてみました。
ここで要素の取得なんかは思うように出来たのですが出力にはめちゃくちゃ気を遣う必要がありました。
例えばこれ。
龍が如く 1&2 HD EDITION PlayStation®3 the Best
この文字列はWEBから取得するとHTML特殊文字を含む文字列
龍が如く 1&2 HD EDITION PlayStation®3 the Best
となります(今回の場合)。これを元に戻すためにワントラップ、さらに登録商標マーク「®」をそのままWindowsのコンソールなんかでprintしようとすると下の通り怒られます。
UnicodeEncodeError: 'cp932' codec can't encode character u'\xae' in position 0: illegal multibyte sequence
Windowsのコンソールはデフォルトエンコーディングが'cp932'(拡張SJIS)なのでprintのときには当然変換されるのでしょう、変換できなくても。
1つ1つ例外チェックするのも面倒だったので調べたところ、便利な一行を知りました。
sys.stdout = codecs.getwriter(sys.stdout.encoding)(sys.stdout, errors='replace')
現在設定されている標準出力のエンコーディングを検索→StreamWriterの引数を指定してインスタンス生成→標準出力に設定ということをしているようです。
コンソール出力の際にはこれを使って例外処理をするようにしました。全部を適切に置換なんて出来ないので!
参考:
cp932で表現できない文字がたまに混ざるユニコード文字列をWindowsのコンソールにprintしたい場合 - 西尾泰和のはてなダイアリー
7.8. codecs — codec レジストリと基底クラス — Python 2.7ja1 documentation
ここまでやってようやくちゃんとした出力が出来たので実行時の引数から年月と出力先の指定を出来るようにしてひとまず落ち着きました。
JAISTGameJam(2Day)で天界を目指して見えてきたもの
お久しぶりです。くりあです。
前回、はてなしたいですと言ってから全くはてなブログを書いていませんでした。
これは初めてゲームジャムに参加して思ったことを忘れないうちに書いておくための記事です。
JAISTGameJam
11月2~3日にかけてJAISTでゲームジャムが開催されました。
JAIST(北陸先端科学技術大学院大学)は世界最大規模であるGlobalGameJam(GGJ)や、IGDA日本主催による福島GameJam(FGJ)の会場のひとつでした。金沢八耐なんてイベントも定期的に開かれてるようです。
作った「Kami」ゲー
こちらに参加した3チームの作品が公開されています。
このゲームジャムのテーマは「Kami」
僕はAチームで「RoadToGod 」というゲームを僕含め4人のチームでつくりました。
はじめてのチーム制作
実は僕は大学で自主ゲーム開発サークルなんてものに所属しています。
ここにも僕が作ったゲームがいくつか公開されています。暇なときにどうぞ。
しかし、今まではすべて一人でゲームを作っていたため、今回が初めてのチーム制作でした。
はじめての協力プレイの感想はまさに、
「仕事は一人でやるより他人を巻き込んだ方がスピードが上がる」
サラマンダーよりずっとはやい。
こんな感じ?
僕達のチームが作った「RoadtoGod」ですが、実は1日目の2時間くらいで最初の企画で共有したイメージのゲーム画面を作り終えていました。
メンバーの誰かが極端にすごかったり手が1本多かったりしたわけではないのですが、ゲームロジックが非常にシンプルだったので適当に仕事を分担したらあっという間でした。
今回のゲームジャムでは各チームに大きなディスプレイが用意され、メンバーの任意のタイミングで画面を共有できるシステムを利用していました。このシステムがかなり便利で、「こんな感じで作ってみたけどどうでしょう」とつくったものをすぐにチームで自分の中のイメージと照らし合わせていました。
デ、デバッグだから……
1日目の早い段階でゲーム画面のアルファが出来たのでシーンの追加と遷移、それからサウンドの追加などをしてゲームらしい動作をするようにしたところでこれをアルファ版としました。2日目は1日目の終わりに話し合った要素をさらに追加していき、β版としました。2日目はおそらくゲームが面白くなるためにはこうしたらどうか、という要素を詰め込む作業ばかりしていました。
2日目の午後、僕はスクリプトもそこそこにβ版のゲームを遊んでいました。
チームの中で一番このゲームを遊んでいたと思います。チームのみなさんごめんなさい。
でもこれがすごく楽しくて、ずっと遊んでました。
いっぱい遊んでみることが大事
「RoadtoGod」は「神」になるために天界を目指すゲームです。
僕は多分ゲームジャム中に100回は天界を目指した気がします。
だから、これだけ遊べるゲームをチームで開発出来たのがとてもうれしいし、想像以上に遊んで楽しいゲームを作れたと自信を持って言えます。
逆に、いっぱい遊ばなかったらこの楽しさを実感出来なかっただろうし、自信も持てなかっただろうと思います。
まとめ
- ゲームジャムは楽しい
- 楽しいゲームを作ることが出来た
- 作ったらいっぱい遊ぼう
P.S. 家に帰る前がゲームジャムです
家の鍵を会場に忘れるという失態を犯し関係各位にはいろいろとお世話になりました。ありがとうございました。