はりうすブログ (のすけのメモ)

湘南にある小さな会社 代表 ”のすけ”のブログです

【コードが織りなす複雑系な世界】UnityのコーディングとWebのコーディングの違い

こんにちは、のすけです。

Unity(ユニティ)デビューして2ヶ月くらい。

作った物は2つくらいですが。


だんだんWebのコーディングとUnityコーディング(ゲームコーディング)の違いが分かってきたのでメモ

Unityとは?

誰でも作れるゲーム!とゲームの民主化をはかった最強のゲーム制作ツール。

それがUnity。(主観入ってます)

f:id:hollywis:20210122154352j:plain

youtu.be


HTML的なコードはない!

Unityは全て、GUI(グラフィカルユーザインタフェース)で作っていく。


ゆえに、使うのはキーボードというよりかは[マウス]や[トラックパッド]。

なので、全体の構成を記述するHTML的な物はなく


[Sceneビュー]と呼ばれる3D空間ないしは2D空間上に配置される。

f:id:hollywis:20210122141646p:plain


だから、このキャラクターも、Sceneビュー上にマウスで配置した。

ただ、x,y,zの絶対座標はあるので、キーボード入力で位置を微調整できる。



HTMLを積み上げ的に書くのではなく

position:absoluteを使いまくって実装していた人は

Unityでも近い感覚で作ることができる。(relative的な相対座標はおそらく無いっぽい)

そこに表示されているのは全部GameObject!!

[Sceneビュー]上に表示されている物は全て[GameObject]という型で定義されている。


Webでいうならば全てDivみたいな感じだ。(DOMと言ってもいいかもしれない)

だから、、、

キャラクターもGameObject

四角い箱もGameObject

地面もGameObject

光源(太陽的な)もGameObject


さらには、我々が見ている、この世界を覗き込む[カメラ]ですらGameObject



GameObjectには[座標と大きさ]などだけがある。


そこに様々な機能をAddComponet(コンポーネントを追加)していくことで、あらゆるものに変身できる

f:id:hollywis:20210122142951p:plain


この箱は、ただのGameObjectに

[箱型のメッシュ]と[箱型のメッシュレンダラー]、そして[箱型のマテリアル]の3つを付与することで表現できる。


コンポーネントを切り替えることで、箱にも球体にも、ボタンにも、光にもなれる。

メッシュという三角形の集合体

あらゆるGameObjectにはメッシュやマテリアルを設定できる。


メッシュとは言わば装飾だ。

メッシュがあるから、僕らはそこに物があると認識できる。


厳密にいうとメッシュとは三角形(ポリゴン)の集合体だ。

f:id:hollywis:20210122143805p:plain


例えば、この箱は六面体だが、1つの面に対して2つの三角形(ポリゴン)を使っている。

だから、三角形の数(ポリゴン数)は面の2倍なので12個だ。

マテリアルはCSSっぽい

Webの世界でボタンに色をつけたりするときCSSを使うと思う。

画像を貼り付けるときは、backgroud-colorなんかを使うよね。


じゃあUnityはどうするのか?


答え:マテリアルを使う


f:id:hollywis:20210122144155p:plain


マテリアルとは質感を表現するモノだ。

メッシュ(ポリゴンの集合体)に色を塗りたくるか、画像を貼り付けることができる。


こんな感じで、マテリアルをただの箱に貼り付けるだけで、様々なオブジェクトに擬態できる。

コーディングは生態系??

ほとんどマウスでできちゃうなら、Unityでコーディング不要では?

いやいや、もちろんある。


Unityのコーディングは基本的には GameObjectに対して行う


重要なのでもう一度言うけれど


Unityのコーディングは基本的には GameObjectに対して行う

のだ。



これはちょっとビックリした。


f:id:hollywis:20210122144941p:plain


こんな感じでコードすらGameObjectにAddComponet(コンポーネントを追加)していく。

この画像で言えば[BoxScript]がそれだ。


だから例えば、何かにぶつかった時に消えるとか。大きくなるとか。のコードはその箱のGameObjectに対して行う。


f:id:hollywis:20210122151018p:plain


何だかめんどくさそうに思えるけれど。

これはこれでコードがスパゲッティのようにグチャグチャしなくていいと思う。


JavaScriptで言うところのAddEventListenerで全て書いていく感じに近いと思う。

ボタンをクリックしたらevent発動!的なあれだ。



だから、全ての挙動を管理する巨大なコードがあるわけではなく。

複数のGameObjectに紐づくコードが織りなす複雑系な世界がUnityだ。


それは渡り鳥やの飛び方やイワシの群れに似ている。


渡り鳥の群れ全体を管理しているモノはいないが、個々の一羽一羽は独立した機能(法則・ルール・意思)を持っているだけ

でも全体としては意思があるような群れの生態系を描いて、効率的に島から島へと渡っていく。


だから、Unityのゲーム画面は常に生きている。

そこにはルールがあるだけで、精密な管理はない。二度と同じ画面には出会えないのだ。


UnityにおいてはGameObjectに如何に美しい(法則・ルール・意思)を持たせるかがコーダーの腕の見せ所だと思う。


Webはどちらかと言うと全体管理を徹底しているため、この点の思想が全然違うと思う。


ちなみにコードは全てC#という言語で書いていく。


所詮はデビュー2ヶ月の妄想かもしれないけれど、Web歴は相当長いのでこの点が感動ポイントだった。

UnityでもWebで出力できる

こんがらがって来るんだけど、実は

この複雑系な生態系であるUnityはWeb上でも表現できる。

こんな感じでブラウザ(Safari)で実行してみた。

f:id:hollywis:20210122151909j:plain


しかも、WebAssembly(ウェブアセンブリ)というブラウザからアセンブリ機械語)を実行できるようにする最新技術でコンパイルされるらしい!?から、実行速度も結構早い。


全部Javascriptで作るよりUnity使っちゃえ!とも言えるかな。

Webでできる、その他もろもろはできるのかな?

もちろんサーバーと通信できるし

  • 内部ブラウザでWeb画面を表示
  • 画像表示
  • 音声再生
  • 動画再生
  • データベース接続


なんかもできるのでWebでできることは大体全部できる。


ただ、C#で実装するので、C#のライブラリがないAPIなんかは利用しにくいけれど。

ゲームエンジンなのでPS4でも実行できるらしい

Unityで作ったモノはあらゆるプラットフォームで実行できる。


Webは紹介したけれど、Unityはゲームエンジンなので、iOSAndroidWindows, Mac, Linux,さらにはPS4やXboxOneなんかにも出力できるそうだ。

f:id:hollywis:20210122153541p:plain


そして、今後でるあらゆるデバイスもサポートするのではと思う。


正直、ビルドしたファイル群をどうやてPS4で実行するかは謎だけど、夢が広がるね。

終わりに: ゲームエンジンってつまり現実世界の物理シミュレーションってことは・・・

ゲームエンジンって、つまりは現実の世界の法則をシミュレーションしているってことなので、

つまりは、現実世界の諸法則を画面上で表現するための、地球における現在の最適解なんだよね。


という事は、記号表現においてはUnityの思想は全てを包含するわけで。。。


UnityやばしとWebエンジニアののすけは感じたのでした。


でもね。一番大事なのは、Unityでも表現し切れないあなたのその体!

それでは、また!