「Unity4.6/5.0でつくる 2Dゲーム制作入門」を配信開始しました


■(※2015/6/19追記)バージョンアップを行い、増ページしました。以下の記事が追加されています。

  • Chapter4 2Dゲームを作るときに知っておきたいコンポーネント・クラス
  • Chapter5 uGUI入門
  • サポート掲示板のURLを追記

(※2015/10/15追記) 第一版を購入された方へのご連絡

改訂版の入手方法は、お手数となりますが、以下のページなどを参考に手動で更新が必要となります。

これは、2013年あたりから自動更新の審査基準が厳しくなったためで、本に大きな不具合がない限り自動更新の審査が通らなくなったためとなります。

(※2015/10/15追記) 3Dサウンドの設定について

シューティング作成のチュートリアルで「3Dサウンドの設定を無効にする」という記述がありますが、Unity5では AudioClipから設定できなくなった(正確には隠しパラメータとなった)ためこの設定は不要となります。そして AudioSourceで3Dサウンドの設定をするのですが、AudioSourceは Sound.cs で生成しているため、Sound.cs を以下のコードに置き換えるようお願いいたします。

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

/// サウンド管理
public class Sound {

  /// SEチャンネル数
  const int SE_CHANNEL = 4;

  /// サウンド種別
  enum eType {
    Bgm, // BGM
    Se,  // SE
  }

  // シングルトン
  static Sound _singleton = null;
  // インスタンス取得
  public static Sound GetInstance()
  {
    return _singleton ?? (_singleton = new Sound());
  }

  // サウンド再生のためのゲームオブジェクト
  GameObject _object = null;
  // サウンドリソース
  AudioSource _sourceBgm = null; // BGM
  AudioSource _sourceSeDefault = null; // SE (デフォルト)
  AudioSource[] _sourceSeArray; // SE (チャンネル)
  // BGMにアクセスするためのテーブル
  Dictionary<string, _Data> _poolBgm = new Dictionary<string, _Data>();
  // SEにアクセスするためのテーブル
  Dictionary<string, _Data> _poolSe = new Dictionary<string, _Data>();

  /// 保持するデータ
  class _Data {
    /// アクセス用のキー
    public string Key;
    /// リソース名
    public string ResName;
    /// AudioClip
    public AudioClip Clip;

    /// コンストラクタ
    public _Data(string key, string res) {
      Key = key;
      ResName = "Sounds/" + res;
      // AudioClipの取得
      Clip = Resources.Load(ResName) as AudioClip;
    }
  }

  /// コンストラクタ
  public Sound() {
    // チャンネル確保
    _sourceSeArray = new AudioSource[SE_CHANNEL];
  }

  /// AudioSourceを取得する
  AudioSource _GetAudioSource(eType type, int channel=-1) {
    if(_object == null) {
      // GameObjectがなければ作る
      _object = new GameObject("Sound");
      // 破棄しないようにする
      GameObject.DontDestroyOnLoad(_object);
      // AudioSourceを作成
      _sourceBgm = _object.AddComponent<AudioSource>();
      _sourceBgm.spatialBlend = 0; // 2Dサウンドを有効(※)
      _sourceSeDefault = _object.AddComponent<AudioSource>();
      _sourceSeDefault.spatialBlend = 0; // 2Dサウンドを有効(※)
      for (int i = 0; i < SE_CHANNEL; i++)
      {
        _sourceSeArray[i] = _object.AddComponent<AudioSource>();
        _sourceSeArray[i].spatialBlend = 0; // 2Dサウンドを有効(※)
      }
    }

    if(type == eType.Bgm) {
      // BGM
      return _sourceBgm;
    }
    else {
      // SE
      if (0 <= channel && channel < SE_CHANNEL)
      {
        // チャンネル指定
        return _sourceSeArray[channel];
      }
      else
      {
        // デフォルト
        return _sourceSeDefault;
      }
    }
  }

  // サウンドのロード
  // ※Resources/Soundsフォルダに配置すること
  public static void LoadBgm(string key, string resName) {
    GetInstance()._LoadBgm(key, resName);
  }
  public static void LoadSe(string key, string resName) {
    GetInstance()._LoadSe(key, resName);
  }
  void _LoadBgm(string key, string resName) {
    if (_poolBgm.ContainsKey(key))
    {
      // すでに登録済みなのでいったん消す
      _poolBgm.Remove(key);
    }
    _poolBgm.Add(key, new _Data(key, resName));
  }
  void _LoadSe(string key, string resName) {
    if (_poolSe.ContainsKey(key))
    {
      // すでに登録済みなのでいったん消す
      _poolSe.Remove(key);
    }
    _poolSe.Add(key, new _Data(key, resName));
  }

  /// BGMの再生
  /// ※事前にLoadBgmでロードしておくこと
  public static bool PlayBgm(string key) {
    return GetInstance()._PlayBgm(key);
  }
  bool _PlayBgm(string key) {
    if(_poolBgm.ContainsKey(key) == false) {
      // 対応するキーがない
      return false;
    }

    // いったん止める
    _StopBgm();

    // リソースの取得
    var _data = _poolBgm[key];

    // 再生
    var source = _GetAudioSource(eType.Bgm);
    source.loop = true;
    source.clip = _data.Clip;
    source.Play();

    return true;
  }
  /// BGMの停止
  public static bool StopBgm() {
    return GetInstance()._StopBgm();
  }
  bool _StopBgm() {
    _GetAudioSource(eType.Bgm).Stop();

    return true;
  }

  /// SEの再生
  /// ※事前にLoadSeでロードしておくこと
  public static bool PlaySe(string key, int channel=-1) {
    return GetInstance()._PlaySe(key, channel);
  }
  bool _PlaySe(string key, int channel=-1) {
    if(_poolSe.ContainsKey(key) == false) {
      // 対応するキーがない
      return false;
    }

    // リソースの取得
    var _data = _poolSe[key];

    if (0 <= channel && channel < SE_CHANNEL)
    {
      // チャンネル指定
      var source = _GetAudioSource(eType.Se, channel);
      source.clip = _data.Clip;
      source.Play();
    }
    else
    {
      // デフォルトで再生
      var source = _GetAudioSource(eType.Se);
      source.PlayOneShot(_data.Clip);
    }

    return true;
  }
}

Unityで2Dゲームを作成するためのチュートリアルとなるKindle本を書きました。

Unity4.6/5.0でつくる 2Dゲーム制作入門

GameMaker本に続いて、表紙は炎堂たつや先生に描いてもらいました。

内容は、Unityで2Dゲームを作りたい人のための本です。この本のとおりに作ることで、簡単なミニゲーム・シューティング・アクションゲームが作成できます。ただ、Unityはゲームを作るためにスクリプトを多く書く必要があります。そのためスクリプト・プログラムの知識が多少要求されるので、プログラムはできるけどゲーム作りは初心者、という方におすすめできる内容となっています。

■作成するサンプルゲーム

ミニゲーム

まずは最初にオブジェクトをクリックして破壊するミニゲームを作成します。

ここではUnityの基本的な仕組みを理解することを目標とします。

シューティングゲーム

次に自機からショットを撃つシューティングゲームを作成します。ここでオブジェクトの管理や敵のAI作成、サウンド再生などを学びます。

アクションゲーム

最後に、オーソドックスな横視点のアクションゲームを作成します。

AssetStoreは使わずにすべて自作します。マップデータの読み込みにフリーソフトのTiled Map Editorを使っているので、Tiled Map Editorのマップデータを読み込むチュートリアルとしても活用できると思います。

なお、ミニゲームのチュートリアルについては、Qiitaの方にサンプルとして記事をアップしています。

まずはこの記事を見て、役に立ちそうなら購入を検討してもらえればと思います。

あと、おまけとして、ゲームを作るアイデア・発想法を紹介しています。

  • ゲームアイデア発想法 
  • ゲームアイデア発想法(邪道編) 
  • つまらないゲームを面白くする方法 
  • インディーズゲーム開発で成功する5つの方法

Unityとは何の関係もありませんが、オリジナルゲームを作るときに役立つのではと思って書いてみました。

バージョンアップ内容(※2015/6/19追記)

バージョンアップを行い、増ページしました。

  • Chapter4:2Dゲームを作るときに知っておきたいコンポーネント・クラス:2Dゲームで頻出のコンポーネント・クラスの使い方を紹介しています
  • Chapter5 uGUI入門:テキストUI、ボタンUIといった基本的なUIの使い方を説明しています
  • サポート掲示板のURLを追記:本書の不明な点をサポート掲示板から質問できます

このUnity2D本のお値段は500円となっています。紙ベースで512ページ、データサイズは約44MBとそれなりのボリュームとなっていますので、Unityで2Dゲームを作りたい方はぜひともお願いします。

なお、Kindle本を読むには、昔はタブレットがないとダメでしたが、今は「Kindle for PC」というのが日本語アカウントに対応したので、PCでも読めるようになっています。

■Amazonの販売ページへのリンク

Kindleの販売ページはこちらとなります→Unity4.6/5.0でつくる 2Dゲーム制作入門 [改訂第二版]