neoaco

いつでも ねむい あとおすしたべたい

Unity1week(お題:当てる)に参加しました

いちおうUnityでゲーム作ってる身としては参加したいよね、(参加自体は)ハードル低いし。

ということで、私が参加するのは今回で三回目です。
投稿したゲームはこちら
音が出るので音量をアゲ☝アゲ☝でお願いします
カチカチ相撲 | 無料ゲーム投稿サイト unityroom - Unityのゲームをアップロードして公開しよう


日記

どんな雰囲気でゲーム作ったかというご紹介。
一週間もあると、余裕があっていいですな。


四日目まではTumblrに載っております
neoaconquest.tumblr.com

五日目はやる気が失われて古代エジプト*1へワニのおばけを退治しに行ったりしてました。
夫が帰ってきて、自力で解決できなかったところを質問責めにして教えてもらったりして、なんとか良い感じの雰囲気になったところで終了。

六日目は土曜日でお昼前に起きて、ゲームの部分は粗方できたところで何かが足りない……と思いながらゲームの表紙を考えてたら、タイトルに相撲ってつけたんだからおはじきにまわしを着けたらいいのでは?! とかいう超展開を見せ、
カチカチいわせるSEがうまく見つからず、
どすこい! とか言わせることになりました。
カチカチ当てたれ! とかいう割に、おはじきがどすこいどすこいと鳴くゲームに仕上がりました。まじかよ。


ゲーム制作で頑張ったところ

頑張ったところを書いていきます。ほめて。
あと、どなたかのゲーム制作の一助となれれば幸いです。

使ったもの
・Unity 2017.3
C#

おはじきをスワイプして飛ばしたい

「モンスト」「作り方」とかで検索しました(告白)
概略:スワイプの初めと終わりのポジションを記録して、差のベクトルをおはじきに加える力にする

// はじくおはじきに書く
Rigidbody2D rb;
Vector2 clickDown;
Vector2 clickUp;
Vector2 forceVec;

void Update () {
	// 起点と終点の差をとってはじく向きのベクトルにする
	if (Input.GetMouseButtonDown (0)) {
		clickDown = Input.mousePosition;
	}
	if (Input.GetMouseButtonUp (0)) {
		clickUp = Input.mousePosition;
		// 差が無かったら何もしない
		if (clickUp == clickDown) {return;}
		// 差をとって力を加える
		forceVec = clickUp - clickDown;
		rb.AddForce (forceVec);
		rb.AddTorque (0.3f);
}

最後のトルクは、あとでいろいろしてたらいつの間にかクルクル回らなくなったから、適当に付け足しました。
2Dなので、数値を指定するだけしかできないっぽい。今考えるとforceVecのどっちかの値を使えばよかったかな。まぁフレーバー程度の話なのであまり深く考えてないです。

ぶつかったところにエフェクトを発生させたい

エフェクトが出るとゲームとして一段上のステージに行けた気分がするので、エフェクトをでっちあげて貼り付けることに。
本当はパーティクルシステムで作りたかったんだけど、なんかよくわからなかったので、普通にAnimationでつくりました。

それで、ぶつかった点ってどうやって取得するだよって話ですよ。

今回は、エフェクトを出したいもの同士が全部同じ形同じサイズなので、
二つの位置をとってその中間地点にエフェクトを貼り付けるということで解決しました
概略:ぶつかった相手のポジションを取得、自分と相手の中間地点にエフェクトを貼る

// ぶつかったときに出すエフェクト
GameObject hitEffect

void OnCollisionEnter2D(Collision2D col){
	// 他のおはじきにはotherというタグが付けてある
	if (col.gameObject.tag == "other") {
		GameCtrl.SendMessage ("GetHit", 5);
		// ぶつかった方
		Vector2 Av = this.transform.localPosition;
		// ぶつかられた方(other)
		Vector2 Bv = col.transform.localPosition;
		// 中間地点
		Vector2 Cv = Av + (Bv - Av)/2;
		// エフェクトを中間地点に貼る
		Instantiate (hitEffect, Cv, Quaternion.identity);
	}
}

いちいち名前を決めるのがめんどくさくて、こんな風にA,B,C…って名前を書いていると、夫に怒られるのですが、個人的には名前を付ける方がコストが高いので、こんな命名をしてしまいます。
他にも、5個のフラグをflA,flB,flC...と命名しているのを見られて、深い溜め息が聞こえてきました。

ツイートしたい

Unityはいつになったら OpneURL でブランクページを指定できるようになるのか(怒)
というわけで、一生懸命探して新規ページでツイートできる文を載せておきます。

// ボタンを押したらツイートするページを開くようにする
public void OnTweert(){
	string url = "https://twitter.com/intent/tweet?text= " + WWW.EscapeURL ( "ツイートさせたい内容");
	Application.ExternalEval(string.Format("window.open('{0}','_blank')", url));
}

でも、この機能は「Method group is Obsolete」とか言われてるので、そのうち使えなくなるんじゃないかな。
使えなくなるのはいいから早く新規ウィンドウでURLを開けるようにしてくれ。


一番大変だったところ

一人で考えていてもうまくいかなくて、もう少しで匙を投げるところだったので、別枠で書きます。

すべてのおはじきが止まったかどうか判定したい

後から考えるとそんなに大した話じゃないんですが、考え始めた時はどうしたらいいのかさっぱりわからなかった。
とりあえずどうやったのかを載せます。

概要:毎フレーム、今フレームと前フレームの速度を記録、動き出した時と止まった時に(フラグを管理している)GameCtrlへSendMessageする

GameObject GameCtrl;
Vector2 VA;     // 今フレームの速度
Vector2 VB;    // 前フレームの速度
Vecotr2 zV = new Vector2 (0,0);

void Update(){
	VB = VA;
	VA = rb.velocity;
	if (VB == zV && VA != zV) {
		// 速度がゼロから変わった = 動き出した
		GameCtrl.SendMessage ("deroVel", gameObject.name);
	}
	if (VB != zV && VA == zV) {
		// 速度がゼロになった = 止まった
		GameCtrl.SendMessage ("zeroVel", gameObject.name);
	}
}

これで、GameCtrl側に「動き出した時」と「止まった時」にメッセージが送られるので、
GameCtrlの中でboolをオンオフするようにすればよいです。

ちなみにboolのオンオフは

void deroVel(string fl){
	// 動き出した時
	switch (fl) {
	case "ohajikiA":
		flA = true;
		break;
	case "ohajikiB":
		flB = true;
		break;
		・
		・
		・
	default:
		break;
		}
	}

というふうにGameObjectの名前ごとにswitch文で分けて書いています。
switch文は見やすいのでいい文明。
変数が一個の時しか使えないけど。

はじめは速度はぶつかるときに代わるからウンヌンとかいろいろ議論が紛糾したのですが、
トイレ行ったらすっきりしたのか、あ、これでいーじゃん、という感じでした。
睡眠とトイレは重要ね。




以上、頑張ったところプレイバック集でした。
もう一回ゲームのリンクはりますね。
たくさん遊んでほしいです。
カチカチ相撲 | 無料ゲーム投稿サイト unityroom - Unityのゲームをアップロードして公開しよう







追伸:使用アセットのところに夫って書こうとしたけど、怒られそうなのでやめました。

*1:Assassin's Creed origins