Unity / VRゲーム開発日記@長崎

Unityを使ったVRのゲーム開発をやってます。

クラスのメソッドを拡張するExtensionの使い方

C#には、既存のクラスに機能を追加することができる
Extensionという機能があります。


例えば、
transform.position
は、
transform.position.x = 10;
など、座標のx値を直接変更することができませんが、


ExtensionでTransformクラスを拡張して、
tranform.SetPosX(10)
等として、x値だけを変更するというメソッドを
追加することができます。


例としてあげたpositionのx値だけを
書き換える拡張のコードは以下のようになります。

public static class Extensions
{

	public static void SetPosX (this Transform me, float val)
	{

		var newPos = me.transform.position;
		newPos.x = val;
		me.transform.position = newPos;
		
	}

}


まず、Extensionsというstaticクラスを作っておきます。
その中に更にstaticの関数でSetPosXを作りました。


この関数の引数に「this」という修飾子がついています。
これが、Transformクラスにメソッドを追加するよ!
の意味になります。


そして、meは引数名ですが、これがこのSetPosXを呼び出している
Transformへの参照という意味です。


で、関数の中身は、
一度transform.postionから既存のVector3の値をとって
そのx値だけ書き換えて
それをもう一度transform.positionに再設定するという、
普段positionの値を設定する通りの手続きになってます。


つまり、positionのXだけを変えるのに毎回関数内の記述を書いてた場合は、
それが
transform.SetPosX(val)
だけですむようになるので、かなり手続きが楽になるかと思います。


後は、同様にSetPosYやSetPosZも追加しておけば汎用性が高まるかと思います。


2D用にx,yだけ設定したい場合は、
Set2D(this Transform me, Vector2 val)
みたいな形にして、x,y値だけを変更できるようにすると便利かもです。


自分は他に、Get2Dとしてx,yの座標を取得したり
AddPosX等として、現在位置に値を足す物、
あとは、サイズ、角度にたいしてもx,y,zだけ変更できるような
拡張をつけています。


コードを共有して開発してる時は、勝手に拡張をつけすぎると
他の人にとっては煩わしくなる可能性もありますが、
個人開発の場合は、自分で使いやすい機能をどんどん追加していって
なるべくコードを書く手間を減らしていっても良いかと思います。



最後に、SetPos、xyzの拡張とSet2Dの例を上げておきます。

public static class Extensions
{

	public static void SetPosX (this Transform me, float val)
	{

		var newPos = me.transform.position;
		newPos.x = val;
		me.transform.position = newPos;
		
	}
		
	public static void SetPosY (this Transform me, float val)
	{
	
		var newPos = me.transform.position;
		newPos.y = val;
		me.transform.position = newPos;
		
	}
	
	public static void SetPosZ (this Transform me, float val)
	{
	
		var newPos = me.transform.position;
		newPos.z = val;
		me.transform.position = newPos;
		
	}

	public static void Set2D (this Transform me, float x, float y)
	{
		var newPos = me.transform.position;
		newPos.x = x;
		newPos.y = y;
		me.transform.position = newPos;

	}

	public static void Set2D(this Transform me, Vector2 pos){
		me.Set2D(pos.x, pos.y);
	}

}

パズル「まっすぐ勇者」をリリースしました。

9作目のアプリ、
パズル「まっすぐ勇者」
をリリースしました。


前回のアプリに引き続き、
ドット絵&Magical 8bit Plugで
ファミコンテイストなゲームになっています。


画面イメージはRPGですが、
パネルや洞窟を使って勇者をお城まで誘導するという
パズルゲームです。


ダウンロードはこちらから
https://play.google.com/store/apps/details?id=jp.co.icoc.prj009


ゲームの詳しい説明は、公式サイトの説明をご覧ください。
http://apps.icoc.co.jp/jp/?p=360




パズル「まっすぐ勇者」 - YouTube

Unite 2014 タイムテーブル別記事 まとめ (2日目)

Unite2014タイムテーブル別の記事まとめ、2日目です。


1日目はこちらから

全体

2日目に関わる全体情報です。
Unite全体の情報は、1日目の全体欄を参照して下さい。

14:00

Room1:Unity2D のよくある問題とその解決方法
Room2:Unity ゲーム開発への Visual Studio 導入

17:00

Room1:Unity Test Tools
Room2:Unity × Photon ネットワークエンジンの最新事例と簡単なゲーム作成デモ
Room3:広告プロモーションを変える Unity クリエイティブ

18:00

Room1:Unityエバンジェリストが提案する効果的なUnity新人教育メソッド
Room2:Editor 拡張マニアクス 2014
Room3A:円筒スクリーンを撮影する実写カメラにセンサーを設置してモデルを実写カメラに追従させる

Unite 2014 タイムテーブル別記事 まとめ (1日目)

Unite2014に参加したのですが、興味がある講演の時間が重なってたりして
見れないものもあったので、タイムテーブル別に記事をまとめました。

このページは1日目についてまとめています。
2日目はこちらをどうぞ


まだ、記事を見つけれてない講演もあるので、
もし見かけられたらコメントやtwtterでリプしていただければ
追加したいと思いますので、よろしくお願いします。



14:00

Room1:Unity 5.0 アセットパイプライン/アセットバンドル
Room2:マーカーレスフェイシャルキャプチャ Dynamixyz Performer
Room3:Asset Store マニアクス 2014

5日間連続リリース、まとめ。

さて、先週は5日間連続アプリリースという
ちょっと無謀な挑戦を試みてみました。

ちなみに、無謀すぎて、終了後に風邪で倒れてました(^^;


今日ようやく体調も復活してきたので、
5日分のアプリをまとめたいと思います。


また、制作するにあたってのルールなどは下記を参照下さい。
今日から5日連続でAndroidアプリをリリースします - Unityゲーム開発日記@長崎

■まとめ動画



■1日目「GRAVITY USER」(ジャンル:スポーツ?)

まずは一作目、シンプルなゲームを作ってみようということで、
アタリの「PONG」のような、テニスゲームっぽいの目指してみました。

f:id:icoc_dev:20140317233033p:plain

結果的には、CPUの挙動を短時間で考えれる自信がなかったので、
壁打ち系にして、操作にブラックホールという概念を加える事で
特別な雰囲気を出してみました。


ゲーム自体はシンプルなんですが、
タイトルやランキング画面を準備したりして
結構大変ではありました。


操作系に関してはかなり珍しい仕組みになったので、
普通のブロック崩しなどに応用しても面白くなりそうな気はします。


5日間連続リリース、1日目「GRAVITY USER」をリリースしました!! - Unityゲーム開発日記@長崎



■ 2日目「Aggression」(ジャンル:シューティング)

2作目はシューティングに挑戦してみました。
といっても、当初はインベーダーゲームみたいなものを予定していたんですが、
物理的な要素を加えていったらむしろ弾幕ゲーのほうが作りやすかったってことで、
なぜか弾幕ゲー(しかも、自分が弾幕を発生させる側!!)になってしまいました。

f:id:icoc_dev:20140319003343p:plain

普通に考えたら、インベーダーより弾幕のほうが簡単に作れるとは考えにくいんですが、
物理演算機能が標準で搭載されているUnityならではの方向性かなぁと思います。


ちなみに、いままで自分がやったスマフォシューティングについては、
いまいち操作方法がしっくり来るものがなく、今回は自機を動かすという動作を捨てて
照準を操作するという視点にしてみたところ、個人的には結構面白い動きになったかなと
思っています。


また、いままでAssetStoreはスクリプト類しか利用したことがなかったんですが、
短期間でアプリを制作されてるサイトではたいてい、AssetStoreの素晴らしさを
語られてることが多かったので、自分も例に習いAssetStoreの素材を利用してみることにしました。


おかげさまで、一日でのリリースにもかかわらず
今までリリースしたアプリの中で一番リッチな感じに出来上がりました。


5日間連続リリース、2日目「Aggression」をリリースしました - Unityゲーム開発日記@長崎



■3日目「アルティメット・ダッシュ」(ジャンル:アクション?)

3作目は、スマフォで登場したニュージャンル「ラン系」に挑戦!!
のつもりでしたが、人物を動かす仕組みの理解にハマってしまって
ゲームデザインのための時間がほとんど取れなく、
ただ走るだけのマラソンゲームとなってしまいましたorz



f:id:icoc_dev:20140320013117j:plain


でも、ここでキャラクターを動かしたり3D的な表現も若干学べ、
以後の2作につながる基礎勉強はできたかなと思います。


5日間連続リリース、3日目「アルティメットダッシュ」をリリースしました - Unityゲーム開発日記@長崎



■4日目「King of vehicles」(ジャンル:レース?)

4作目、前日に人間の動きを勉強したので、今度は車の動きだ!
と思い、レース系のゲームにしました。


しかし、やはり人の動き同様なかなか簡単には車の表現ができず、
走ってると、空を飛んでしまったりだとか色々問題が発生しました。


最終的には、ある程度動きが落ち着いてきたのですが、
その頃にはもう時間もかなり過ぎていて、タイトルが示すように
色んな乗り物の合戦!とは行かず、車だけのぶつかり合いになってしまいました。


f:id:icoc_dev:20140321051901p:plain


ただし、このゲームではterrainという地形生成のシステムも導入し
マップの生成などにも挑戦でき、かなり色々なことが勉強出来ました。


5日間連続リリース、4日目「King of vehicles」をリリースしました - Unityゲーム開発日記@長崎



■ 5日目「Whole new world」(ジャンル:RPG?)

公開を停止しました。(5/7)



■まとめ

以上、5日分のアプリを並べてみましたが、
5作目が大変すぎて、思い出はほとんどそこしか残ってない状態です(^^;
でも、一日でもRPGの基礎的な要素は作れるという可能性が示せたので、
今後の製作の大きな指針が一つ出来たかなと思います。


また、AssetStoreや、mecanimでのアニメーション、車の挙動、
terrainによるマップの生成など、今後の色んなゲームに応用できる技術も
多く学ぶ事ができたので、やったかいはあったかなと思ってます。


特に、この過程を公開することで思ったことが、直前のアプリと違うものを作らないといけない
というプレッシャーです(^^;
これのお陰で、ジャンルだけ見れば結構バラエティに富んだかなと思います。
また、短時間で作ると、自分自身でも前日までに作ったのと似てる方向には
なるべく寄せたくないな〜って思いが働くので、短期間でアプリを量産して、
かつそれを公開するというのは結構重要なのかなと思いました。




それでは、今後も引き続きアプリをどんどんリリースしていきたいと思いますので
よろしくお願いしますm(_ _)m

5日間連続リリース、4日目「King of vehicles」をリリースしました

なんとか、24時間以内にリリース完了!!


King of vehicles
icocApps
価格:0  平均評価:0.0(0 件)



今回は、レース系にしようとは決めてたんですが、
車の挙動がうまく作れず、走れせることもなかなかうまく行きませんでした。


最終的に、車の浮遊感がちょっと強すぎる状態ではあるんですが、
とりあえず、ひっくり返っても起き上がれるように、
車上部に丸いコリジョンつけたりして、なんとか走り続けれるようには
なりました。



タイトルの通り、ホントはもっと色んな乗り物も出したかったんですが、
残念ながらモデル一種類の色違いのみとなりました。


f:id:icoc_dev:20140321051831p:plain


カメラも2つ使って、レーダー的なものも用意して
ちょっとそれっぽい画面にはなったかなと思います。


画面操作に関しても、やはり例によっての自機自動走行で、
操作するのはハンドリングのみとなってます。


f:id:icoc_dev:20140321051901p:plain


また、敵の動きについては、数秒おきにハンドリングを
ランダムで決めてるだけなんですが、
なんとなくそれらしい動きにはなってる気はします。


前回は見た目3Dだけど、一直線しか動けませんでしたが、
今回は縦横無尽に走り回れます!!


いままで3Dのデモとかは作ったことあったけど、
3Dゲームを完成させたのは初めてかも。


f:id:icoc_dev:20140321051923p:plain


一日ながらに色々と勉強をさせていただいたアプリになりました。


そして、いよいよ明日(いや、今日(^^;)は最終日!
当初の目標通り、RPGを作ろうと思ってるんですが、
はたして一日でどこまで作れるのか!?


■設計書

今回の設計書です。

最初は、沢山の乗り物が出てきて、
島の中でそれぞれの乗り物がぶつかり合い、
敵を島から押しだしつつ、最後まで生き残れれば
クリアという仕様で考えてました。

ただ、今回地形生成にTerrainというUnity標準の地形生成ツールを使ったんですが、
それだと思いのほか広いマップが生成できて、
これだとちょっと、適当に走らせてただけではぶつかりにくくなるな、ということで
単に自分から敵を狙っていくだけの仕様に変更しました。

f:id:icoc_dev:20140321111028j:plain

5日間連続リリース、3日目「アルティメットダッシュ」をリリースしました

例によって、日替わり投稿です。

今回は、スマフォに特化したアクションゲームとして流行している
「ラン系」ゲームを作ってみることしました。


アルティメット ダッシュ
icocApps
価格:0  平均評価:0.0(0 件)


ラン系にはLINEのウィンドランナーに代表される2D系と
TempleRunのような3D系がありますが、
今回は、2.5D系?になりました。
では動画をどうぞ。


…すみません、すみません、すみません(- -;
ラン系ってか、ただ走ってるだけのゲーム(?)です…


f:id:icoc_dev:20140320013109j:plain

今回はMecanimを使ってみようと意気込んでは見たものの、
なかなか使い方が理解できずに、時間ばかりが過ぎてゆき、
定時になってもまだコードが一行も書けてないという状態で
とにかく、なにか形にせねばと焦って作った結果がこれでした。

f:id:icoc_dev:20140320013117j:plain

走った時の効果音も入れ方がわからなかった。。。


まだいまいちmecanimの効率よい使い方が理解できてないですが、
最終日の金曜までにちょっとは使えるようになるかなぁ…
と甘い期待を抱きつつ、明日のネタを考える時間もないまま今日は終わります。


明日はもう少し遊べるもの作らないと…



■追記
設計書です。
まったく設計の内容が反映されてないですね(--;

f:id:icoc_dev:20140320091444j:plain

5日間連続リリース、2日目「Aggression」をリリースしました

昨日に引き続き、今日も日が変わってからの投稿ですみませんm(_ _)m


でも、8時から製作開始なので、製作開始から24時間以内にはリリースしてるんです。
許してください(T T)



侵略者
icocApps
価格:0  平均評価:0.0(0 件)


ってなわけで、今回は何をつくろうかなぁと午前中悩んでたのですが、
前回はPONGのオマージュ的な作品だったので、
今回も歴史的なゲームにあやかりたいと思い、
インベーダー的なものを作ってみようかなぁっと思いました。


そして、製作を進めていった結果がこれです。



…なんか弾幕風ゲームになってしまいました(^^;


f:id:icoc_dev:20140319003343p:plain


せっかくなので、なんかオリジナル要素を入れれないかなぁと
作りながら考えてたら、やはりUnityの物理機能にたどり着き、
敵を破壊するのではなく、敵を画面外に追いやるという、
いままでのシューティングゲームらしからぬ仕様となりました。


また、自機も同様に画面外に出た時がゲームオーバーです。


あと、タッチインターフェースでの課題である自機の動作と
弾の発射についてですが、
自機の動作を前日と同じく諦めて、
弾の照準をタッチで操作するというインターフェースにしました。


そうしたことで、好きなところに弾が打て
まるで弾幕ゲームのボスになったような気分を味わえるゲームになりましたw



今回はアセットストアのフリー素材やWEB上のフリーの音楽、画像素材
も利用させていただいたおかげで、結構リッチな感じに仕上がりました。


ここまできたら、スコアが残せないのもなんだかなぁと思って、
タイトルとスコアを付け足してたら、タイムオーバーとなってしまいました。。


f:id:icoc_dev:20140319003441p:plain


見た目だけで言えば今までリリースした中で一番派手かもw



期間が一日ということで、敵との駆け引き部分まではあまり作り込めてないですが、
システム的には面白いものになったなぁと思うので、
今後、もっと時間をかけて作り上げてもいいかなぁと思ってます。


といったわけで、二日目はシューティングに挑戦してみました。
明日のネタどうしよう…orz




■追記
ほとんど書いてないので上げても意味ないかなと思ったけど、
一応記録的な意味合いとして設計書もアップしておきます。


AssctStoreを使っての作業が初めてだったので、
何ができるのかがわからず、うまく設計ができませんでした。
なので、ダウンロードしたAssetの素材の印象から
構築していった感じになってます。

f:id:icoc_dev:20140319085221j:plain

5日間連続リリース、1日目「GRAVITY USER」をリリースしました!!

五日間連続アプリリース第一日目!!


GRAVITY USERをリリースしました!!

GRAVITY USER
icocApps
価格:0  平均評価:0.0(0 件)


ということで、気合入れて作り始めたら、
後半全然時間が足りなくなってきました(^^;

f:id:icoc_dev:20140317233023p:plain


とりあえずは最初ということで、ゲーム黎明期における
アタリの大ヒット作品、「PONG」っぽいのを作りたいなぁと思いました。


ちなみに、PONGとはこんなゲーム
http://www.youtube.com/watch?v=SHsYjWm8XSI


ただ、打ち合いだとコンピュータのアルゴリズムを考えるのが
大変そうだったのと、ある程度のオリジナリティを出したかった
というので、ちょっと視点を変えて作ってみました。


ってことで、ゲーム画面。

f:id:icoc_dev:20140317233033p:plain


ぱっと見ブロック崩し的な感じですが、
ラリーを続けた回数が得点になる
壁打ちテニス的なゲームです。


自機の後に上部の壁へボールがぶつかると、1点入ります。


そして、このゲームの一番の特徴は、
操作するのが下のバーじゃないってことです。


ゲームのタイトルにもなってるGravity、
つまり重力を変化させるブラックホールを操り、
ボールを吸い寄せてうまくバーの位置にボールが行くように誘導していきます。


ブラックホールはタッチしたところに登場します。
画面の黒いところでならどこでもブラックホールを出現させることができ、
出現するだけでボールの移動に大きな影響を与えます。


また、ブラックホールなので、ボールが近づきすぎると
ボールが吸い込まれてゲームオーバーというリスクも存在します。


物理演算が得意なUnityっぽくてよいかなぁと思ったのと、
HEROSに登場するブラックホールを操る能力を持つ人物が
すごく好きなので、こんなかんじになりました(^^;



後は、ゲームの体をなす形で、
タイトル画面、ランキング画面もいれてます。
ランキングはセーブもされます。

f:id:icoc_dev:20140317233939p:plain



と言った感じで、一日目の作業完了ですが、
すでにヘトヘト(--;


明日からのアイデアもまだ浮かんでないし、
はたして5日間作り続けれるのだろうか…


あと、今回はタイトルとランキングを入れましたが、
ゲームの本質とは関係ないところではあるし、
もっとゲーム自体の面白みに時間をかけたほうが良いかなと思うので、
明日の分からはタイトルとランキング等は時間があれば
と言った対応にしていこうかと思います。



最後に、参考資料として、午前中に作成した詳細設計(?)の画像もアップしておきます。

f:id:icoc_dev:20140318012950j:plain
f:id:icoc_dev:20140318012951j:plain



それでは、みなさんまた明日(^^)/

今日から5日連続でAndroidアプリをリリースします

以前、ui_nyanさんという方が、Unityを利用して、7日間連続でゲームを
製作されるという試みをされていました。


【Unity】素人が7日間クソゲーを作り続けてわかったこと – uinyan. com


それに触発されて、
今週は、5日間連続アプリリリースに挑戦してみようと思います。


個人的には、一日にどれくらいの規模のアプリが作れるのかという興味と
Unityの底力を改めて感じたいと思っての企画でもあります。


ただ、まったく0からリリースアプリを作るのはさすがに時間が足りないと思うので、
以下の様なルールで進めていく予定です。

  • 開発環境にはUnityを利用
  • 過去にリリースした作品で構築した共通ライブラリを使用
  • フリー素材、AssetStoreは使用可
  • 過去作品で使いまわせそうな素材は利用する
  • 詳細設計から開始(事前に、頭の中での簡単な設計等はやってる場合もあり)
  • 対象はAndroidアプリ(後日iPhoneでもリリース予定)


こんなところです。
なので、まず頭にあるアイデアを、プログラムに落とし込めるまでの
詳細設計を行い、その後開発→リリースと言う流れで進めたいと思います。


最終目標は1画面RPGを目指してますが、どこまで出来るもんかな…



それでは、今からはじめま〜す(^^)/

配列(コレクション)初期化の記述

書き方をよく忘れるのでメモ。
C# 3.0から、ListやDictionaryの初期代入を比較的簡単に記述できるようになっています。


■List
var list = new List<string>(){
	"test0",
	"test1",
	"test2",
	"test3",
};
■Dictionary
var dic = new Dictionary<string, string>(){
	{"test0", "message0"},
	{"test1", "message1"},
	{"test2", "message2"},
	{"test3", "message3"},
};


単純な配列などは以下のとおり

var strList = string[]{
	"test0",
	"test1",
	"test2",
	"test3",
};

Androidで多言語対応する場合のフォルダとファイルの設置箇所

Androidで多言語に対応する場合、
たとえば、メイン言語が英語で、日本語のアプリ名を付けたいといった場合は


Assets/Plugins/Android/res/values-ja


というフォルダをUnityのプロジェクト内に作って
values-ja
内に、
strings.xml
というxmlファイルを作成してxml内でアプリ名を再定義すれば良い。



どうも、Plugins/Android以下のフォルダがそのまま
Androidのプロジェクトに追加される仕様の様子。


xmlの書き方はこちらのサイトで紹介されていました。
Androidアプリのローカライズ方法 - Conyac

MonoDevelop 4.0.1のドキュメントフォーマットでタブ幅が正しく設定されない時の対処

MonoDevelop 4.0.1にて
タブ幅をで「4」に設定してるのに、
ドキュメントのフォーマットをした時にタブ幅が「8」になる現象があった。

以下サイトによると、プロジェクト毎の別のプロパティ値を持ってるらしい。

Set Default MonoDevelop Formatting Options - Unity Answers


ソリューションオプションを開いたらこちらのタブ幅が「8」になっていたので、
ここを「4」修正したら、正常にタブ幅が調整されるようになった。

各コマンドのメニュー階層

■タブ幅の設定
Preferences > ソースコード > コードフォーマッティング > Text file

■ドキュメントのフォーマット
編集 > フォーマット > ドキュメントをフォーマット

■ソリューションオプション
プロジェクト > ソリューション オプション

健忘録 Androidプラグインを作るまでの流れ

Eclipseの設定をして、
JARファイルを書き出すまでの流れについて
参考にさせていただいたサイト。


Android SDKEclipseの設定
MacでAndroid開発環境を手早く整える - appfountain's blog



■WindowメニューにAndroidSDK / AVD Managerを追加
Eclipse の Window メニューに Android SDK / AVD Manager が表示されない時 | DeVlog - 銀の翼で翔べ -



■Plugin (JARファイル)を作成するまでの流れ
Unity3D - Androidネイティブ開発のすすめ - Qiita [キータ]



※上記だとプロジェクトがまるまるJARになってファイルがでかくなるので
jar出力は下記サイトを参照(javaファイル→Export)


javaファイルの出力 & UnityのmacでのJARファイルの場所
Eclipse 上で Unity Plugin を作成する (1.4 以降) - Smartphone App - Mobage Developers Documentation Center


※Unity.app内をEclipseから直接参照する方法がわからなかったので、
とりあえず、Finderでブラウズして、classes.jarファイルを別の場所にコピーして
それを参照する形にした。