かさたな日記

主にUnityを使った制作記録。書いてる人は初心者です。一緒に頑張ろう。

Unity1week:【当てる】編

■参加しました
unityroomさんの1週間ゲームジャムにまたまた参加させていただきましたー。
今回のお題は『当てる』。

シンプルなお題だけに色々とネタは出てきそうだったのですが、
なんだかんだで手を付けられたのが水曜日。
だが諦めるにはまだ早い...ということでシンプルな的あてゲームを作りました。

もう少し時間があったらおっp(略 を当てるゲームを作ってたよ。
こう、アフ○ダイA的な路線で。


■完成品はコチラ。
ユニティちゃんのナイフ投げマスター! | 無料ゲーム投稿サイト unityroom - Unityのゲームをアップロードして公開しよう

※現在、ブラウザによっては一投目の命中の瞬間だけ処理落ちするという
 問題が発生しております。エディタ上やfirefoxなら大丈夫なんだけど。
 ...原因はなんと書く分かってる...ので、後日直します。

#追記
ぬぬぬ、目星をつけていた部分が原因ではなかったようだ...
調査中につきもうしばらくお待ちをををを


■DoTweenってスゲー
今回は有名アセットのDoTweenに大活躍していただきました。
マトの動きはこれでPath制御しております。
Sequenceという機能を使って逐次処理をすることができるのですが、
それが大いに役に立ちました。


■命中したときの動作
Collider上の衝突箇所は以下で得られます。
マトは動いてる間はTriggerになってました。

    void OnTriggerEnter(Collider other)
    {
        Bullet bullet = other.gameObject.GetComponent<Bullet>();
        if (!bullet) { return; }

        //接触箇所を検出  
        Vector3 hitPos = other.ClosestPointOnBounds(this.transform.position);

        //命中時の処理
        HitBullet(bullet, hitPos);
    }


あとは衝突箇所とマトの中心の座標のZ座標を揃えてからXY平面上での距離を
Vector2.Distanceで求めて、その距離に応じてスコアを決めています。フツーですね。
ちなみにスコアは100、50、30、10、0の5段階しかありません。
ねらって10点取るのは100点取るより難しいぞ。

実は投げた方のナイフは衝突時点で非アクティブになっていて
マトのオブジェクトとセットになっている「刺さったナイフ」オブジェクトを
衝突位置に表示するという処理になってます。


■そのほか開発の中身的なこと。

正直言って開発手法を語れるほどの技量がございません。
コードもそんなに早く書けるわけでもないので
ちょっとだけでも開発を早くする方法として
なるべく使い回せる汎用的なコードを書くことを心がけています。

具体的には機能別にマネージャ的なクラスをシングルトンで作成しておいて
新規プロジェクトを作ったらとりあえず放り込んで使います。
(ナンニデモシングルトンヨクナイ

以下は今回の使った分です。


Config.cs……ScriptableObject形式になっています。
決定音やキャンセル音、ウィンドウのスプライトや色などの設定を保持しています。
データベース系は他にも色々あったりします。

SaveManeger.cs…Json形式でのセーブ処理をしてくれるクラスです。
今回は音量設定しかセーブしてません。実はスコアセーブしてないんです。

InputManager.cs……入力イベントを扱うクラスです。
ドラッグやクリック、キー入力に個別に反応させることができます。
中身はUnityEventで実装しています。

Sound.cs...BGMやSEの再生用です。(ホントは2D用想定。音源とリスナーを設定できるSound3Dってクラスもあるけど今回はお休み。
音量などの設定も受け持っています。
Monobeheiverは継承していませんが、コンストラクターで空オブジェクトを生成して
AudioSourceコンポーネントを8個ほど装備しています。

Emitter.cs......パーティクルを再生、プールするクラスです。これはヨクナイ名前....。
これもMonobeheiverを継承してないので空オブジェクトを生成して
子オブジェクトとしてパーティクルのオブジェクトを確保します。

....そして恐らく今回の一投目に一瞬止まる現象の犯人。
動的にインスタンスできるからって横着したせい.......先にインスタンスしておけばよかったのだ
#追記:犯人ではなかった....。真犯人は誰だ

Unit.cs.......自機や敵キャラの基底クラスです。HPなどの情報を持ってたり
アニメーションさせるためのメソッドを持ってたりします。
今回はユニティちゃんだけ。

UnitManager.cs.......ユニットにIDを割り振ったりして管理してるマネージャです。
Unit.csの中のUpdateMe()メソッドをこいつのUpdate()で呼び出すことで
全体のUpdate()の回数を減らします。

余談ですがUnityの処理の関係で、
Update()は書いてあるだけで、もし中身がなくても、一定の処理時間を使うみたい。
必要のないUpdate()は消しておこう。
たくさん呼ぶ必要がある場合はマネージャからまとめて呼ぼう。
ボクは今年に入ってから知りました。

BulletMaker.cs........弾をインスタンスしてプールして管理してるマネージャです。
BulletShooter.cs.......弾を発射するクラスです。軌道や速度、貫通弾やホーミングの設定ができます。
Bullet.cs……弾本体です。弾というか攻撃判定なのでパンチとかにもついてたりします。
今回は投げるナイフ一本だけです。


■まとめ
今回は時間の関係でシンプルなものを作ろうと思って作ったわけですが
やっぱりもっと何かできたのではないかという心残りは結構あったりします。
ただ、最近はしばらく完成品を出せていなかったので、良い息抜きになりました。
ある程度の適切な締め切りが決まっていたほうがなんだかんだスムーズに制作できますね。

ボクはとても神経質なタチなので細かいところがいつも気になるのです。
UIの動きとか、触ったときのレスポンスの感じとか。
今作っているゲームでもカメラの回転が気持ちよくないので、かれこれ三週間ほど悩んでいます。

でも締切が決まっているなら残り時間から逆算して、ある程度で先に進まざるを得ない。
自主的に締め切りを定めて作ったほうがいいかもしれないと思う今日このごろでした。