アクションゲームの「動く障害物」の作り方

前回の作業で一応ステージができました。しかし、そのままだと淡々とステージを進むだけになってしまってゲーム的に大して面白くありません。

そこでここでは動く障害物を追加してステージに変化をつけられるようにしてみましょう。

スポンサーリンク

動く障害物のC#スクリプト

では早速ですが動く障害物のC#スクリプトを書いていきましょう。新しく「MovingObstacle」という名前のC#スクリプトを作り、次のコードを書いてください。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MovingObstacle : MonoBehaviour
{

  public enum Mode { Move, Rotate, Both };

  [SerializeField]
  Mode mode = Mode.Move;

  [Header("直線移動の設定")]
  [SerializeField]
  float speed = 0;
  [SerializeField]
  Transform[] points = null;	// 障害物の目的地を格納するための配列

  [Header("回転の設定")]
  [SerializeField]
  Vector3 rotationAngle = Vector3.zero;

  bool reverse = false;
  int currentPointIndex = 0;	// 現在のポイントのインデックス番号

  void Update()
  {
    switch (mode)
    {
      case Mode.Move:
        Move();
        break;
      case Mode.Rotate:
        Rotate();
        break;
      default:
        Move();
        Rotate();
        break;
    }
  }

  void Move()
  {
    if(points.Length == 0)
    {
      return;
    }

    transform.position = Vector3.MoveTowards(transform.position, points[currentPointIndex].position, speed * Time.deltaTime);

    // 目標地点との距離が0.01m未満、つまり到着したなら地点を切り替える
    if((transform.position - points[currentPointIndex].position).sqrMagnitude < 0.01f)
    {
      if (reverse)
      {
        currentPointIndex--;

        if(currentPointIndex == 0)
        {
          reverse = false;
        }
      }
      else
      {
        currentPointIndex++;

        if(currentPointIndex >= points.Length - 1)
        {
          reverse = true;
        }
      }
    }
  }

  void Rotate()
  {
    transform.eulerAngles += rotationAngle * Time.deltaTime;
  }

}

スクリプトの解説

今回の障害物のスクリプトには3つのモード

  1. 移動
  2. 回転
  3. 移動と回転の両方

があります。

まず移動の場合は予め移動先を登録しておいて、目的地に到着したら次の地点に向かうような処理になっています(※登録する地点は1つ以上ならいくつでも構いません)。一方回転の場合は普通にゲームオブジェクトを回転させているだけです。

そんなに難しいことはやっていないので、パッと見よく分からないという方はスクリプトの処理をしっかり追ってみてください。

設定を行い、テストプレイして動作を確認する

さてここまでできたらテストプレイして動作を確認しておきましょう。スクリプトが書けたらそれを適当なゲームオブジェクトにアタッチして設定を行います。

障害物を移動させたい場合は、

  1. 「モード」を「移動」にする
  2. 空のゲームオブジェクトを作り、それを障害物の移動先の座標に移動させたら「ポイント」にそのゲームオブジェクトを登録する

という手順を踏んでください。

一方で回転の場合は「Rotation Angle」に回転量を指定するだけでOKです(※ピボットを中心に回転するので、変な回り方をしている場合は適宜ピボットを調整してください)。

できたらゲームを実行して動作を確認してみてください。例えば移動する障害物なら、次のように登録した地点を往復運動すれば成功です。

動く障害物の例

(クリックで動画再生)

※今回は地点1→地点2→地点3→地点2→地点1…というように往復運動する障害物にしました。もし地点1→地点2→地点3→地点1…という動きにしたい場合はご自身で改造してみてください。

障害物をステージに配置する

そうしたら障害物をステージに配置していきます。基本的に自由に配置してもらえばOKですが一応お手本を載せておきますね。赤または黄色のオブジェクトが今回追加した障害物です。

障害物の配置例

これでステージが完成しました。


次のページ→シーンのライティングをベイクする方法