koma blog

Unreal Engine 4やUnity 5についての記事を書きます

【Unity】 半角文字と全角文字を変換する

半角文字と全角文字を変換する

//__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/
//
// ▼ File		StringWidthConverter.cs
//
// ▼ Brief		半角文字と全角文字を変換するスクリプト
//__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/
using UnityEngine;
using System.Collections;

public class StringWidthConverter : MonoBehaviour
{
    const int ConvertionConstant = 65248;

    static public string ConvertToFullWidth(string halfWidthStr)
    {
        string fullWidthStr = null;

        for (int i = 0; i < halfWidthStr.Length; i++)
        {
            fullWidthStr += (char)(halfWidthStr[i] + ConvertionConstant);
        }

        return fullWidthStr;
    }

    static public string ConvertToHalfWidth(string fullWidthStr)
    {
        string halfWidthStr = null;

        for (int i = 0; i < fullWidthStr.Length; i++)
        {
            halfWidthStr += (char)(fullWidthStr[i] - ConvertionConstant);
        }

        return halfWidthStr;
    }
}

使用例

// 0123abcd
Debug.Log(StringWidthConverter.ConvertToHalfWidth("0123abcd"));

// 4567EFGH
Debug.Log(StringWidthConverter.ConvertToFullWidth("4567EFGH"));

小文字と大文字を変換する

// abcd
Debug.Log("ABCD".ToLower());

// ABCD
Debug.Log("abcd".ToUpper());

【Unity】 Asset Storeをフル活用してゲームを作った話

開発目的

最終学年以外でCG学科のアーティストを引っ張るのが難しく一人で開発せざるを得なかったため
エンジニア1人で見劣りしない3Dゲームを作るため

開発期間

企画が半月、開発が一ヶ月の合計一ヶ月半です。

ゲームの概要

f:id:koma2961:20151014023942p:plain
ジャンルは3Dパズルゲームです、下記のリンクからダウンロード出来ます。
www.freem.ne.jp

今回使用したAsset

f:id:koma2961:20151014010430p:plain
このリストはUnityのAsset Storeから活用したアセットのみを掲載しており
SDユニティちゃんなどを含めると合計24のアセットを活用しております。
これらのアセットを活用した結果、グラフィックはタイトルロゴなどの2D画像を除く98%
BGMやSEなどのオーディオに至っては全てをアセットで賄っており
エンジニアはゲームシステムの実装だけに集中出来ると言っても過言ではありません。

Asset Storeを活用する際困った点

目当てのアセットを見つけることが少し大変

今回の開発でいうと " かわいいオバケ " を探すことが大変でした

日本語の「お化け」のような, 好奇心とユーモアを誘う単語は英語にはない.
ただし, 子供の絵本に出る「お化け」は “spook" とよばれることが多い.
アメリカではハロウィーン (Halloween) のとき
子供達がシーツをかぶってお化けのまねをする.
イギリスには各地に幽霊屋敷 (haunted house) があり,
そのガイドブックが出ているほどである.
                     - 引用元:Weblio英和辞典・和英辞典より

上記のようにghostだけでなくspookなど類義語も検索すると
目当てのアセットが見つかることがあります。
最終的には3Dモデルカテゴリーではなく
シェーダーカテゴリーにあるSugiyama Ghost Shaderに付属しているオバケを使用しました。
f:id:koma2961:20151014034112p:plain
語彙力を上げて検索することも解決策の一つですが、一度全てのアセットを確認すると
アセットを把握するとともに思いがけないアセットを見つけることが出来るのでおすすめです。

世界観を統一することが大変

言わずもがなAsset Storeは多数のクリエイターが
リアルチックなアセットからトゥーンチックなアセットまで幅広いアセットを販売しております。
それらのアセットをちぐはぐな印象を与えないよう選ぶと
アセットが見つからないことがあるので
追加の要素を考えるときはアセットを先に決めておくと没にすることが減ります。

まとめ

エンジニアはゲームシステムの実装だけに集中出来ると書きましたが
個人開発の場合
プログラムは勿論のこと企画、レベルデザイン、アセット選びなどやることは多く
チーム開発が出来る環境があるならば積極的にチームで開発を行うと良いと思います。

U-22プログラミング・コンテスト2015への参加

完成したゲームをU-22プログラミング・コンテスト2015へ応募したところ
CSAJ会長賞をいただきました。

学内ゲームジャムに参加しました

学内ゲームジャムの概要

シンガポールとフランスの留学生を交えたインターナショナルゲームジャムです。
イベント期間は8/6(木),8/7(金),8/10(月),8/11(火)の4日間で休日も含めれば6日間という
一般的なゲームジャムと比べ長期間なイベントでした。
休日を除く、ゲームジャム期間中の10:00~17:30は学校が開放され各々の作業が出来ます。

8 / 6 (木)

10:00 ~ 10:30 テーマ発表 / チーム発表

テーマ発表

テーマはSolid(固体) / Liquid(液体) / Gas(気体)の中から2つ以上を含んだ作品というものでした。
このテーマと条件から物質の状態変化を連想するチームが多かったので
もう少し抽象的なテーマにするか、3つのテーマの中から1つを選ぶ条件にする方が
独創的で意表を突くような作品が増えると感じました。

チーム発表

参加者は約50人で、7割が日本人、3割が留学生でした。
日本人のプログラマは2年生と1年生が中心で
3年生は技術的なアドバイスをするサポート役という形です。
1チーム6~7人で7チームが作られ私たちのチームは、
私を含む2年生のプログラマ2人、1年生のプログラマ2人
2年生のアーティスト1人、フランス人の2年生のアーティスト1人の6人チームでした。

10:30 ~ 14:00 自己紹介 / 企画会議

自己紹介

自己紹介はフランス人の方がいらっしゃったので
ボランティアとして来られた外国語専門学校の方を介する形で行いました。

企画会議

フランス人の留学生にはゲームデザイナーを専門としている方もいるのですが
私たちのチームにはいなかったので全員で英語限定のブレインストーミングをしました。
フランス人の方にも理解していただけるよう全員が電子辞書やGoogle翻訳と睨めっこしながら
企画を出し合う姿は面白かったです。
私たちのチームも物質の状態変化を利用したゲームが多く企画されましたが
中盤に笑いながら意見を出し合った
ペンギンが縄張り争いをする3D対戦アクションゲームになりました。
テーマからは固体 → 氷 → ペンギン、液体 → 水 → 海、気体 → ガス → 爆発のような
要素がゲームに盛り込まれています。

14:00 ~ 17:30 プログラマの役割分担 / デザインの擦り合わせ

プログラマの役割分担

開発に用いるゲームエンジンフレームワークは自由でしたがUnityが推奨されていたので
結果的には全チームがUnityを採用することになりました。
ですが前述した通り
プログラマは2年生と1年生が中心なので全員がUnityを扱える訳ではありませんでした。
訊いてみると私以外はUnityを少し触っただけと言いましたが
主催者の1人の先生から、1年生にもスクリプトを書かせてあげて欲しいと言われていたので
私と1年生のプログラマの2人でスクリプトを書くことにしました。
1年生にはタイトルの演出とリザルトの演出をお願いしました。
2年生のプログラマの方には8/7(金)の15:00~の中間発表のプレゼン資料をお願いしました。
もう1人の1年生のプログラマDTMをやっている方だったので
中間発表のプレゼンテーションと音素材の収集をお願いしました。

デザインの擦り合わせ

アーティストの方々はペンギンのデザインを固めていました。
f:id:koma2961:20150814232528j:plain
上の画像はペンギンのデザインを擦り合わせていた時のものではありませんが
このようなデザインになりました。
企画の補足をさせていただきますと、星のカービィ64ミニゲームのおちおちファイトに
アイテム要素を追加した感じの3D対戦アクションゲームです。

18:00 ~ 06:30 自宅で開発

アーティストのデザイン画を見ると開発へのモチベーションが上がるものです
帰宅して早速開発を開始しました。
今回のゲームはステージのブロックのデータをしっかりと管理してあげる必要があるので
最初の設計は少し時間が掛かりましたがそのおかげで開発終了まで困ることはありませんでした。

8 / 7 (金)

10:00 ~ 15:00 各々の作業

日本人のアーティストの方はペンギンのモデリング
フランス人のアーティストの方は基本武器とアイテムのモデリングをされていました。
基本武器は魚を模した銃で前方のブロックを時間差で破壊します。
アイテムは広範囲のブロックを破壊するハリセンボンの爆弾や
画像ではシャチを模した、基本攻撃を強化したビックフィッシュガン
前方のブロックを一瞬で破壊するハンマーヘッドシャークのハンマー
相手を後方に飛ばすタコの扇風機、ブロックを溶かす雨を発生させる雨雲発生装置がありました。
アイテムボックスは貝殻で、拾うとアイテムをランダムで取得します。
8/11(火)にはアイテムボックス出現時とアイテムボックスがキラキラ光るパーティクルも
作っていただきました。

15:00 ~ 17:30 中間発表

4つのコントローラーを繋いで移動と基本攻撃が出来る部分まで実装したので
プレゼンと実機のデモを行いました。
余談ですが、複数のコントローラーの入力を取得する場合
Gamepad Inputというアセットがオススメです。
f:id:koma2961:20150815001507p:plain
このアセットを使用するとInput Managerが書き換わり
uGUIのEventSystemでHorizontalとVerticalがないと警告が出るので
Edit > Project Settings > Inputから追加し直しましょう。

8 / 8(土)

10:00 ~ 03:00 自宅で開発

この時点ではペンギンやブロックのモデルがないので
SDユニティちゃんとCube World Level Building Setを使用していました。
f:id:koma2961:20150815002530p:plain

8 / 9 (日)

10:00 ~ 18:00 コワーキングスペースで開発

予定が空いているチームメンバー4人でベースキャンプ名古屋で開発しました。
ベースキャンプ名古屋は月末にUnity勉強会を開催しています
先月はUnreal Engine4勉強会がありました。

昼食は驛麺通りで冷やし山葵らーめんを食べ、フランス人の方と「 Very Spicy!! 」と言いつつ
Google翻訳を使いながら学校の話やゲーム会社の話に花を咲かせました。

午後にフランス人の方が基本武器とアイテムとブロックのモデリングを完了させて
untiypackage形式にして渡して下さいました。
フランス人の方はプログラムに対する理解もあり、Shader Forgeも扱える非常に優秀な方でした。
f:id:koma2961:20150815004857p:plain
ペンギンやアイテム、海の波打つ表現は全てShader Forgeでやっていただきました。

8 / 10 (月)

10:00 ~ 17:30 各々の作業

日本人のアーティストの方からペンギンのモデルとアニメーションをいただきました。
アーティストの方々の仕事を目の当たりにしてより一層モチベーションが上がりました。
1年生のプログラマの方にタイトルとリザルトに加え
お世話になった外国語専門学校の方の名前を載せたいということで
クレジットも追加したものを作成していただいて、マージしました。

17:30 ~ 10:00 自宅で開発

フランス人の方がハリセンボンの爆弾のパーティクルを
untiypackage形式にして渡して下さいました。
もう1人の1年生の方から学校でいただいた音素材を追加したり
日本人のアーティストの方に描いていただいたGUIを追加しました。
また、リザルトのランキングや操作性を改良しました。

8 / 11 (火)

10:00 ~ 13:00 各々の作業

基本的な部分は完成しましたが、アイテムの実装がまだ終わっていませんでした。
アイテムボックスとアイテムの実装を大急ぎで行いました。
アイテムボックスはプレイヤーと同様、ブロックが落ちると一緒に落ちるようにしました。
最終的にアイテムはハリセンボンの爆弾のみを実装しました。
5回程ゲームジャムに参加しているので
最初の段階から現在の私のスキルでどこまで実装出来るのかは
大凡把握しておりましたので、その旨はアーティストの方々に伝えておりましたが
やはり作成していただいたアセットを全て活かせなかったことに
申し訳ない気持ちと悔しさが込み上げました。

13:00 ~ 16:30 最終発表

Aチームから順に10分間のプレゼンを行いました。
私たちのチームはGチームで審査対象のチームでは最後のチームとなります。
私たちのチームの後にはゲストとして参加した3年生のチームの発表がありましたが
私たちの作品と同じく4つのコントローラーを繋ぐ3D対戦アクションゲームで驚きました。
最終学年の中でも選りすぐりの方々ということもあり、素晴らしい作品でした。

以下の画像が私たちの作品のスクリーンショットです。
f:id:koma2961:20150815022028p:plain
タイトル

f:id:koma2961:20150815022031p:plain
ゲーム

f:id:koma2961:20150815022034p:plain
リザルト

17:00 ~ 17:30 結果発表

私たちの作品が大賞をいただくことが出来ました。
これもひとえに、素晴らしいチームメンバーに恵まれたおかげです。

【Unity】 Camera Path Animatorの使い方

Camera Path Animatorの用意

まずはUnityを起動してAsset Storeを開き、Camera Path Animatorをインポートします。
f:id:koma2961:20150801150412p:plain
インポートが終了したら準備完了です。

Camera Path Animatorの使い方

インポートが終了するとCameraPath3というフォルダがプロジェクトに追加されます。
今回はカメラのアニメーションについて説明したいと思います。

カメラのアニメーション

空のGameObjectを作成して任意の名前(画像ではCameraPathObject)を付け
CameraPath3 > ScriptsからCameraPath.csとCameraPathAnimator.csをアタッチします。
f:id:koma2961:20150801155556p:plain
f:id:koma2961:20150801160205p:plain
すると"Animation has no target to animate"という警告が出ます。
これはアニメーションを行う対象が設定されていないため警告が出ているので
Main Cameraをドラッグ&ドロップします。
f:id:koma2961:20150801162133p:plain
実行するとデフォルトのU字のパスに沿ってカメラが移動します。
f:id:koma2961:20150801195309g:plain
何も配置していない状態でカメラが移動していても分かり辛いので
Halloween Level Kitを配置しました。
f:id:koma2961:20150801195554p:plain

Path Pointの追加

f:id:koma2961:20150801205839p:plain

  • Insert New Point

Point nとPoint n+1の中点にPath Pointを追加します。

  • Add Path Points

Sceneビューのパスをクリックした位置に新しいPath Pointを追加します。

  • Add Point to End / Add Path Point to End of Path

終点と殆ど同じ座標に新しいPath Pointを追加します。

Path Pointの座標を変更する

変更したいPath Pointを選択してPoint Positionに任意の座標を入力します。
f:id:koma2961:20150801211853p:plain

5つの補間アルゴリズム

f:id:koma2961:20150801213250p:plain

  • Bezier

ベジェ曲線、コンピュータ上で滑らかな曲線を描くために広く利用されています。
f:id:koma2961:20150801214018p:plain

  • Hermite

エルミート曲線、大体最短距離を描くので
ベジェ曲線のような大きく回り込むような曲線を描くことが出来ません。
TensionとBiasの項目に-1 ~ 1の値を入力することで伸張や偏りを持たせることが出来ます。
(画像ではTension : -1 Bias : 0)
f:id:koma2961:20150801220115p:plain

  • Catmull Rom

Catmull-Romスプライン曲線、エルミート曲線の一種です。
f:id:koma2961:20150801220810p:plain

  • Smooth Step

入力された重みに基づいて2つの値を補間する関数、MSDNOpenGLの両方で、
Hermite補間を使用して実装するように要求されているみたいです。
U字では線形補間と見分けが付かないです。
f:id:koma2961:20150801222439p:plain

  • Linear

線形補間、コンピュータグラフィックスを含む多くの分野で非常に広く利用されています。
f:id:koma2961:20150801223011p:plain

注視対象を設定する

f:id:koma2961:20150801224723p:plain
Orientation ModeをTargetに変更します。
f:id:koma2961:20150801225648p:plain
すると"Orientation target is null"という警告が出ます。
これは注視対象が設定されていないため警告が出ているので
インポートしたSDユニティちゃんをドラッグ&ドロップします。
f:id:koma2961:20150801233932p:plain
実行すると常にユニティちゃんを注視するようにカメラが移動します。
f:id:koma2961:20150802010033g:plain

f:id:koma2961:20150802015548p:plain
このコンテンツは、『ユニティちゃんライセンス』で提供されています。

【Unity】 スクリプトからSkyboxを変更する

Skyboxの用意

まずはUnityを起動してAsset Storeを開き、Skyboxのアセットをインポートします。

f:id:koma2961:20150731201424p:plain

今回は無料のSky5X Oneを使用します。

インポートが終了したら準備完了です。

f:id:koma2961:20150731201439p:plain

スクリプトからSkyboxを変更する

Skyboxを変更するためのスクリプトを作成します。

//__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/
//
// ▼ File		SkyboxChanger.cs
//
// ▼ Brief		Skyboxを変更するスクリプト
//__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/
using UnityEngine;
using System.Collections;

public class SkyboxChanger : MonoBehaviour
{
    // Skyboxのマテリアル
    public Material skybox;

    void Start()
    {
        // Skyboxを変更する
        RenderSettings.skybox = skybox;
    }

    void Update()
    {
    }
}

スクリプトを任意のGameObject(画像ではMain Camera)にアタッチします。
f:id:koma2961:20150731220828p:plain
f:id:koma2961:20150731221504p:plain
するとインスペクターにSkyboxの項目が追加されるので先ほどインポートした任意のSkyboxを
ドラッグ&ドロップします。
f:id:koma2961:20150731224216p:plain
実行するとアタッチしたSkyboxに変わっています。
f:id:koma2961:20150731224413p:plain

エディタからSkyboxを変更する

Unity4のときはEdit > Render SettingsからSkyboxを変更出来ましたが
Unity5ではWindow > Lightingに変わりました。
f:id:koma2961:20150731225513p:plain
Environment Lighting > Skyboxに先ほどインポートした任意のSkyboxを
ドラッグ&ドロップすることで変更することが出来ます。
f:id:koma2961:20150731230046p:plain