お米 is ライス

C#やらUnityやらを勉強していて、これはメモっといたほうがええやろ、ということを書くつもりです

UnityでポストエフェクトをGLSLで書く方法

ポストエフェクトとは

ゲーム空間内のオブジェクトを、Vertex ShaderやFragment Shaderを通してスクリーンに描画する画像を作るという処理の後、スクリーンに描画される画像に対してさらに様々な効果を加えることをいう(あってるんかな)。
例えば、画面をぼかしたり、モザイクにしたり、エッジの検出をしたり、ということである。
Unityでは、この処理を実装するために一連の流れを作る必要がある。

ポストエフェクトをCgで書く方法

以下のサイトがわかりやすくてよい
fspace.hatenablog.com

ポストエフェクトをGLSLで書く方法

Shaderにはいくつかの言語があり、Unityで主に使われているのはCgという言語だ。上で紹介した記事のShaderScriptもCgを用いている。
しかし、あえてGLSLで書きたい!!という場合、どのようにして書けばよいのだろうか?探してみたがGLSLでポストエフェクトを書いているサイトは見当たらなかったので、上記の記事をGLSLに簡単に翻訳した。
それが以下である(本当に基本的な事柄のみ書いてある)。

Shader "Custom/PostEffectTestShader" 
{
    Properties 
    {
        _MainTex("Source", 2D) = "" {}
    }

    SubShader 
    {
        ZTest Always
        Cull Off
        ZWrite Off
        Fog{ Mode Off }
        
        Pass
        {
            GLSLPROGRAM
            
            uniform sampler2D _MainTex;
            
            #ifdef VERTEX
            out vec4 coord;
            void main()
            {
                coord = gl_MultiTexCoord0;
                gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;   
            }
            #endif
            
            #ifdef FRAGMENT
            in vec4 coord;
            void main()
            {
                gl_FragColor = texture2D(_MainTex, vec2(coord));
            }
            #endif
            
            ENDGLSL
        }
    }
}

UnityでGLSLを使う方法そのものについては

GLSL Programming/Unity - Wikibooks, open books for an open world

を参照されたい。

クオータービューとかの2Dゲームを作るときの描画順について(一般論およびUnityでの方法論)

初めに

この記事を開いたということはすでにお困りなのだと思うが、3次元座標を持つ2Dグラフィックのゲームを作る際、困ることの1つに「描画順」がある。
ここ数日間、うまいこといかなくて悩んでいたのだが、やっと望むような形になったので備忘録も兼ねてここに書いておく。

描画順の決め方

早速本題であるが、描画順の決め方というものをズバッと教えてやろう。

描画順に寄与する要素を列挙する

例えば、

  • そのオブジェクトがどのマス目にいるのか
  • そのオブジェクトの天頂までの高さはいくらか
  • そのオブジェクトがマス目内のどの位置にいるのか
  • そのオブジェクトが何であるか

みたいな感じである。

描画順に寄与する優先度で並び替える

今回の場合は先ほど列挙したとおりの順番であった。

それぞれの要素について、寄与度を数値化する

例えば、高さならば「何mか」など
ここで、優先度が一番高い要素でない場合は、数値の上限はきちんと定めておかなければならない.。
また、寄与度の数値は整数であったほうがよい(ような気がする)。

寄与度の数値を優先度に応じてオーダーを変えながら足し合わせていく

何が言いたいかというと、例えば、

  • 「どのマス目にいるのか」の寄与度が0~99
  • 「高さはいくらか」の寄与度が0~9
  • 「マス目内のどの位置にいるか」の寄与度が0~999
  • 「そのオブジェクトが何であるか」の寄与度が0~9

であった場合、7ケタの数字の特定のケタの部分に特定の寄与度の情報を埋め込んでいくということをする。
具体的に言うと、上から順に寄与度が「81、3、24、5」だったとすると、描画順の最終的な優先度は「8130245」という風にすればよい。

Unityでの実装方法

2Dモードにするやろ?そうするとPositionのZが小さくなるほど手前に表示されるようになる。
だから上の場合、Zに「-8130245」を指定するといい感じになる。値が大きすぎて嫌なんだったら定数で割ってあげればいい。

MoonSharpの紹介 ~ UnityでLuaを使ったイベントスクリプトを書きたい

初めに(飛ばして)

Unityの開発では主にC#が使われている。
C#とはコンパイル言語であり、Rubyなどといったスクリプト言語のようにテキストファイルに直書きしたソースコードを順繰りに実行するということはできず、いったんソースコードコンパイルしてから実行しなければならない。
コンパイルするためにはメソッドはクラスの下に置かれなければならないし、複数メソッドを実装するときにはそれらはユニークな名前でなければならない(当たり前ではあるが)。
これらのカッチリとした仕様こそC#C#たるゆえん(ほんまか)なのだが、時々このカッチリさが煩わしくなってしまう時がある。
そして多分、この記事にたどり着いた人はその辺を憂慮してググってるのだと思うのだけど、この記事ではそんなC#でもスクリプト言語を使える「Lua」というものをUnityで使用する方法について紹介する。

Luaとは(飛ばして)

スクリプト言語であり、C言語などに組み込まれることを想定して作られている。
つまりどういうことかというと、C言語などからスクリプトを読み込んで実行するために使うのだ。
この言語はゲーム開発においてイベントスクリプトを実装するときによく用いられているようで、どっかのゲーム会社の社員募集要項みたいなページにも名前が出ていたと思う。
もともとはCおよびC++向けに作られたものっぽいが、C#でも使えるようにあちこちでライブラリが開発されている。
「Unity Lua」みたいな感じでググると「NLua」や「KeaLua」などいくつかについて紹介されているのだが、これらを使ってみたところどうにも具合が悪かった(そもそも導入がめんどくさかったり、Luaで一番使いたい機能であろうCoroutine.yieldが使えなかったり)。
それでもなんとかUnityに導入して使っていたのだが、最近再び検索してみると、「MoonSharp」というものがあることを知った。
こりゃええやんと思って早速ダウンロードして使ってみたらやっぱりええやんってなったのでそれを今から紹介したいと思う。

MoonSharp

導入方法

  • UnityのAssets直下に「Plugins」フォルダを作る。
  • MoonSharpの公式ホームページに行って、「Download」を押した先で最新版のZIPファイルをダウンロードする。
  • 解凍して、「\interpreter\net35\MoonSharp.Interpreter.dll」をPluginsフォルダに突っ込む。
  • 終了!!

なんて簡単なんだ……

使い方

もっと

そんな欲張りな奴は公式のチュートリアル見るなり適当にググるなりして自分で勉強しやがれ(丸投げ)
そのうち頑張って書くかもしれない……

まとめ

MoonSharpでLuaを使って快適なイベントスクリプティングライフを!!

UnityでJson.NETを使う

動機

UnityでJsonをいい感じに扱えないもんかなぁとずっと思っていた。
ググるとUnityではMiniJsonやLitJsonを使うといいよと書いてあるのだが、Json.NETも普通に使える。

導入方法

http://www.newtonsoft.com/jsonへ行って、zipをダウンロードする。
zipファイルを解凍して「Bin\Net20\Newtonsoft.json.dll」をUnityのPluginsフォルダにコピペするだけ。

使い方

using Newtonsoft.Json

...

string json = JsonConvert.SerializeObject(object);
var object = JsonConvert.DeserializeObject(json);

みたいに普通に使える

string json = JsonConvert.SerializeObject(object, Formatting.Indented);

とかすると整形もしてくれて便利。
ListとかDictionaryとかも使える。

ただし、Vector3をシリアライズしようとしてみたところなんかエラーが出てしまった。
ここは要検証だけどできない理由がわからん……(なんか相互参照してるとか言われている?)。
今更だがこれはpublicなプロパティ(normalとか)もシリアライズしようとしているせいで、シリアライズの設定でうまいことするとうまくいく(うろ覚えで書いてるので詳しいことは勘弁)

独自クラスのシリアライズは普通にできる。
独自クラスのメンバ変数に独自クラスとか独自クラスのListとか配列とかがあっても大丈夫。


UnityでRotation(Quaternion)をうまく使いたい

前置き

Unityは3Dのゲームをゴリゴリ作ることができるように設計されたアレだ。
当然、三次元空間上での操作ができるようにいろいろ用意されている。
その中で根幹を担っているのが、すべてのゲームオブジェクトにくっついてくる"Transform"コンポーネントである。

uGUIが導入された最近では"RectTransform"コンポーネントというものもあるのだが、これとてTransformから継承したクラスに過ぎない。

そんな重要なものなのであるが、それゆえに(私を含む)Unity初心者がつまづきやすいところでもある。

Transformは「Position, Rotation, Size」という3つの項目で物体の3D空間上の状態を保持しているのだが、
なにが分かりにくいかというと、"Rotation"という項目なのである。

Rotationの難点

Rotationという項目は読んで字のごとく物体の回転状態を表している。
インスペクター上で見ると以下のようになっていて、回転が度数法(360度で一周するもの)を使って表示されている。
http://i.gyazo.com/5e91ca312cba46036a85bac95bd47be3.png

うむ、じゃあこの物体はX軸に90度、Y軸に30度、Z軸に10度回転しているのだな、と理解しそうになるのだがちょっと待ってほしい。
というかこのページはRotationで困っている人しか見ていないと思うのでもうわかっているとは思うが、そういう理解ではうまく動かないのである。
なぜなら(自分も詳しくないのだが)三次元空間上では物体を回転させるのに3つの情報だけでは無理なのである。
すなわち回転の軸を決めるベクトル(3次元ベクトル)と、どれだけ回転させるか(ただの数字)の情報が必要なのだ。

じゃあどないすんねん・・・、とここまで読んだ人々は嘆息するかもしれない、実際私もそうである。
敵の攻略にはまず敵を知ることから始めねばなるまい。

結論から言うと、Rotationは"Quaternion"という構造体であらわされている。
どういうことかというと以下の通りだ。

transform.rotation = new Vector3(x, y, z); //これは間違い

transform.rotation = new Quaternion(x, y, z, w); //これが正しい

これは四元数というもので、ごく簡単に言ってしまうと複素数を拡張したものである。
すなわち実数部分と虚数部分×3という4つのパラメータから成っている数なのだ。

(少し勉強したことのある人なら知っていると思うが、複素数というのは二次元上の回転を表すのに便利なことが知られている。
そして四元数複素数の拡張なのである。
すなわち三次元上の回転を表すのに便利だ。)

数学的な知識は皆無に等しいので突っ込んだ話はできないが、とにかく回転は4つのパラメータで表さないといけない。それなのにインスペクター上では3つのパラメータしか見えない。
これこそが、そもそもの混乱の原因なのである。
先述のRectTransformにも、見えているパラメータと実際に使われているパラメータが違うことが原因で生じる混乱があり、Unityではこういうことが多々あるので、インスペクターを信じ切ってしまうことはあまりよろしくないのである。

※追記
指摘があったので少し言い直しておくと、回転は一応3次元ベクトルで表すことができる。しかしこのときに注意しないといけないのが3次元ベクトルに対する回転は一意ではないということなのである。どの成分から回転させるかによって結果が変わってしまうのである。したがってインスペクタ上でX軸に何度、Y軸に何度、Z軸に何度と順番に指定した場合と、Z軸に何度、Y軸に何度、X軸に何度と指定した場合では異なる状態となってしまうのだ。


では、これからこのQuaternionとの付き合い方について見ていこう。

理解するな、関数を使え

正直言って人間は三次元空間上にへばりついた下等な生き物にすぎないので3Dのものを3Dとしてそのままとらえることはできない。二つのお目々でできることといえば、せいぜい二次元画像を取得し、それを脳みその中で頑張って処理し、3Dなものとして錯覚させることぐらいなのである。

だから三次元の回転を理解しようとしてはいけない。そもそも無理なのである。
ただ、数学や物理といったすさまじい学問をやっている人たちに限ってはそれを理解していて、数字に落とし込むことに成功している。我々のなすべきことはそういった賢人たちの知恵を借りることなのである。

そしてそういった賢人たちの知恵は、Unityでも「関数」として我々愚人たちが簡単にアクセスできるように用意されている。

Quaternionの使い方

それでも度数法で回転させたい

やっぱりQuaternionなんかめんどくさい、という人はこの項目を見るといい。

Quaternion.Euler

という関数がある。
使い方は至って簡単で、

transform.rotation = Quaternion.Euler(90, 30, 10);

という風に、度数法で表した回転の三次元ベクトルを突っ込んであげればいいのである。
思った通りに動いてくれるとは限らないが、たいていの場合はこれで事足りるだろう。

難しいことは考えずに、とにかくある方向を向かせたい

そういう人はこの項目を見てくれると助かる。

transform.LookAt

という関数がある。
たとえば(10, 20, 30)という座標に対して物体を向かせたいなら

transform.LookAt(10, 20, 30);

としてやればいい。
これで回転を全くしていない初めの状態で、Z軸正の方向を向いていたところが(10, 20, 30)という座標を向いてくれる(伝われ)。

ある軸の周りにいくらか回転させたい

このあたりからQuaternionを使わないとどうしようもなくなってくる。

transform.Rotate

という関数がある
これを使って、例えば(0, 1, 0)というベクトル(すなわちY軸)を軸にして90度回転させたい!と思うなら、

transform.Rotate(new Vector3(0, 1, 0), 90);

としてやればいい。Y軸などだけではなく、(0, 30, 60)といった変なベクトルでも同じことだ。
特にTransformは物体が向いている方向などを

transform.forward  //物体が向いている方向
transform.right  //物体から見て右側
transform.up       //物体から見て上側

という風にVector3で取得することができるので、たとえば戦闘機なんかがスピンするとき(伝われ)には

float angle = 1;
transform.Rotate(transform.forward, angle);

とでもしてあげればよいのである。

あるベクトルをある軸で回転させたい

たとえばキャラクターを動かすスクリプトを書きたいとき、InputうんたらとしてHorizontalの入力とVerticalの入力を受け取った時にどうすればよいのか。
キャラクターが常に正面を向いていればそのままpositionにそれらを足してやればいいのだが、そうでない場合そのままでは「キャラクターが向いている方向に対して右」などといったベクトルを取得するにはめんどくさい処理を書かないといけなさそうだ。

そこでQuaternionとVector3との掛け算を使う。
すなわち、(horizontal, vertical)という入力を受け取った時、Y軸に対してangle度回転しているキャラクターの正面に向かってvertical、右側に向かってhorizontal分進ませたいときは、

float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");

transform.Translate(Quaternion.AngleAxis(angle, Vector3.up) * new Vector3(horizontal, 0, vertical));

ということができる。
何をしているのかというと「Quaternion.AngleAxis(angle, Vector3.up)」という関数を使って、Y軸にangle度だけ回転させるQuaternionを取得し、それを「new Vector3(horizontal, 0, vertical)」というベクトルにかけることによってこのベクトルを回転させているのだ。
これが本来のQuaternionの使い方である。
順番は必ず「Quaternion × Vector3」の順でなければいけない。

ここではキャラクターの移動という目的に対して変な手段を用いて解決したが、この場合は先ほど紹介した"transform.forward"などを用いて簡単に、

transform.Translate(transform.forward * vertical + transform.right * horizontal);

という風に書ける、ということも追記しておく。

オブジェクトを連続的に回転させたい

Quaternion.Slerp

想像するならば、物音に気付いてこちらを振り返る敵や、戦闘機がスピンするとき。
一瞬でこちらを向くのではなく、ゆっくりと連続的に向いてほしいときは、

Quaternion from;
Quaternion to;
float t = 0;
public void Update()
{
    if(t < 1)
        t += Time.deltaTime;
    transform.rotation = Quaternion.Slerp(from, to, t);
}

などというふうにしてあげればよい。
そうすると"from"という角度から"to"という角度へ、"t"という割合だけ寄った角度を計算してくれる。ここで"t"は0から1までの少数である。
このサンプルでは、初め"from"という角度を向いていたオブジェクトが、1秒かけてゆっくりと"to"という角度を向く、という処理を行っている。


艦これの神話性

まえがき

艦これの巷でのはやり具合は、どうやら神話のそれと非常に似通っているなぁ、と近頃常々思うのであります。

これは別に、艦これのことを俗にいう「神曲」や、「神アニメ」などの言葉と同様に、「神コンテンツ」というある種崇拝的な持ち上げ方をしようとしているわけではなく、あくまで地面に這いつくばる人々がかつて持つようになった、「神話」と今現在くくられているものと共通点がある、ということを主張したいだけなのです。つまり、宗教と神話は関連性はあるものの、完全に重なるものではない、ということです。

私は工学部であり、そういう系の知識などは厨二病的有象無象を摂取することによって得られる知識と、いくつかそういう授業を大学でとっていた程度の知識しかないので、話半分に読んでいただきたい、ということを頭に入れておいてほしいと思います。

これから扱う神話について

「神」の定義は人それぞれによってさまざまであると思われます。ある人にとってはキリストであるし、ある人にとっては阿弥陀仏かもしれません。しかし、私は最近、日本神話にはまっておりまして、この記事を書くに至った理由もそこにあるわけなので、ここでは「神」というものを多神教の神、すなわち八百万の神、というものとしてとらえたいと思います。もちろん、私は神などは信じておりませんので、日本の神話こそが真実の物語だ、などというようなことはこれっぽっちも考えておりません。

ちなみに、艦むすの「むす」というのは「むすめ」の略ですが、「むすめ」というのは生み出すという意味の「むすぶ」と「め(女)」をくっつけたものです。「むすぶ」という言葉は日本神話において一番初めにでてくる三柱のうち、「たかみむすひのかみ」、「かみむすひのかみ」の二柱の名前の中にも含まれており、非常に縁起のいい言葉であり、「艦むす」という名前の響きのよさもそこにあるのかなぁと今適当に思ったりした次第です。「かんむす」が「おかん」だったらどうなっていたでしょうか

艦これのはやり方

艦これは2013年の4月にサービスが開始されました。私は、残念ながら最初期からのユーザーである、というわけではなく、当初に先輩がどこかにあげていた艦むすの画像を見ながら、「かわいい・・・!けど、こんなクソゲーっぽいもんめんどくさいしやらねー」とか言って、鼻をほじっていました。それから数か月たって、かなり話題に上がるようになっていた7月の中旬になんやなんや、と思って初めてしまったのがことの始まりで、その日のうちに木曾ちゃんという直球ドストライクな子に出会ってしまって、そのままズルズルと艦これとの関係は始まっていきました。

いや、わかってはいたんです。女の子のバリエーションをとにかく増やして、数打ちゃ当たるの法則で「ちょっとやってみただけ」の人を「もうちょっとやってみよう」にし、ついには「ちょっとだけお金払ってみようかな?」というところまで引っ張って来よう、というのがソーシャルゲームの常道であり、艦これもその例に漏れていないことを知っていました。
しかし、木曾ちゃんは可愛かった・・・。

しかし、そこまでならその辺の数多とあふれるソーシャルゲームとなんら変わりはありません。自分もすぐに飽きてやめてしまっていたことでしょう。
それではなぜ、艦これがこうも流行ってしまったのか、それは誰もが抱き、考えたことのある疑問ではありましょうが、あえて今から書かせていただきたいと思います。

なぜこうも流行ってしまったのか

DMMと角川書店のタッグによる強力な宣伝の効果

まず第一には当然これがあげられるでしょう。DMMというのは有料アダルトコンテンツの大手であり、角川書店などは日本の出版会を牛耳っていると言っても差し支えなさそうに聞こえるほどの大企業です。これだけの企業であれば、ちょっと人差し指をくいっ、とやっただけで流行を生み出す程度のことはできるでしょう。事実、艦これの広告はそこかしこで見られました。

流行りが流行りを呼ぶ

しかし、よく言われている通り、艦これの運営は当初は「ちょっと儲けられたらそれでいいや」ぐらいの気持ちでスタートを切ったのだと思われますし、事実、用意されていたサーバーは少なく、貧弱なものでした。
それがなぜこのような事態になってしまったのかというと、運営の「ちょっと流行らせる」の見積もりが下の方に甘く、流行りが廃れる速度よりも流行りが流行りを呼ぶ速度の方が上回ってしまったせいで、発散的に広がってしまった、ということでしょう。ではなぜ、運営の見積もりは外れたのでしょうか。

艦むすの個性の稀薄性

それまでにも戦国武将や、西洋の神話の神々を題材にしたソーシャルゲームは、それこそ星の数ほどありました。既存の、誰もが知っているものを題材にすることは、客を呼び込むのに効果的な方法です。こういったものであれば、萌え文化に理解があり、かつそのジャンルに詳しいオタクな方々ならば多くの人間が「試しに」とゲームを始めてくれます。艦これも、それらの中の軍艦版というだけのものでしかありません。
しかし、軍艦は人格を持っていません、そこがほかの多くのものとは違う点です。そして、人格は持ってはいないものの、そのものが身を置いたのは世界の激動の時代まっただ中であり、一つの艦についての本が何冊も出ていることなどからも、一人の人間以上にその生涯がドラマチックであった、ということがわかります。
それが艦これをここまで流行らせた原因である、と私が考えている「個性の稀薄性」なのです。そして、これこそが、艦これを神話的である、と考える所以なのです。
そして、その神話性のおかげで二次創作が大きな流れになります。この二次創作こそが運営の見積もりを外し、艦これをここまで流行らせたものであるということをここでの結論とさせてください。

神話性が艦これを流行らせた

神話的であったから艦これが流行ったのか、流行ったからこそ神話的になっているのかは定かではありません。しかし、そういった素質を艦これは持っている、というのは間違いないでしょう。私は二次創作の豊かさは神話性によるものだと考えております。したがって、やはり二次創作の盛んな、「東方」や「初音ミク」、「アイマス」なども神話性をもっていると考えます。これらのものについてはさして知識もないのでこれ以上の言及は避けたいと思いますが、今から述べることが艦これに限った話ではない、ということは言っておきたいと思います。
そして、もちろん、「東方」や「アイマス」などといった先達の流行り方をかなり参考にしているのは間違いないと思います。

艦むすは神

ここでもう一度言っておきます。ここでいう「神」というのは一神教的な神ではなく、多神教的、アニミズム的な意味での神です。

かつて、神の概念すら存在しなかった太古に日本で暮らしていた人々は、太陽や川、山など自分たちよりはるかに大規模で、力の及ぼすことのできない事象に対して畏れを抱き、そして敬っていました。その事象というのは、太陽や雷といった自然現象そのものであったり、人の生き死にであったりと様々です。そして、この時の精神こそが神話の本質です。

やがて、人々は自分たちに行われる仕打ちに対して疑問を抱き、救いを求めます。救いを得るためにはその元凶のところまで行って、直談判しなければいけません。これが祈りであり、祭りであり、人々が最優先で行わなければならないものでした。これを何とかしなければ、自分たちがいくら頑張ったところで、その努力も水泡に帰してしまうわけですから。

しかし、人というものは同じく人である対象にしか感情移入をできません。感情移入のできないものに対して、それが起こす現象のわけを慮ったり、祈ったり、という行為を行うことは難しいものです。したがって、人々はそれらをやがて人の姿にあてはめ、人格を持たせ、それらに感情移入することによって祈りを行うようになる、というのは当然の帰結なわけです。

そしてそれは今も擬人化と呼ばれる行為によって非常に身近な場所で行われています。
擬人化とは、人以外のものに対して感情移入をするための手段なのです。
したがって、艦むすと神というものは、擬人化されたもの、という意味では全く同じ根っこを持つ、と考えることができます。

しかし、神は往々にして神話を持つものですが、艦むすが、擬人化されたものである、という理由だけで神話を持つようになる、というのはいささか強引すぎます。消しゴムを擬人化したところで、それが神話を持つようになるとは到底思えません。
擬人化は時間軸上の点でなされますが、神話というのは長い時間をかけて熟成されなければならず、また、空間上の狭い領域で語られる程度のものであれば神話と呼ばれるには至らず、広い領域で共通の認識として持たれなければならないからです。
それが自然が神話を持ち、消しゴムが神話を持たない理由です。

神話とは

さて、ここまで神話という言葉を少し都合のいいように扱ってきました。このあたりで神話とはなんなのか、ということについて言及しなければなりません。

神話とはすなわち、大規模な共同体の中で、擬人化されたものに対する共通認識なのである、と考えています。そして、神話の内容というのは、その擬人化されたものがなぜその人格を持つに至ったか、また、その人格を持つことによって何が起こったか、ということを述べています。

その共通認識を持つことによって、共同体の中で統一された世界観、そして道徳観をもつことができるようになり、社会として、その姿を保つことができます。
今日、神話や昔話の類がそれほど重要ではなくなっているように感じられるのは、宗教であればその中で最も大きい権威を持つ機関や、政治であれば政府などの手によって、法律などの別の形で明文化されているからにほかなりません。
大事なのは、それが共通で、かつ絶対である、と認められていることでしょう。

改めて定義して、神話とは、「大規模な共同体の中で擬人化されたものに対する共通かつ絶対である認識」だといいうことにします。
この定義を採用するならば、古事記に書いてあるといっても、神武天皇や、あるいは海幸山幸の話までもが神話ではなくなってしまいます。極端に言うと、天照大御神でさえも巫女がモチーフであるという話もあるので、これも神話ではなくなってしまいます。
なので、ここでは擬人化されているか、というのは元ネタが具体的な人格を持つか、そうでないか、ということで線引きをさせてください。つまり、海幸山幸や天照大御神はある抽象的な人物を具体的に擬人化したものである、という意味で神話ということにしていただきます。
神武天皇が具体的な人物かどうか、という話題はここではやめておきましょう。

ところで、その神話という共通認識に基づいて神についてもっと膨らませたもの、それが説話なのです。
説話が万人に受け入れられるのは、その土台に対して共通認識があるからなのです。キリストがコソ泥を働いた、という話を誰かがしたとしても、人々に受け入れられ、説話となるには至らないでしょう。キリストはそういう風に神話上で語られてはいないからです。
また、神話を持つ母体が大きければ大きいほど、説話の数も多くなるのも納得していただけるかと思います。
そして、現代における説話、それこそが二次創作なのです。逆に、説話は二次創作といえます。

強固な神話に対して、豊富な説話、これが原作と二次創作の関係といえるでしょう。

艦これが神話性をもつ理由

ここにきてやっと、艦これがどう神話的なのか、ということに言及することができます。
先ほど、神話とは「大規模な共同体の中で擬人化されたものに対する共通かつ絶対である認識」と定義しました。

第一に、艦これは大企業によって、盛んに宣伝されました。これによって大量のプレイヤー、すなわち「大規模な共同体」を持つに至りました。

第二に、艦これは、第二次世界大戦周辺時期の軍艦を擬人化したゲームです。これは「擬人化されたものに対する」という部分を満たします。

そして第三の部分は「共通かつ絶対の認識」であるという部分です。これこそが艦これをこれほどまでの大きなコンテンツに仕立て上げました。
艦むすとは軍艦であり、その設定は史実として、まだ多少の研究の余地は残されてはいますが、普遍のものとして存在します。それはだれかが勝手に作り出したものではなく、圧倒的事実として個人で捻じ曲げることはできません。その設定こそが、「共通かつ絶対の認識」なのです。消しゴムではこうはいきません。
そして擬人化したものの人格付けをその事実にもとづいて行っているために、艦むすは「神」たりえるのです。
案山子を擬人化した久延彦神は、田んぼに立ち続け、道行く人をいつも見ているがために、八百万の神の中で一番物知りだ、という人格付けがなされているのと同様に、イギリスに発注して作ってもらったから、金剛という戦艦は英語交じりの変な日本語を話す、という人格付けをされているのです。
艦これが史実を完全に無視した人格付けを行っていたのだとしたら、これほどまでの人気を得るには至らなかったと私は思います。
太陽を象徴する神が岩戸に隠れてしまっても誰も困らないような神話など、とても受け入れられないでしょう。

結論

というわけで、艦これが神話性を持つ、という言説にはある程度納得していただいたのではないかと思います。そうだったらうれしいなぁ。
結論として、
艦これは神話的である。そして、木曾ちゃんはかわいい!
ということを述べてこの記事を終わりたいと思います。

まだ、艦これではなぜ二次創作が流行っているのか、などにもっと突っ込みたいのですが、先日買ったエロゲの、ちょうどエッチシーンを中断してこの記事を書いておりましたので、そろそろそちらのほうでイかせていただきたいと思います。
長い文章を読んでいただいてありがとうございました。続きはそのうち書きます。