プログラミングしたことない人がゲームを作ってみる備忘録

プログラミング経験ゼロから頑張っています。

初めてのオリジナルゲーム「ダンジョン脱出」②

ところで、今の状況はこんな感じです。
5×4のPlaneの上に、赤いCylinder(1×1×1)が乗っています。

f:id:gardenlove:20180710212635p:plain

スケールが違う?
私の希望としては、プレイヤーである赤いCylinderをぴったり5×4で並ぶくらいのPlaneがいいんです。だから、数字で指定したんです。
でも、え?Cylinder小さくない?
Planeの「1」とCylinderの「1」は違うってこと?

ということで、もう少しわかりやすくCubeを配置して数字をいじってみたら、
Planeの「1」はCubeの「10」のようです。
へえ、なるほど。
まあ、10倍ならわかりやすくていいや。

初めてのオリジナルゲーム「ダンジョン脱出」①

まずはフィールドを。
Planeで床を作りました。
f:id:gardenlove:20180706173013p:plain
4×5マスの、ごく小さなフィールドです。

そして、人に見立てたCylinderをこの世界に降り立たせました。

f:id:gardenlove:20180706173147p:plain
このCylinderは自分自身なので「Me」と名付けました。

f:id:gardenlove:20180706173156p:plain
さて、このMe君に物理属性を与えます。
といってもよくわからないので、前回のボールゲームで作ったラケットととりあえず同じように作ります。フィールド上を、プレイヤーが入力したキーによって動くのは大差ないと思ったからです。動きが変だったら、あとで調整です。

f:id:gardenlove:20180706173201p:plain
というわけで、こんな感じの値にしました。

さてお次はスクリプトです。

public class Me : MonoBehaviour {
    private float accel = 1000.0f;

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
        this.GetComponent<Rigidbody>().AddForce(
            transform.right * Input.GetAxisRaw("Horizontal") * accel,
            ForceMode.Impulse);
		
	}
}

ラケットと全く同じです。
とりあえずこれで動かしてみましょう。

うん。
ラケットの時は何とも思わなかったですが、人だと思うと動きが早すぎです。キレッキレです。あと、左右には動きますが、前後には動きません。そりゃそうだ、ラケットはそういう設定でした。
動きをどう変更したいかというと、
・矢印キーを入れた時のスピードを遅くする
・前後(z方向)にも動かしたい
・できればドラクエのように1マスずつ動いてほしい
こんな感じです。

まず、前後の動きの実現です。
ググりまくって、こんな感じにしました。

public class Me : MonoBehaviour {
    private float accel = 20000.0f;

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
        float x = Input.GetAxis("Horizontal") * accel;
        float z = Input.GetAxis("Vertical") * accel;
        GetComponent<Rigidbody>().AddForce(x, 0, z);

    }
}

すると、前後にも動き始めました!
数字もちょこっと変えてあります。

Unityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で::(6)ブロックを手作業で並べる をやってみた

さて、Blockが一つだけだとつまらないです。
複製します。
複製は、ちゃんと完璧に自分の思い通りの挙動を示すことを確認してからのほうが良いのかと思います。
形だけ複製して体裁を保っても、何か挙動に不足があった場合、同じものを一つずつ訂正するのは手間ですもんね。
f:id:gardenlove:20180702125134p:plain
複製は、最初のほうに壁を作った時にもやりましたね。
①複製したいオブジェクト(今回はBlock)を選択して、②Editの③Duplicateです。
f:id:gardenlove:20180702125325p:plain
そんな要領で、1列分、5つに複製します。
これらは同じ座標に重なり合った状態なので、TransformのPositionで、x軸の値を指定して、横並びにしていきます。
f:id:gardenlove:20180702125455p:plain
こんな感じで、ぴったりと収まりました。
ブロックとブロックの境界線がないのでつながって見えますが、5つ並んでいます。

今度はそれをさらに複製します。
このまま一つ一つ複製してPositionを指定してもいいのですが、それも面倒なので、一気にやります。
f:id:gardenlove:20180702125608p:plain
①Shiftを使ってBlock5つを選択して、②Editの③Duplicateを選択。
f:id:gardenlove:20180702125716p:plain
パッと見はわかりませんが、増えています。
これらをまとめて1段下に置きたいので、選択したままZ軸の値を指定します。
すると、1列まとめて1段下へ移動しました。
らくちん。
f:id:gardenlove:20180702125818p:plain
同じことを繰り返して、5列配置しました。
これ、ブロックの境目を作っておけばよかったなあと思います。

さてドキドキのテストプレイです。
ちゃんと思い通りに消えるでしょうか。
f:id:gardenlove:20180702125916p:plain
消えた!
f:id:gardenlove:20180702125927p:plain
じゃんじゃん消えるよ!!
すごい!

さて、ここまで参考にしてきたサイトはここで終わっています。
本来ならここから、さらにゲーム性をつけるために、ボールが落ちた(下の壁に当たった)場合はゲームオーバーとか、ブロックが全部消えたらクリアとか、ブロックが消えるときに音が鳴るとか、そういうものがあったほうがいいなと思いますが、ここで終わってしまっているのだから仕方がない。

これ以降は、どうやって勉強していこうか考えたいと思っています。

Unityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で::(5)消えるブロック をやってみた

無事にラケットを動かせるようになりました。
枠組みができて、転がるボールができて、操作するラケットができて。あとは消すブロックです。
まずは、お得意のcubeを作ります。
f:id:gardenlove:20180628150400p:plain
もう、手慣れたものです。

f:id:gardenlove:20180628150406p:plain
値はぴったりはまるように、こんな感じに。

f:id:gardenlove:20180628150411p:plain
いい感じに左上にぴったりと収まりました。

お次は、Ballにタグを入れます。
と書きながらも、何のことやらですが、とりあえず言われるがままやってみます。
f:id:gardenlove:20180629154506p:plain
①Ballを選択した状態で、InspecterのTagを押します。
すると選択肢の最後にAddTag…とあるので選択。

f:id:gardenlove:20180629155042p:plain
するとこんな感じになるので、下の小さい+ボタンを押す。

f:id:gardenlove:20180629155108p:plain
名前を入力してほしそうな画面になるので、ここではBallとしてSaveする。

f:id:gardenlove:20180629155137p:plain
もう一度Ballを選択した状態でInspecterのTagを押すと、さっきまではなかったBallが追加されている。
この作業はいったんここで一区切り。

お次はBlock.csです。

f:id:gardenlove:20180702122949p:plain
何回もやっている手順ですが、InspecterのAddConponentを選択して、New Script。
今回は、Block.csと名付けました。

内容はこんな感じです。
f:id:gardenlove:20180702123054p:plain
Destroyとか、MTGを昔やっていたので、なんだか物騒だなあと思ってしまいます。
解説を読むと、ぶつかった相手がBlockというTagを持っていたら、SceneからDestroyする、ということのようです。先ほどよくわからないままやった作業が、ここで生きてきている感じですね。

f:id:gardenlove:20180702123151p:plain
で今度は忘れないように、オブジェクトのBlockとBlock.csを関連付けます。

そして、満を持して再生ボタンを押してみました。
ボールはカンカン跳ね返り、左上に一つだけ配置したBlockになかなか当たりません。どうしようかなと思った瞬間、当たりました。そして、何事もなく静かに消えました!消えました!!
いよいよゲームっぽくなってきたので、とっても感動です!

Unityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で::(4)ラケットを動かす をやってみた②

ラケットの大まかな設定が終わったので、次はプログラムです。
f:id:gardenlove:20180619134209p:plain
前回のボールの時と同様、Add Componentを押して、New Scriptを追加しました。名前は、Racketとします。

f:id:gardenlove:20180619134617p:plain
できました。

さて、ここに記述をします。
相変わらず、意味が分からないまま丸写しです。あ、一応コピペではなく手打ちをしています。
f:id:gardenlove:20180619134837p:plain
こんな感じです。

これでもうラケットが動かせるのかなと思って、再生ボタンを押してみましたが、ボールがカンカン動くだけで、ラケットは動きませんでした。というかそもそもどのボタンを押したら動く設定になっているのかわかっておりません。
矢印やほとんどのキーを押したり、マウスをカチカチしたりしてみましたが、ラケットが動くことはありませんでした。
まだ動かないのかなー。
まあいいっか。

追記
設定をきちんしていなかったせいであることが判明しました。
Racket.csとRacketオブジェクトを関連付けていなかったせいです。
f:id:gardenlove:20180628145530p:plain
こんな感じでひょいっとしてから実行したら、ちゃんと矢印キーで左右に動きました!
やったあ!

Unityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で::(4)ラケットを動かす をやってみた①

さて、こんどはユーザーが操作できるラケットを作ります。ラケットといっても、ただの長方形です。

まずはCubeを追加して、こんな感じに設定します。
f:id:gardenlove:20180612150533p:plain
下より中央に配置。形は横長で。
何、私もこのくらいならサクッとできるようになりました。

すると、こんな感じにできました。
f:id:gardenlove:20180612150612p:plain

そしてついに動かせるように設定していくようです。
f:id:gardenlove:20180612151013p:plain
まずは①Edit → ②ProjectSettings → ③Input

すると、Inputが追加されました。
f:id:gardenlove:20180612151151p:plain

なんかやけにシンプルだな、どうやってキーの割り当てとかするのかなと思って左の三角を押して展開してみたら、
f:id:gardenlove:20180612151229p:plain
Oh!なんかたくさんでてきたYO!
まあ、とりあえず今回はここを触る必要はないようです。よかった…のか?

まずはボール同様、
f:id:gardenlove:20180613235100p:plain
①Component → ②Physics → ③Rigidbdyで、ラケットにも物理属性を付けます。

f:id:gardenlove:20180613235143p:plain
当たり前ですが、ボールとは設定が違います。
①massは質量でしたね。動き出す反応が変化するようです。ちなみに単位はkg。50kgのラケットかあ。
②は、空気抵抗。キーを離してから完全停止するまでの減速に影響。
③で、軸の固定
を主に設定しました。

Unityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で::(3)動くボール をやってみた②

さて前回設置したボールを動くようにします。

f:id:gardenlove:20180606201446p:plain
Inspecterの下のほうにある、Add Component を押します。

f:id:gardenlove:20180606201600p:plain
なんか色々出てきますが、一番下のほうの、New Scriptを選択。

f:id:gardenlove:20180606201642p:plain
名前をBallとし、Create and Addを押します。

f:id:gardenlove:20180606201800p:plain
すると、できました!
少し前に、壁のマテリアルを作ったところに、何かが!
さてこれは、少し前に、少しかじったC#です。
さっそくダブルクリックすると、Visual Studioが立ち上がりました。これ、立ち上がるの少し時間かかるのよねえ。
f:id:gardenlove:20180606202223p:plain
立ち上がった画面はこんな感じです。
すでに何かが書いてあります。相変わらずさっぱり分かりませんが、とりあえずやってみます。

f:id:gardenlove:20180612002526p:plain
とりあえず言われるがまま丸写しです。
しかし、意味はさっぱり分かりません。解説がついていたので読んでみます。

f:id:gardenlove:20180612002700p:plain
あれ?日本語なのに頭に入ってこない…。
こまけえことはいいか!

さて保存して動かしてみます。
上の再生ボタンをぽちりとすると、
f:id:gardenlove:20180612003131p:plain
ボールが勢いよく右上へ射出され、その後慣性で上へゆっくりと動きました。
おお、説明にあった通りの動きだ!

ここで、カメラのアングルを変えました。上から見下ろしている感じにしました。
f:id:gardenlove:20180612003707p:plain
これらの数字、どこをどういじれば希望のカメラワークになるのかまだよくわからないので、説明にあるとおりにしました。

さてボールに戻りますが、先ほど右上に勢いよく射出されたボールは、壁に当たると失速しました。ブロック崩しのボールは、空気抵抗や摩擦は必要ないでしょう。
ということで、設定をいじります。

f:id:gardenlove:20180612004350p:plain
空気抵抗である、DragとAngular Dragの値を0にしました。
軸を固定するためにConstraintsのFreezePositionのyにチェック、FreezeRotationのXYZにチェックを入れました。ボールの移動範囲をXZ軸に固定するためです。(と偉そうに言っていますが、ほぼ意味は分かっていません…)

そうして再生をしたら、右上に射出されたボールは失速することなく上へ転がり、上の壁に当たって止まりました。

壁に当たったら跳ね返ってほしいので、以下の作業をします。
f:id:gardenlove:20180612010002p:plain
Criateから、PhysicsMaterialを選択。

f:id:gardenlove:20180612010011p:plain
すると、ゴルフっぽいアイコンが新しくできました!

f:id:gardenlove:20180612144258p:plain
これをこんな感じに設定します。

f:id:gardenlove:20180612010028p:plain
次はBall側のInspecterの設定。

f:id:gardenlove:20180612010031p:plain
そして、ここにさっき設定したゴルフっぽいアイコンをぽいっと。

これで、壁にあったったら跳ね返るはずです!
再生ボタンを押してみます。
f:id:gardenlove:20180612144541p:plain
むふー!!いい感じに跳ね返っております!

今日はこのあたりで。