TAKOYAKING’s blog 一覧

TAKOYAKING’s blog

たこ焼き系

クラッシュオブクランズ(Clash of Clans)のバーバリアンの絵にチャレンジ

絵の練習のために一番遊んでいるゲーム、クラッシュオブクランズ(Clash of Clans)のキャラクターであるバーバリアンを描いてみました。
3年ほどクラクラで遊んでいますので、一番簡単そうなバーバリアンにチャレンジしてみます。
(Photoshopで描いています。)

参考画像のバーバリアン*1
f:id:TAKOYAKING:20160119175606j:plain



完成作品f:id:TAKOYAKING:20160119175648p:plain




バーバリアンができるまでの軌跡

1 ラフで初見
f:id:TAKOYAKING:20160119180025p:plain

誰?
まじですか・・・
正直この時点で心が折れかけました・・・


2 気を取り直してもう一度
f:id:TAKOYAKING:20160119180134p:plain

少し、バーバリアンに近づきました!
(良かった!)

でも少し口がの傾きがおかしい気がします。


3 口をPhotoshopの力で回転させてみた。
f:id:TAKOYAKING:20160119180311p:plain

少し回転させるだけでぐっと良くなった気がします!


4 基準線を導入
f:id:TAKOYAKING:20160119180414p:plain

やっぱり基準となる線があるとないとでは全然描きやすさが違うので、導入してみました。
Digital Tutorsで習ったことのうちの一つです。


5 基盤のバーバリアン完成
f:id:TAKOYAKING:20160119180539p:plain

最初に描いたバーバリアンよりも格段に良くなった気がします。
左目は気持ち少し小さく描くようにDigital Tutorsで習ったので、小さめに描いています。
さすが3回目!


6 影を入れて立体感を演出
f:id:TAKOYAKING:20160119180656p:plain
影はどこに入れたら良いのかまだあまりよくわかっていませんが、見よう見まねで入れていきます。
Digital Tutorsで
・目の部分の上下の白目に影を入れること
・目の瞳に白い丸いものを入れること
を習ったので、それも地味に入れてます。


7 装飾のよだれをつける
f:id:TAKOYAKING:20160119180944p:plain

消しゴムでよだれの部分を消していき、描きました。
正直白い部分の描き方がわかりません。


8 全体的に濃くして、完成f:id:TAKOYAKING:20160119181044p:plain



1と比べるとだいぶ良くなりました。1の時点で挫折しなくてよかった!
まだまだへたくそですが、完成するとモチベーションが一気に高くなりました!
やった!


参考画像*1
f:id:TAKOYAKING:20160119175606j:plain

Beforef:id:TAKOYAKING:20160119180025p:plain

After
f:id:TAKOYAKING:20160119181044p:plain


以上

Goodbye baseball!

*1「このコンテンツはSupercellに関係がなく、またSupercellによって保証され、後援され、特別に承認されたものではなく、Supercellには一切責任がありません。ファンコンテンツにおけるSupercell知的財産権Supercellファンコンテンツ利用規 www.supercell.com/fan-content-policy.に従うものとします。」

Photoshopでアプリアイコンにサンバーストを入れて、集中線効果を出してみた!

アプリアイコンの参考になるアプリを探しているとサンバーストを入れてるアプリアイコンがあったので自分のアプリにもPhotoshopでサンバーストを入れてみました。
(サンバーストととは集中線のように太陽型線になっている線のことです。)
参考アプリ
City 2048 - Google Play の Android アプリ

完成品
Digital Puppet - 頭脳派パズルゲーム - Google Play の Android アプリ

f:id:TAKOYAKING:20160118163232p:plain


作り方

作業の流れ

  1. Photoshopファイル作成
  2. グラデーション(Gradiant Tool)
  3. フィルターの波形(Filter Wave)
  4. フィルター極座標(Filter Polar Coordinates)

です。

作成
1 Photoshopファイル作成(Gradiant Tool)f:id:TAKOYAKING:20160118180302p:plain
今回はFile(ファイル) -> New(新規作成)から
Width(幅) 1024
Height(高さ) 1024
Resolution(解像度) 200
で作成してみました。


2 グラデーション(Gradiant Tool)

グラデーションツールを選択します。
f:id:TAKOYAKING:20160118180427p:plain

ココを選択して、グラデーションの設定をします。
f:id:TAKOYAKING:20160118180454p:plain

グラデーションは透明になるように設定します。
f:id:TAKOYAKING:20160118180551p:plain

その設定のまま、キャンバスに上から下に垂直にドラッグして、グラデーションをかけます。
(シフトキーを押せば垂直になります。)
このような感じになります。
f:id:TAKOYAKING:20160118180825p:plain


3 フィルターの波形(Filter Wave)

上部のタブからFilter(フィルター) -> Distort(変形) -> Wave(波形)を選択します。
f:id:TAKOYAKING:20160118181058p:plain

Wave(波形)の設定を画像の通りに設定します。
Wavelength(波長)で一つの波の幅を調節できます。
今回はmin 110 max 111に設定しました。
f:id:TAKOYAKING:20160118181217p:plain

このように仕上がると思います。
f:id:TAKOYAKING:20160118181412p:plain


3 フィルター極座標(Filter Polar Coordinates)

上部のタブからFilter(フィルター) -> Distort(変形) -> Polar Coordinates(極座標)を選択します。
f:id:TAKOYAKING:20160118185955p:plain

OKを押して完了させましょう。
f:id:TAKOYAKING:20160118190040p:plain

仕上がり具合はこちら。
f:id:TAKOYAKING:20160118190144p:plain

コレを自分のアプリアイコンに適用した結果がこちら

Before
f:id:TAKOYAKING:20160118190341p:plain

After
f:id:TAKOYAKING:20160118163232p:plain


集中線効果が出てて少しはアイコンにデーンみたいな雰囲気が出てるような気がします!

以上

Goodbye baseball!

Unityでレビューを書いてもらうためにゲーム内からGoogle Playに遷移する方法

Unityからレビューを書いてもらうためにGoogle Playに遷移する方法を調べていたら簡単にできました。

遷移

Application.OpenURL(url);

Google PlayのURL

string url = "market://details?id={your_id}"

marketの部分をhttpにするとブラウザか、Google Playかをユーザにゆだねることになります。

完成した画面がこちら
Digital Puppet - 頭脳派パズルゲーム - Google Play の Android アプリ
f:id:TAKOYAKING:20160115030622p:plain


以上


Goodbye baseball

Unity5.1でAndroidビルドを行うとREAD_PHONE_STATEのパーミッションが問答無用でつけられてしまう不具合

Digital Puppet - デジタル パペットというゲームを作っているときにUnity5.1でAndroidのビルドを行うと、READ_PHONE_STATEの権限が勝手につけられてしまう問題がありました。
READ_PHONE_STATEがあるとGoogle Playで以下のように電話番号や端末固有ID等の情報を取得と表示されてしまうのでダウンロードしようと思っている人にはデメリットでしかありません。

f:id:TAKOYAKING:20160114204044p:plain:h350

実際にUnity forumではこの権限を取り除きたいという質問がありました。
forum.unity3d.com

この権限を取り除く一番簡単な方法はUnity5.1をUnity5.3にアップグレードすることです。
これによって、AndroidのREAD_PHONE_STATEの権限がつけられることはありません。
本当は互換性があるかどうか心配だったので5.1のまま作業したかったのですが、結果的に5.3に上げてよかったです。

以下は5.3にしたときにコンパイルエラーになったところです。
・Color.TryParseHexString
-> UnityEngine.ColorUtility.TryParseHtmlString
forum.unity3d.com


非推奨になった箇所
・Application.LoadLevel(sceneName);
-> SceneManager.LoadScene(sceneName);


この権限なくなってよかった^^


以上

Goodbye baseball!

Unityでゲームを作っていたらまたPythonでつまらないものを作ってしまった

またUnityから脱線して、つまらないものをPythonで作ってしまいました。


経緯
UnityでDigital Puppet - デジタル パペットというゲームのステージを作っていたところ、ステージの並び順が気に食わなくなってしまいました。
↓こんなゲーム
f:id:TAKOYAKING:20160106232945p:plain


難易度順に並び替えようと思ったものの、並び替えるにはセーブデータ、ステージ情報データ、ステージ画像データの3つを並び替えないといけないことに気づき(面倒くさい・・・)、もっと直感的なGUIベースの並び替えがしたいと思って、気づいたら、つまらないものをPythonで作ってしまっていました。


完成品f:id:TAKOYAKING:20160110061131p:plain
並び替えたいステージをDrag&Dropで並び変えれます。

必要物
Python
・Html, CSS, jQueryUI
・Unityの対象ファイルを再ImportするEditor拡張

GUI部分はHTMLで、データ並び替えのスクリプトPythonで処理しています。

処理の流れ
1 ブラウザー上でステージを並び替える
2 並び替えた結果をテキストに保存
3 Pythonでその結果を読み込む
4 Pythonでその結果をもとにクリアデータ ステージ画像 ステージ情報データを並び替える
5 画像の並び替えをしたのでUnity上で画像を再Import(Unityの画面に行くと自動で再Importしてくれるかもしれませんが、してくれない場合もあります。その場合強制再Importを実行する必要があります。)

ソースコード
1,2は割愛・・・
まず5から・・・
5の指定フォルダを再ImportするEditorは以下の通り

using UnityEngine;
using System.Collections.Generic;
using UnityEditor;
using System.Text.RegularExpressions;
using System.IO;

public class ReimportAfterSortStage {

	[MenuItem( "Tools/Reimport/AfterSortingStages", false, 100 )]
	public static void ReimportUI()
	{
		var pathFormat = "Assets/Resources/{0}/{1}";

		string stageJsonDataPath = string.Format( 
pathFormat, "StageJsonData", "Stages");
		string stagePicPath = string.Format( 
pathFormat, "Textures", "StageSelect/StagePics");
		
		ReimportDirectory( stageJsonDataPath );
		ReimportDirectory( stagePicPath );
		EditorUtility.DisplayDialog("Reimport", "reimportが完了しました", "OK");

	}
	static void ReimportDirectory(string path )
	{
		if ( Directory.Exists( path ) ){
			AssetDatabase.ImportAsset( 
path, ImportAssetOptions.ForceUpdate| ImportAssetOptions.ImportRecursive| ImportAssetOptions.DontDownloadFromCacheServer );
		}
		else {
			Debug.LogError( string.Format( "Directory not found {0}", path ) );
		}
	}
}

対象フォルダの中身を丸ごと再ImportしたかったのでImportAssetOptions.ImportRecursiveをつければ丸ごとImportしてくれました。

AssetDatabase.ImportAsset(
 path, ImportAssetOptions.ForceUpdate|
 ImportAssetOptions.ImportRecursive| 
ImportAssetOptions.DontDownloadFromCacheServer );

5はいらないかもしれませんが、たまにimportしてくれないときがあるのでそうなったらこのEditor拡張が役に立ちます。


では次に3,4のPythonコード
1 ファイル取得
まず結果の並び替えの対象のファイルを取得するクラスを作成します。
対象ファイルの種類はクリアデータ、ステージ情報データ、ステージ画像の3つです。
クラス設計
親のベースクラスがあり、その派生クラスとしてクリアデータ、ステージ情報、ステージ画像のファイルパスを読み込むクラスがあります。

・BaseGlobFile


・StageDataGlobFile
・ClearDataGlobFile
・StagePicGlobFile
f:id:TAKOYAKING:20160110101302p:plain

親クラスではoverrideしてほしい関数は全て親の関数でraise Exceptionが記述されています。

def get_parent_dir_path(self):
        '''ex parentPath = "/Users/hogehoge
/Library/Application Support/DefaultCompany/takoyaki/storage"
'''
        raise Exception("must be overrided")

Pythonではabcクラスを使ってabstractクラスを作成できるみたいですが、この例外を投げる記述でabstractのような振る舞いをさせるのが今のところ好きです。


ソースコード

import os
import glob
import subprocess
import json


class StaticVars:
    MAX_WAVE = 10
    EXT_TEMP_SUFFIX = "_"
    EXT_JSON = ".json"
    EXT_META = ".meta"
    EXT_PNG = ".png"


class BaseGlobFile:

    def __init__(self):
        self.paths = self._glob_filepaths_sorted()

    def get_files(self):
        return self.paths

    def get_parent_dir_path(self):
        '''ex parentPath = "/Users/hogehoge
/Library/Application Support/DefaultCompany/takoyaki/storage"
'''
        raise Exception("must be overrided")

    def _glob_filepaths_sorted(self):
        # path
        filename = "*-*{ext}".format(ext=self.get_ext())
        file_glob_path = os.path.join(
            self.get_parent_dir_path(),
            filename)
        # glob
        filepaths = glob.glob(file_glob_path)
        # sorted
        return sorted(filepaths, key=self._to_order)

    def _to_order(self, path):
        basename = os.path.basename(path)  # 1-3
        level, wave = map(int, basename.replace(self.get_ext(), "").split("-"))
        order = level * StaticVars.MAX_WAVE + wave
        return order

    def get_ext(self):
        raise Exception("must be overrided")


class StageDataGlobFile(BaseGlobFile):

    def get_parent_dir_path(self):
        return "/Users/takoyaki\
/Projects/takoyaki/takoyaki/Assets/Resources/StageJsonData/Stages"

    def get_ext(self):
        return StaticVars.EXT_JSON


class ClearDataGlobFile(BaseGlobFile):
    def get_parent_dir_path(self):
        return "/Users/takoyaki/Projects/DigitalPuppetDB/storage/Stages"

    def get_ext(self):
        return StaticVars.EXT_JSON


class StagePicGlobFile(BaseGlobFile):
    def get_parent_dir_path(self):
        return "/Users/takoyaki/\
Projects/takoyaki/takoyaki/Assets/Resources/Textures/StageSelect/StagePics"

    def get_ext(self):
        return StaticVars.EXT_PNG


2 ファイル並び替え
ファイル取得を取得してきた後はそれをもとに並び替えを実行します。

- 処理の流れ
1) ファイル取得
2) ファイル名を新しいファイル名に変更後いったん拡張子に.tmpを入れて保持する
3) その後全てのファイル名が新しいファイル名 + .tmpになったら全てのファイルの.tmpを外して完了

クラス設計
- メイン
f:id:TAKOYAKING:20160110101912p:plain
- Mix in
f:id:TAKOYAKING:20160110101959p:plain

このクラスも同様にoverrideしてほしい関数はbaseクラスで例外を投げます。
最初に思ったのがファイルを移動させるコマンドがshellのmvとgit mvで振る舞いを買えないといけないと思っていてmix in的なクラスを作成しました。
base

def exec_mv_cmd(self, src, dst):
        '''execute file move cmd
        ex git mv or os.rename?'''
        raise Exception("must be overrided")

mix in

class GitCmd:
    '''Mix in'''
    def mv(self, src, dst):
        if not self.DEBUG:
            cmd_str = "git mv {0} {1}".format(src, dst)
            subprocess.call(cmd_str.split(" "))
        else:
            print("src: {} -> dst: {}".format(src, dst))


class ShellCmd:
    '''Mix in'''
    def mv(self, src, dst):
        if not self.DEBUG:
            os.rename(src, dst)
        else:
            print("src: {} -> dst: {}".format(src, dst))

継承例

class SortStage(BaseSort, ShellCmd):
    def instantiate_glob_file(self):
        return StageDataGlobFile()

    def exec_mv_cmd(self, src, dst):
        super().mv(src, dst)

結局shellのmvだけで大丈夫でした・・・
最近の自分の多重継承の仕方はMix in的な書き方にとどめておくのが良いのかなと思っています。コンストラクタが絡んでくるとややこしさが倍増して怖いです。



ソースコード

import os
import glob
import subprocess
import json


class BaseSort:
    def __init__(self, sort_result):
        self.paths = self.instantiate_glob_file().get_files()
        # self.meta_paths = self.instantiate_glob_file().get_meta_files()
        self.sort_result = sort_result
        self.DEBUG = True

    def instantiate_glob_file(self):
        raise Exception('Must be overrided')

    def sort(self):
        self._sort(self.paths)
        # if self.meta_paths:
        #     self._sort(self.meta_paths)

    def _sort(self, paths):
        # temp
        for dstIdx, srcIdx in enumerate(self.sort_result):
            self._mv_temp(paths, int(srcIdx), int(dstIdx))

        # temp ext to normal ext
        self._mv_back_to_normal(paths)

    def _mv_temp(self, paths, srcIdx, dstIdx):
        ''''move to temp place
        ex .json(.meta) to .json_(.meta_)'''
        # src
        src = paths[srcIdx]
        src_basename = os.path.basename(src)
        src_splitted_basename = src_basename.split(".")
        src_ext = ".".join(src_splitted_basename[1:])

        #dst
        dst_filename = self.to_temp_filename_by_order(dstIdx, src_ext)
        dst_dirname = os.path.dirname(src)
        dst = os.path.join(dst_dirname, dst_filename)

        #exec
        self.exec_mv_cmd(src, dst)

    def to_temp_filename_by_order(self, order, ext):
        level, wave = divmod(order, StaticVars.MAX_WAVE)
        return "{}-{}.{}{}".format(
            level + 1, wave + 1, ext, StaticVars.EXT_TEMP_SUFFIX)

    def _mv_back_to_normal(self, paths):
        '''move back to normal place
        ex .json_(.meta_) to .json (.meta)'''
        for i, v in enumerate(self.sort_result):
            path = paths[i]
            #src (tmp path)
            src = path + StaticVars.EXT_TEMP_SUFFIX  # .json -> .json_

            #dst (org path)
            dst = path

            #exec
            self.exec_mv_cmd(src, dst)

    def exec_mv_cmd(self, src, dst):
        '''execute file move cmd
        ex git mv or os.rename?'''
        raise Exception("must be overrided")


class GitCmd:
    '''Mix in'''
    def mv(self, src, dst):
        if not self.DEBUG:
            cmd_str = "git mv {0} {1}".format(src, dst)
            subprocess.call(cmd_str.split(" "))
        else:
            print("src: {} -> dst: {}".format(src, dst))


class ShellCmd:
    '''Mix in'''
    def mv(self, src, dst):
        if not self.DEBUG:
            os.rename(src, dst)
        else:
            print("src: {} -> dst: {}".format(src, dst))


class SortStage(BaseSort, ShellCmd):
    def instantiate_glob_file(self):
        return StageDataGlobFile()

    def exec_mv_cmd(self, src, dst):
        super().mv(src, dst)


class SortClearData(BaseSort, ShellCmd):
    def instantiate_glob_file(self):
        return ClearDataGlobFile()

    def exec_mv_cmd(self, src, dst):
        super().mv(src, dst)


class SortStagePic(BaseSort, ShellCmd):
    def instantiate_glob_file(self):
        return StagePicGlobFile()

    def exec_mv_cmd(self, src, dst):
        super().mv(src, dst)

実行ソースコード

########## Exec ###########
def read_sort_result_json():
    path = "/Users/takoyaki\
/Projects/takoyaki/Tools/sort/builda/sort_result.json"
    with open(path, mode="r", encoding="UTF-8") as f:
        sort_result = json.loads(f.read())
        return sort_result


def main():
    # sort result
    sort_result = read_sort_result_json()

    # sort
    SortStage(sort_result).sort()
    SortClearData(sort_result).sort()
    SortStagePic(sort_result).sort()

if __name__ == "__main__":
    main()


感想
2日かかったので手作業で並び替えをやったほうが速かったのは内緒です・・・
(2回目以降の並び替えはコレを利用してかなり楽になりました!)
なぜコレを作ったかというとpythonをさわりたかったから・・・

またpythonでつまらないものをつくってしまいました・・・orz


以上

Good bye baseball

UnityでClash of Clansのようなフィールドを作るには

Clash Of Clans(以下クラクラ)のような村を育てるゲームでは通常以下のようなフィールドの見た目になります。

*1

f:id:TAKOYAKING:20160109043902j:plain

 

こういうゲームのフィールドの特徴は4角形を45度回転させたような見た目で、奥行きはあるのに、遠近法がなく、どこから見ても同じ形に見えます。

こういうゲームをIsometric Game (正式名かどうかはわかりません)と言うらしいです。

 

Isometric GameをUnityで作る方法は2通りあるらしいです。

1 Unity3Dでカメラをorthographicにしていい感じにカメラを回転させる

2 Unity2Dでフィールドを作るときにisometricになっている画像を並べていく

 

クラクラは1なのか2で作られているのかはわかりませんが、フィールドは1で作って大量に生成されるキャラクターはisometricな画像(2D)で作っているのではないかと思っています。こういった種類を特に2.5D gameというらしいです。

 

なのでもし、クラクラのようなフィールドを作成したい場合はisometricで検索してもらえばかなりの情報にたどり着けるはずです。(最初はこの用語が知らず、たどり着くのに苦労しました・・・)

 

僕が作ったゲーム (Digital Puppet - デジタル パペット)では2の2Dで作っていく方法を採用しました。

画面は以下のような感じです。

f:id:TAKOYAKING:20160106232945p:plain

プレイしていると奥行きがあって、3Dのように思ってしまうのですが、実は全て2DのSprite画像です。

 

先に2を選択して、後にわかったメリットとデメリットを言います。

メリット

Photoshopで完結すること(ステージ、キャラなど全てBlenderを使用すること無くPhotoshopさえあれば作成できてしまうこと)

 

デメリット

・衝突判定の物理演算がかなり、面倒 (3Dに見えるけど3Dに見える画像をうまく並べただけなので、3Dのように見せるために移動と衝突判定の計算を自前で行わなければならない)

 

・横、奥行きに加えて高さが考慮される場合には画像の重なり順がかなり大変(言っている意味がわからないかもしれませんw)

 

 

デメリットはありつつもPhotoshopだけで作れてしまうのはかなりお手軽なので2を採用して良かったと思います。

 

 

Isometric Gameの作り方

 1 Isometric画像の作成 (Photoshop)

作り方はこの動画を参考にしてください。

www.youtube.com

 

動画では

1 基準となる線を作成

2 その線に沿って、画像を描く

 

以下のようにできるはずです。

1 基準線

f:id:TAKOYAKING:20160109052856p:plain

 

2 画像作成 (Digital Puppet - デジタル パペットのステージのタイル)

f:id:TAKOYAKING:20160109053131p:plain

 

 

これで準備は完了です。

後はこのタイルをうまくUnity2Dでペタペタ貼っていくだけです。

 

一枚だけだとこんな感じ

f:id:TAKOYAKING:20160109054119p:plain

 

高さのあるタイルを作成してみると(6枚使用) 

f:id:TAKOYAKING:20160109054522p:plain

 

一点だけ注意点が描画するSpriteは常に一番手前の方から描画していかなければなりません。(Unityの都合?) 

f:id:TAKOYAKING:20160109055009p:plain

 

もしこの順番で描画しないとこうなります。

f:id:TAKOYAKING:20160109055113p:plain

 さっきと画像の位置は全く同じですが描画順を間違えるとこうなります。

 

もう一つ気をつける点があります。

z軸は利用しなくても3Dのように見えますがz軸を利用したほうが今後キャラクターが移動して行くときにキャラとタイルがどちらが前面に描かれるべきかを実装する際にz軸が必要になってくると思います。

 

z軸を考慮した最終系をお見せします。

このステージを・・・

f:id:TAKOYAKING:20160109055824p:plain

 

 横から見ると・・・

f:id:TAKOYAKING:20160109060029p:plain

こんな感じに見えます。

 

z軸は手前から奥にかけて増減させ、水平方向で同じタイルは同じz軸の値にすればいいと思っています。

このような感じです。

f:id:TAKOYAKING:20160109060652p:plain

水平方向で同じz値を持っていることがわかると思います。

 

これで以上になります。

なかなかわかるまでが大変でした。

ココまでできれば後はキャラクターの移動のクラスを作成して、ごにょごにょコードを書いていく段階に移れると思います。

 

 

以上。

Good Bye Baseball

 

 

*1

「このコンテンツはSupercellに関係がなく、またSupercellによって保証され、後援され、特別に承認されたものではなく、Supercellには一切責任がありません。ファンコンテンツにおけるSupercell知的財産権Supercellファンコンテンツ利用規 www.supercell.com/fan-content-policy.に従うものとします。」

Digital TutorsでUnityを学び、Photoshopを学び、Blenderも学んだ

もし、UnityとPhotoshopBlenderを学びたいと思っている方がいらっしゃれば少しだけ自分が学習した方法を公開したいと思います。

 

この3つをどうやって学んできたかと言いますと

Digital Tutorsを利用しました。


Pluralsight - Your Creative Training Resource

 

Digital TutorsはCreative系の学習サイトです。

デザイン、ゲーム、モデリング、などなどです。

Pluralsightという会社に買収されて今はPluralsightの傘下になっています。

 

正直動画見ただけですごいと圧倒されてしまうのですが、その内容にウソ偽りはなく、動画に登場しているものは全て授業として、受講できます。

 

たくさんの学習サイトがある中で最終的にコレに落ち着いた理由は

1 ハイクオリティで深い学習

他のサイトと比べて、深いところまで学習できます。

ただその分動画が長くなってしまうのがデメリットです。

もしかしたら挫折する方もいらっしゃると思いますw。

 

2 授業数

数は圧倒的! PluralsightとDigital Tutorsが合体したので授業数は凄まじいです!

 

3 金銭面

Basicは$29, Plusは$49(資料をダウンロードできる)

Unity,Photoshopなどは資料が必要なので$49になると思ってください。

ちょっと高いですが、許容範囲でした。(質重視なので!)

PluralsightとDigitalTutorsが合体したので一つの購読でどちらの授業も受けることができるのでまぁいいかなと思いました。

 

4 Learning Path

学習の道筋の参考となるカリキュラムで分類されています。

Photoshopの利用時ではかなり利用しました。

目的によっては特にいらない人もいるかもしれません。

 

5 将来趣味として

おじいちゃんになってもこういうサイトを通じて学習できたら楽しいだろうなと思いました。

 

逆にデメリットもあります。

1  授業が長い・・・

授業が深いということはそれだけ長くなります。しかもなぞりながら学習していると動画をちょくちょく停止しないといけないので、実際の授業時間はその2倍ほどかかると思います。

 

モデリングはMaya, 3dmaxなど持っていないとできない

動画に出てきたキャラ作成は確実にmaya, 3dmax, zbrush,などを必要とします。

mayaは何十万円もしますので手が出せません・・・

持っていないとできないというのは当たり前ですが、買うとしてもmayaか3dmaxどちらを買えば良いか悩むところです。

結局blenderの授業を受けることになりましたが、かなり授業数は少なめです・・・(最近はちょっとずつ増えてきているみたいです。)

 

3 身に付くのに相当の時間がかかる

PhotoshopBlenderは受講しましたが、やっぱりまだまだへたくその域を超えていませんw

もともとデザイン関係はいっさいやってこなかったので当たり前と言えば当たり前ですが・・・

相当量の学習が必要だと思います。

逆にUnityは結構一人でこなせるレベルまで到達できました。

(一度にunity, blender,photoshopを使いこなそうとするのがそもそも無謀でした。)

 

4 先生の好き嫌いがあるかも

自分はお気に入りのデザイナーの先生がいました。

かなりわかりやすくて、動作一つ一つ声にしてくれるので迷わずに授業をなぞっていけます。

逆に動作を声にしてくれない先生はあまり好きではありませんでした。

 

5 英語

授業は全英語になっています。(オーマイガー)

なので最低でも聞き取れるくらいにならないと正直授業をなぞることすら厳しくなってくると思います。(日本語だったら良いのにー)

ただ専門用語とかも出てくるのでそこらへんは慣れでOKだと思います!

 

 

DigitalTutorsを利用した経緯は元々プログラミングの会社に初めて入ったときに何か良い学習サイトないかなと思っていたときにPluralsightを発見しました。

それからちょくちょくPluralsightを利用していましたが、あるときUnityとかCreative系の学習サイトないかなと探していたときにPluralsightとDigitalTutorsが合併していることを知りました。(灯台下暗し!)

 

 

DigitalTutorsを利用してみた効果

Unityはそこそこ慣れました。

(実際にモバイルアプリDigital Puppetをリリースしました。)

Blender, Photoshopのデザイン系はそもそもデザインスキルが皆無だったために全然身に付きませんでした。(結構頑張ったんです)

 

今は金銭的に厳しいので購読はしていませんがDigitalTutorsは4ヶ月ほど、Pluralsightは2年間ほどずっとちょくちょく利用していました。

今後また学習したい時期にくれば再開すると思います。 

 

 

最後にDigitalTutorsのオススメ度は星5つです!!

 

以上。

Good bye baseball!!