TKSPのUnity関連ブログ

Unityに関することで書きたいことを書く.

Unityでハッピーバレンタインなスクリーンショット作る.




この間このようなツイートを見かけまして,これは麻雀大会のスクショを撮るしかないなと思い,現在作っていたゲームを使ってスクショを撮ることにしました.



現在作っていたゲームの一部.これを活用してスクショを作る.

こちらには下記のアセット等を使用しています.





© UTJ/UCL


麻雀牌アセットをスクショのために購入します.

麻雀牌とダイスの3Dモデルが入っているアセット.麻雀のプレイマットや点棒は入っていなかったよ.


部屋には次のアセットを使用します.


さて,まず麻雀のマットをPlaneとCubeで作ります.
そしたら牌を配置します(手動)
ユニティちゃんを4体配置して,表情を変更します.スタート時に指定したアニメーションを指定した時間で停止するスクリプトを書き,キャラメイクしたのをロードする関数を少し改造して,0.3秒後にScreenCapture.CaptureScreenshotを実行してスクショを撮ります.

完成!

f:id:ymtkyorosiku:20180202155838g:plain
f:id:ymtkyorosiku:20180202155841g:plain

1週間1人で広大なフィールドのRPG風ゲームを作った話(長い)

有料アセットが充実してきたので,長らく敬遠してきたRPGゲームに取り組んでみようと思いました.

f:id:ymtkyorosiku:20171129162040g:plain
© UTJ/UCL

今回はいつも作るような小規模なパズルゲームと違って,広大なエリアを走り回るようなゲームを作ってみました!
途中,これ本当にWebGLで動くのか?となりましたが,案外なんとかなりました.

では,まずはじめにこちらの有料アセットのサンプルシーンを読み込んで動かしてみます.

アニメーションの詰め合わせなのですがサンプルシーンもよくできていて,武器を変えたり,泳いだりすることができます.

しかしながらボタンの連続入力に弱いといった欠陥もありました.
(Unity ver 5.6.3p4,asset download 2017/11/26)

例えば,武器を連続で変えようとすると,前の武器が手元に残ったり,ジャンプを連続ですると,三回くらい飛べてしまったり,水の中から勢いよく飛び出すと,その勢いが空中でもそのまま適用されて,すごく高くまで飛ぶので不自然です(魚か!)

まぁここら辺は「連続入力時に一定時間同じ処理はできない」

//実行して良いか
bool cando=true;
//連続入力を受け付けない時間
float waittime=0.5f;
//何かで呼ばれる(キーが押された時など)
void ホニャホニャ() {
       if(cando){
       cando=false;
       //ジャンプするなどの処理
      ほにゃらら();
      StartCoroutine(wait(wartime));
     }
}
IEnumerator wait(float waiting){
	yield return new WaitForSeconds (waiting);
	cando = true;
}

みたいなことを施したりすればいいのではないでしょうか.

ではデフォルトのキャラクターをUnityちゃんに入れ替えます!
普通に,デフォルトのキャラクターをUnityちゃんのモデルに入れ替えてアニメーションコントローラーと,コンポーネントを同じように設定し,武器などを左手や右手のボーンの階層に移動させるだけです.

デフォルトの武器類を他のモデルに入れ替えます.今回は両手持ちの大剣のみ入れ替えました.モデルはこちらのアセットを使用しております.

ファンタジー系の内装を作るためのモデルが詰まったアセットですが,ポリゴン数削減のため,今回は剣のモデルのみの採用です.
Before 
f:id:ymtkyorosiku:20171129232738p:plain
After
f:id:ymtkyorosiku:20171129232751p:plain

次にこちらのアセットのサンプルシーンを読み込んでみます.

こちらは魔法のエフェクトの詰め合わせです.
先ほどのアニメーションの中に魔法を詠唱するアニメーションが入っていたので,詠唱後,何秒か後にprefab生成すれば魔法が使えるようになります.

プレイヤーの武器や魔法に当たり判定を追加します.効果処理は敵を作ってから考えましょう.


次にこちらのアセットをみてみます.

壁を破壊する機能が欲しくて購入を決めたのですが,如何せんサンプルシーンだけだと使い方がすぐには分からなかったです.
しかし,スクリプトから分割したオブジェクトを生成できるエディタ拡張のようでした.

まず空のオブジェクトにFracturedObjectコンポーネントをアタッチします.
そのあとパラメータを設定します.

壊したいオブジェクトを選択
f:id:ymtkyorosiku:20171128185349p:plain
とりあえずパーツがくっ付きそうな値を無限
f:id:ymtkyorosiku:20171128185355p:plain
あとは壊せるオブジェクト(今回は斧)が当たったらFracturedObjectからExplodeを呼び出す感じで.

//rcはRPGCharacterControllerコンポーネント,左の装備が3なら斧
void OnTriggerEnter(Collider col) {
         if(col.gameObject.tag == "BreakObject"&&rc.leftWeapon==3){
		if (wm.isAttack&&null!=col.gameObject.GetComponentInParent<FracturedObject> ()) {
			col.gameObject.GetComponentInParent<FracturedObject> ().Explode (gameObject.transform.position, 10);
		}
	}
}

壊れた際に崩れたところに張るテクスチャを設定していなかったり,オブジェクトを選択していなかったりすると,生成中にUnityが落ちてしまうので注意!(Unity ver 5.6.3p4,asset download 2017/11/26)

これでオブジェクトが破壊できるようになりました.
f:id:ymtkyorosiku:20171129161142g:plain
あとはプレイヤーにHPなどを設定し,表示します.表示の際にこちらのアセットを使用しました.

追記:ハートマークのテクスチャはこちらのアセットから使用していました.

このような感じになります.
f:id:ymtkyorosiku:20171201011810p:plain


プレイヤーが完成したら,こちらのスライムを使って敵を作成します.

そしたら,こちらのアセットを使ってステージを作成します.今回はWebGL出力のため
処理が軽くなるモデルを使用します.
2017/12/9まで半額だとぉ!半額開始の直前に買ってしまいましたw

そして,このアセットに入っている海の表面がデコボコしていてなんか嫌だったので,こちらのサンプルシーンの海面に切り替えます.

サンプルシーンのものそのまま移植したものをツイートしたら海面の色が濃いと指摘されたので色調を修正しました.


このような感じで.
海面
f:id:ymtkyorosiku:20171201011922p:plain
海中
f:id:ymtkyorosiku:20171201011949p:plain

スカイボックスを設定します.今回はステージを3つ作ったので,これまでにインポートしていた中に入っていたスカイボックスと
下記の二つを使用しました.
ステージ2のスカイボックス

ステージ3のスカイボックス

次に保存機能を作ります.保存にはこちらのアセットを使用します.
Transformも保存できるので,敵のHP情報や自分の位置などを保存する機能を作成します.

とても使いやすいのでオススメです.保存機能自作する場合プラットフォーム切り替えたら動かなかったりするしね.
今まで面倒だけど自作していましたが,これがあればもう安心です.

タイトル画面を作成します.
テンプレートをインポートし,プレハブを配置して,LoadGameボタンを追加します.このテンプレートには音量調整機能も付いているのでオススメです!

iTweenで動きをつけます.Twitterなどでよく目にするため,初めて利用してみたのですが,とても使いやすかったです.

そしたら画像のようになるので,音楽設定などを施し,UIのテクスチャを変更していきます.
f:id:ymtkyorosiku:20171129160337p:plain

使用したスカイボックスはこちらになります.

カメラを2つ使用し,スカイボックスでアセットの中に入っていた適当な画像と組み合わせました.

ボタンにはファンタジー風のこちらのアイコンを使用しました.

タイトルが完成したら,Unityちゃんのジャンプ音などを設定します.SEにはこちらを使わせていただきました.

武器のSEを設定します.こちらを使用しました.

BGMを設定します.こちらを使用しました.

隠し要素としてモブキャラを追加します.今回はただの飾りです.せっかく購入したので.敵のAIを超簡略化して,ただ移動するだけのスクリプトを作りアタッチします.


解き放て!
f:id:ymtkyorosiku:20171130014613g:plain

さて,最後に,終了処理を作成していきます.これは簡単で,HPが0になったらゲームオーバー.スライムを300体倒したらゲームクリアです!
曲はいつもの魔王魂様からお借りしております.

とりあえず定番の回復アイテムを導入.一回のみ使える回復アイテムをあちこちに配置します.保存機構がめちゃくちゃだよぉ.バグが出ないことを祈る.
アイテムのモデルは次のものを使用.

ここまできたらもう一度保存機構を見直しします.連続タッチでの再読み込みを防いだり,保存されているか確認したり,GL出力して動くことを確認したりですね.


さて,今回も約1週間ほどかけてゲームを作りましたが,予想よりも大規模なゲームとなりました.有料アセットを使用したおかげでそこそこのゲームになったのではないかなと思います.そして何より,作っていてとても楽しかった!アセットの使い方の勉強にもなりました.

そして,このくらいの規模だとオブジェクトの管理がとても大変になりました.そのため,管理をするためにこちらのエディタを導入しています.

今回はシーンを4つも使用しているのと,アセットを入れすぎた結果,中身が多すぎてめちゃくちゃになってしまったので,複数のエディタ拡張を用いて自分が分かりやすいようにしました.

まず,過去に開いたシーンをすぐに開くことのできるこちらを導入します.
保存機能の確認のためなどにシーンを行ったり来たりでしたので結構助かりました.

また,オブジェクト管理をするためにオブジェクトに付箋を貼り付けることができるアセットと

お気に入り登録をできるようになるアセットを導入して,大事なオブジェクトをすぐ発見できるようにしました.

そして,こんだけ大量にアセットがあると移動の際にミスってしまうのでカットアンドペーストができるようになるエディタ拡張も導入します.

プレイヤーのコンポーネントがずれていて整理がしたい場合などに入れ替えが楽になるアセットも導入して使っています.今回は1つのオブジェクトにコンポーネントが10個とかざらにあります.

コンポーネントと同じく,今度は配列の場所を入れ替えたいときにはこちらの並べ替えアセットが役に立ちます.

さて,保存関係がめちゃくちゃになってしまうのでタイトルに戻るが今回は使えなくなりました.(ベット処理作るのが面倒だったため)
そのためApplication.Quit()試してみたのですが,こちらはうまく動きませんでした.しかし,調べてみたらApplication.OpenURL("about:blank");という関数を発見しました.こちらはWebGLで使用すると,呼ばれたタイミングでゲーム画面を真っ白にして強制終了することができるようになります.しかし,URLの移動はないので,自分でリロードをするように促す何かが必要かもしれません.


さて,長くなりましたが,今回はRPG風ゲームをWebGLで作ることに挑戦しました!

やってみると色々と処理することが多く,わずか1週間ではかなりきつかったという印象です.
しかし予想よりも大規模なゲームになってしまい,自分でも驚いています.

今回は学校の授業が休みの日があったため,捗りました.
深夜までTwitterに進捗あげてるのがその証拠.

初めて使うアセットが大量にあり,仕様変更や,使い方の勉強など,するべきことは沢山ありましたが有料アセットの力を実感しました.

一番衝撃だったのはエディタ拡張でしたね.フリーのものでも,なんで今まで使っていなかったんだろうといった感じでした.

そして,RPG Character Mecanim というじゃじゃ馬がいましたが,こちらもスクリプトを改変して,思った通りに動いてくれたらつい楽しくなって徹夜してしまいました.

反省点として,マップが広すぎて前に進んでいるのに進んでいる感覚になれなかったり,暇な時間が長くなってしまったことですね.なんか乗り物や,ワープの魔法などを作った方がいいような気がしました.

また,敵の種類を増やしたり,行動パターンを追加したり,数を増やしたりイベントを追加したり(街に入ると音楽が変わる等)と凝ろうと思えばどこまでもできてしまいそうで終わりが見えなくなったので,とりあえず一区切りついたこの状態で投稿しました.(もともと有料アセットの使い方を習うために作ったので)
SEやボイスを追加したりスライム全部倒したらボスを出現させたり,色々とやりたいことが多すぎます.


最後に,一番見て欲しいのは雷魔法や氷魔法かもしれません.
狙った通りにスライムに当てるのが楽しいです.
f:id:ymtkyorosiku:20171130020145g:plain

スライムハンティング! | 無料ゲーム投稿サイト unityroom - Unityのゲームをアップロードして公開しよう

UnityRoomで公開しているので是非遊んでみてください!

道路の自動生成

ちょっと描きたくなったのでメモ

実は第六回のゲームジャムに向けて裏でフライングスタートしていたのですが,お題が「スペース」だったので没になったものをせっかくなので公開しちゃいます.

道路を自動生成するというだけですが発展させれば街の自動生成ができちゃうかもですね.まさかお題がスペースになるとは思いもしなかったよ.

道路の自動生成について解説していきます.


f:id:ymtkyorosiku:20171123143129g:plain

© UTJ/UCL


一番最後に完成形のスクリプトを置いておくのでコピペするなりして照らし合わせてください.

もっと簡単な書き方,効率の良い書き方があると思いますが,学生が考えるコードなんで大目に見てくださいww

まず,こちらにいいアセットがあるのでダウンロードしてきます.

このアセットには道路がパーツごとに分かれて入っているのでprefabから連続で生成することにより繋がる道をランダムで自動生成することなどが可能になります.

 

アセットの中に入っている道路のうち今回使うのはこちらの3つになります.これを使って配列で道路を自動生成していきます.

 
f:id:ymtkyorosiku:20171123103259p:plain
 

 ではスクリプトをゴリゴリ書いていきます.

まず,考え方として

width,heightの箱を用意します.

そこに1~10の番号を割り振ります.

番号に応じた道路を生成します.

図で書くとこのような感じです.
f:id:ymtkyorosiku:20171123121327p:plain
まず変数の宣言から

        //roadのプレハブ
	public GameObject road;
	public GameObject road_intersection_L;
	public GameObject road_intersection_T;
	//床
	public GameObject plane;
	//道路を管理するためのクラス
	public class ArrayController
	{
		public int type = 0;
		public bool sub = false;
		//0:未決定,1:結合あり,2結合なし
		public int left = 0;
		public int right = 0;
		public int up = 0;
		public int down = 0;
	}
	//上記のクラスを配列で用意	
	public ArrayController[,] array;
	//自動生成する幅と高さ
	public int width;
	public int height;

ArrayControllerでは全ての配列の箱分用意してそこにあると仮定したオブジェクトの状態を管理します.
例えば次の図のように1がある場合はそこと結合する道路を必ず生成しなければなりません.
生成することが確定した場合subをtrueに,生成しない場合はfalseにしておけばあとで確認して別のオブジェクト(建物など)を置くことができます.
typeは先ほど解説した1~10の数値が入ります.

次に配列を定義して,左上,左下,右上,右下の角の道路を指定します.

void CreateCity ()
	{
		//配列
		array = new ArrayController[width, height];
		//床の大きさを幅,高さに応じて変更
		plane.transform.localScale = new Vector3 (width / 2, 1, height / 2);
		plane.transform.position = new Vector3 (width, 0.02f, height);
		plane.GetComponent<Renderer> ().material.color = Color.white;
		//配列の中身初期化
		for (int i = 1; i < width - 1; i++) {
			for (int j = 1; j < height - 1; j++) {
				array [i, j] = new ArrayController (){ type = 0, sub = false };
			}
		}
		//円周
		//左上の角は右と下をつなぐ曲線
		array [0, 0] = new ArrayController (){ type= 1 };
		//左下の角は右と上をつなぐ曲線
		array [0, height - 1] = new ArrayController (){type = 2 };
		//右上の角は左と下をつなぐ曲線
		array [width - 1, 0] = new ArrayController (){ type = 3 };
		//右下の角は左と上をつなぐ曲線
		array [width - 1, height - 1] = new ArrayController (){ type = 4 };


これで次の図のような道路が生成されたと仮定されました.
f:id:ymtkyorosiku:20171123121437p:plain

次に辺を埋めていきます.
分岐点がある場合,その方向に1進んだ道路は必ず結合しなければなりません.なので,それぞれの向きにあった変数に1を代入します.また,分岐点がないただの直線の場合は必ず結合してはならないのでそれぞれの向きにあった変数に2を代入します.

                //一時的な数値格納
		int temp;
		for (int j = 1; j < height - 1; j++) {
                        //左端から1右に進んだところで左に結合するなら1,しないなら2を代入
			if (Random.Range (0, 2) == 0) {
          //tempはtypeに代入される.typeは上の図のように道路の形を表している.
				temp = 5;
				array [1, j].left = 2;
			} else {
				temp = 9;
				array [1, j].left = 1;
			}
                        ////左端の定義
			array [0, j] = new ArrayController (){ type = temp, sub = true };
			//右端
			if (Random.Range (0, 2) == 0) {
				temp = 5;
				array [width - 2, j].right = 2;
			} else {
				temp = 7;
				array [width - 2, j].right = 1;
			}
			array [width - 1, j] = new ArrayController (){ type = temp, sub = true };
		}
		for (int i = 1; i < width - 1; i++) {
			//上端
			if (Random.Range (0, 2) == 0) {
				temp = 6;
				array [i, 1].up = 2;
			} else {
				temp = 10;
				array [i, 1].up = 1;
			}
			array [i, 0] = new ArrayController (){ type = temp, sub = true };
			//下端
			if (Random.Range (0, 2) == 0) {
				temp = 6;
				array [i, height - 2].down = 2;
			} else {
				temp = 8;
				array [i, height - 2].down = 1;
			}
			array [i, height - 1] = new ArrayController (){ type = temp, sub = true };
		}

これで道路で四角が作られます.
f:id:ymtkyorosiku:20171123121513p:plain

ここからは分岐の続くゴリ押しになります.左上から順に操作し,結合できる部分があればそこに結合するような道路を生成していきます.

f:id:ymtkyorosiku:20171123121533p:plain

重要なのは上が結合するのかしないのかと,左が結合するのかしないのかになります.最初の行(箱の配列)では右と下には何も定義していませんので.


ソース長いので割愛.中身は一番下に置いてあるスクリプトを参照してください.


最後に一番下の行(下端の辺)を一番下から1つ上の行を走査して,結合するような形に上書きします.

そしたら後は道路を生成するのみです.最初の図にある形に合うようにprefabを回転させながら生成していきます.

                //下の列を作る
		for (int i = 1; i < width - 1; i++) {
			if (array [i, height-1].up == 1 && array [i, height-2].sub) {
				temp = 8;
				array [i, height-2].down = 1;
			} else {
				temp = 6;
				array [i, height-2].down = 2;
			}
			array [i,height-1] = new ArrayController (){ type = temp, sub = true };
		}
                //作成
		GameObject tempobj;
		for (int j = 0; j < height; j++) {
			for (int i = 0; i < width; i++) {
				switch (array [i, j].type) {
				case 1://(下右)
					tempobj = Instantiate (road_intersection_L, new Vector3 (i * 2, 0, (height- j) * 2), Quaternion.Euler (new Vector3 (0, 180, 0)));
					tempobj.name = i + "," + j;
					break;
				case 2://(上右)
					tempobj = Instantiate (road_intersection_L, new Vector3 (i * 2, 0, (height- j) * 2), Quaternion.Euler (new Vector3 (0, 90, 0)));
					tempobj.name = i + "," + j;
					break;
				case 3://(下左)
					tempobj = Instantiate (road_intersection_L, new Vector3 (i * 2, 0, (height- j) * 2), Quaternion.Euler (new Vector3 (0, 270, 0)));
					tempobj.name = i + "," + j;
					break;
				case 4://(上左)
					tempobj = Instantiate (road_intersection_L, new Vector3 (i * 2, 0, (height- j) * 2), Quaternion.identity);
					tempobj.name = i + "," + j;
					break;
				case 5://(上下)
					tempobj = Instantiate (road, new Vector3 (i * 2, 0, (height- j) * 2), Quaternion.identity);
					tempobj.name = i + "," + j;
					break;
				case 6://(右左)
					tempobj = Instantiate (road, new Vector3 (i * 2, 0, (height- j) * 2), Quaternion.Euler (new Vector3 (0, 90, 0)));
					tempobj.name = i + "," + j;
					break;
				case 7://T(上左下)
					tempobj = Instantiate (road_intersection_T, new Vector3 (i * 2, 0, (height- j) * 2), Quaternion.identity);
					tempobj.name = i + "," + j;
					break;
				case 8://T(上左右)
					tempobj = Instantiate (road_intersection_T, new Vector3 (i * 2, 0, (height- j) * 2), Quaternion.Euler (new Vector3 (0, 90, 0)));
					tempobj.name = i + "," + j;
					break;
				case 9://T(右下上)
					tempobj = Instantiate (road_intersection_T, new Vector3 (i * 2, 0, (height- j) * 2), Quaternion.Euler (new Vector3 (0, 180, 0)));
					tempobj.name = i + "," + j;
					break;
				case 10://T(右左下)
					tempobj = Instantiate (road_intersection_T, new Vector3 (i * 2, 0, (height- j) * 2), Quaternion.Euler (new Vector3 (0, 270, 0)));
					tempobj.name = i + "," + j;
					break;
				case 11://ここから建物とか
					
					break;
				}
			}

後はシーンに空のオブジェクトとPlaneを作って,空のオブジェクトに下記のスクリプトをアタッチし,prefabに合う道路をAssetから,Planeに今作ったPlaneを指定し,width,heightを20くらいに設定すれば道路が自動生成されます.

これを使うとこのゲームのような感じでRボタンを押せば自動で道路が生成されます.

自動生成された道路に落ちてるものを1000枚集めるゲーム | 無料ゲーム投稿サイト unityroom - Unityのゲームをアップロードして公開しよう

こちらのゲームでは下記のアセットも使用しています.

  • BGM/SE



  • バイク

  • スカイボックス


  • 右下でプレイヤーを示すConeの生成

第六回ゲームジャムで作ったもの

 

第六回1WeekGameJamにて今回はアセットを大量に使ったゲームを作りました.

 

f:id:ymtkyorosiku:20171119151549p:plain

 

おなじみのユニティちゃんを使って障害物を避けながらゴールを目指していくものです.

© UTJ/UCL

 

スペースジャンプ | 無料ゲーム投稿サイト unityroom - Unityのゲームをアップロードして公開しよう

 

第一回,第二回のゲームジャムでは頭を使うパズルゲームを作ってきたのですが,ステージ数が多いのと,意外と難しいと言われてしまったので,今回は簡単にクリアできてリトライもすぐにできるようなものを作ろうと思いました.

 

いつものパズル性を持たせつつ,簡単で,リトライ性があるものを...

 

そこで,ユニティちゃん,ゆうこちゃん,みさきちゃんの3人を使って,よくあるジャンプゲームをそこそこ頭を使うパズルゲームに早変わりさせました!

 

誰かがリタイアするほどゴールが簡単になるジャンプゲームが完成です!

 

今回のテーマは「space」なので使うキーはスペースキーと矢印キーのみです.

なんか考えてることはみんな同じだったけど.

また,宇宙を表現するためにCubeを0.5~-0.5の範囲で上下に動かします.

 

今回はアセットストアのアセットを大量に(11個)使用しているため見栄えがいつもよりいいです.使用したアセットを紹介していきます.

 

ステージには木箱と岩にこちらのアセットを使用しています.

  •  Low Poly: Free Pack

ゴールの宇宙船にはこちらを使用し,

  •  Spaceship - Falcon 1874 XB

背景にはスカイボックスにこちらのアセットと

  •  Purple Space Nebula Skybox

星のパーティクルとしてこちらを使用しています.

  •  DL Fantasy RPG Effects

スコアの表示にこちらを使用し,

  •  Sprite Number Renderer

BGM,SEに以下の3つのアセットを使用しています.FREEだとゲームに合いそうなのも見つけるにも幅が小さかったのでゴール時のSEには魔王魂様のSEを使用しています.

  • 8-Bit ChipTrance Vol. 1 FREE

  • Free Sound FX

  • FREE Casual Game SFX Pack

アイテムにはこちらのアセットから,りんご,バナナ,ぶどう,ケーキ,ハンバーガーを使用しています.

  •  Adorable 3D Food Set

矢印やツイッターのアイコンはこちらから使用させていただいてます.

最後にランキングの装飾にこちらのテクスチャーを使用しています.ランキングは第二回の時に使用したものと同じもの(naichiさんのやつ)です.

  •  Basic UI Elements: Concrete

 

さて,アセットの紹介はここまでとして今回苦労したところをまとめておきます.

今回重要なポイントはジャンプの軌道でした.それ以外では接地判定を確実に取るためにRayを9本使ったりとかかな.

RigidBodyとAddforceを使ってしまうとどうしても位置がずれてしまい,パズルゲームなのに途中で落っこちてしまうためこちらは採用できませんでした.

なのでジャンプのタイミングでGravityをOFFにし,ジャンプの軌道にpositionを移動させて,最後に重力ONにして,マスの中心にpositionを移動させてバランスをとります.

そのせいで着地時にかくっとなってしまうのでもっといい方法を考えればよかったなと反省しています.

軌道の計算式は以下の画像のように求めます.

 

f:id:ymtkyorosiku:20171119150839p:plain

 

終了処理をパパッと作成し, ランキング,ツイッター機能をいつものように取り付けて完成です!あとは遊ぶだけ!

 

第二回ゲームジャムで作ったもの

第二回のお題は「転がる」でしたね.

 

作ったものはこれです.

ローリングパズル9×9 | 無料ゲーム投稿サイト unityroom - Unityのゲームをアップロードして公開しよう

 

さぁ何を転がせたらいいかな.

 

やっぱりUnityちゃんかなぁ.

 

ただ転がせるだけじゃつまらない.なら第一回の時みたいにステージがちゃっちゃっと作れるパズルゲーム風にしてしまおう.

 

まず9×9のゲームオブジェクトの配列を用意して,そのオブジェクトにアタッチしたスクリプトから何のマスなのかを判別しよう.

 

今回はこはくちゃんだけでなくみさきちゃんとゆうこちゃんも使おう!

 

せっかく配列を使っているんだから行列を生かせるパズルがいいなぁ.

 

そうだ!スイッチを押したらギミックを動かすようにしよう.

 

どんなギミックがいいのか...Unityちゃんが転がってくるから向きを変えたいよね.

 

よし,true,falseで管理する簡単な仕様にしよう.

 

それだけじゃつまらないから最後に受け止めなきゃ失敗にしよう.

↑が難しすぎたので受け止めたらポイントを加算したらいいかな.

 

ポイントがあるなら道中にポイント加算アイテムは必須だよね!

f:id:ymtkyorosiku:20171115233018p:plain

せっかくだしランキング機能欲しいなぁ.ツイッター機能も欲しいなぁ.

 

naichiさんがいい記事を書いていてくれました.

 

blog.naichilab.com

 

かつーきさんにも感謝です!

 

qiita.com

 

さてこれでランキングもツイッター機能もつけることができた.

 

あとは1週間でステージをたくさん増やすぞぉ!...何と25ステージまで作ってしまいました.しかも今回は全てクリアできるのを確認済み.

 

好きなステージから始められるようにタイトル画面を作って完成!

f:id:ymtkyorosiku:20171115232938p:plain 

何と今回はRigidBodyを一切使わずに作ってしまいました.全部Transformの座標で管理しているから当たり判定もいらない!

 

反省点や指摘されてしまった点としては,ゲームクリア後に歩くのが長すぎて次のステージに行くまでの待ち時間が長いこととリトライ機能が欲しかったことですね.次に活かします!

 

 

使用したアセット------------------------------------------------------

 

SDこはくちゃんずとは別で,Unityちゃんのパッケージに含まれているボイスを使用しています.とは言ったもののアセットストアで配信されているものにはボイスは含まれていない模様.ボイスも使用したい方はUnityちゃんの公式サイトからダウンロードしてきてね.

 

アセットストア:unity-chan!

© UTJ/UCL

 

第六回ではアセットをたくさん使うのだ〜!!

 

第一回ゲームジャムで作ったもの

遅らせながら私も1WeekGameJamのブログを書いていきます.

 

自分の作ったものを文章にまとめたりするのは苦手ですので言葉遣いとかおかしくなったりしますがご了承ください.

 

さて,ここではUnityRoomで行われた第一回UnityGameJumについて書いていきます.

 

私はたまたまツイッターで見かけたので参加させていただきました.

UnityChanの玉転がし! | 無料ゲーム投稿サイト unityroom - Unityのゲームをアップロードして公開しよう

 

ゲームはとにかく作ってから後付け設定を付け加えるの方針でちゃっちゃかと作っていきます.とりあえず,Unity標準のCubeとかSphereとかを配置してステージを作っていきます.

 

最初は3Dでパチンコのようなものを作るつもりだったのですが,いかんせん私はパチンコを全く知らない.じゃあ金属の球をゴールに運ぶゲームでいいんじゃないかなと,3Dのゲームを作る予定だったのに2Dみたいなゲームになってしまいました.

 

ステージを作ります.モデルとかは後で考えるとして,Cubeで壁や床を作成し,動く床や回転する床を作って全部プレハブにしてしまいます.(後でステージ増やす際に使いそうなので)

 

球を運ぶのはもちろんUnityちゃん!

 

f:id:ymtkyorosiku:20171115225527p:plain

© UTJ/UCL

 

Unityちゃんを使ってゴールまで球を運ぶことにしました.できるだけ操作が簡単になるように移動とジャンプのみ.

 

しかし球をゴールに運ぶだけではつまらない!すぐに終わってしまう.

なら球を増やせばいいじゃない!

 

球を増やしたら難易度が上がった!しかし,これでもすぐに終わってしまう.

 

ならUnityちゃんもゴールに運べばいいじゃない!

 

というわけで球とUnityちゃんを全てゴールに導いたらステージクリアとすることにしました.

 

あとはステージを増やすだけ.1週間しかないからね.できるだけ増やすぞー...

 

20ステージまで作ってとりあえず終了.反省点として,16ステージ以降は自分でもクリアできない無理ゲーになってしまったことかな.