【Unity】1週間ゲームジャム製作プロセス紹介 3日目: 優先度が高い処理の実装

投稿日:2018年11月24日

前回、実装の優先度を決めたので、優先度が高いものから実装していく。前回の日記で書き出した「優先度・高」の実装内容は以下の通り。

 

・食べ物がランダムに上空から投下される。

・制限時間、獲得ポイントが画面上に表示される。

・プレイヤーまたは敵ドラゴンが食べ物に接触したら、食べ物が消え、獲得ポイントが増える。

・60秒したらゲームを終了し、スコアを表示させる。

・敵ドラゴンがランダムに歩いたり、走ったりする。

 

実装のおいては、わからないことはとにかくググる。本や公式マニュアルを読みつつ体系的に勉強して……ということももちろん大切だが、1週間という短い間にゲームを完成させるには、とにかくググりまくるしかない。開発者が多いので、ググれば大抵のことがわかるのもUnityの良いところ。参考にさせて頂いたページと、実装のポイントだけ簡単に解説したいと思う。

 

食べ物がランダムに上空から投下される

イメージとしては、Y軸(高さ方向)だけ固定して、X軸とY軸の座標をランダムにオブジェクトを生成して、さらに出現するオブジェクトもランダムに選択できるようにする感じ。とりあえず方法をググると、まさにぴったりの内容を発見。こちらを参考にさせて頂きましたm(_ _)m

Unityで複数のGameObjectからランダムに一つ選んで生成する方法

Unity:オブジェクトのランダム生成について

 

制限時間、獲得ポイントが画面上に表示される

これに関しては、前の1週間ゲームジャムでつくった「鉄壁破右衛門」というゲームのCanvasをまるまる持ってきた。また、Scriptに関しても、かなりの割合で再利用できた。「鉄壁破右衛門」の実装に関して参考にしたページは、振り返り記事で書いている。

 

プレイヤーまたは敵ドラゴンが食べ物に接触したら、食べ物が消え、獲得ポイントが増える

接触判定系は、基本的にはOnCollisionを使う。Collisionの使い方は以下のページがシンプルでわかりやすい。

衝突判定のあれこれ

私もだいたいタグを使って、衝突時の処理をif文で分けている。例えば、食べ物と接触したObjectがプレイヤーの時のみ得点を加える……など。OnCollisionを使う場合には、衝突を検知したいObjectにColliderのComponentを加える必要があるので注意。

 

60秒したらゲームを終了し、スコアを表示させる

こちらは完全に前回のゲームの使いまわし。いったん割愛。あとで書く……かも。

 

敵ドラゴンがランダムに歩いたり、走ったりする

ドラゴンの移動については、Assetにキーボード入力によりドラゴンを操作できるScriptが付いていたので、こちらを改造。人が書いたScriptをそのままここに載せるわけにもいかないので、ポイントだけ書く。移動に関しては、下記のように縦方向と横方向の2軸が、キーボード入力によって操作されている。

void Update()
{
  h = Input.GetAxisRaw("Horizontal");
  v = Input.GetAxisRaw("Vertical");
  ~以下略~
}

このhとvを、ユーザーが操作しなくても勝手に歩いてくれるように、ランダムのfloat値を生成して入力するようにした。-1.0と1.0の間でランダムな値を入力し、敵を歩かせる。ランダムな値の生成に関してはこちらを参照。

void Update()
{
  h = Random.Range (-1.0f, 1.0f);
  v = Random.Range (-1.0f, 1.0f);
  ~以下略~
}

ただ、これだとUpdateされごとにランダム値が生成されてしまい、まともに敵ドラゴンは歩いてくれず、ずっと震えているような状態になってします。そこで、タイマー変数(gameTimerFloat)で少し時間を空けてから方向変換をするように変更。敵ドラゴンは9体おり、全員が同時に方向変換すると機械っぽくて気持ち悪いので、gameTimerFloatもランダムに生成して、それぞれの敵ドラゴンの方向変換のタイミングをずらしている。

private float gameTimerFloat;

void Update()
{
  if(gameTimerFloat > 0.0f){
    gameTimerFloat -= Time.deltaTime;
  }

   if(gameTimerFloat <= 0.0f){
                h = Random.Range (-1.0f, 1.0f);
                v = Random.Range (-1.0f, 1.0f);
                gameTimerFloat = Random.Range (4.0f, 6.0f);
  }
  ~以下略~
}

これでゲームとしての体裁はかなり整った。現在の状態はこんな感じ↓ 次は、優先度・中の項目を実装して、ゲームとしての完成度を高めていく。

 

0

投稿者: wakky

映画と旅行が大好きなエンジニア。お酒、ゲーム、読書も好き。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください