🎮

Unityについて語る

に公開

これは何?

UTokyo Advent Calendar 2024の8日目の記事です。
12/7はこちら
12/9はこちら
です。よろしくお願いします。

https://qiita.com/advent-calendar/2024/utokyo

Unityを使ったことのない方へUnityをおすすめする記事です。

Unityを使い始めて1年ほど経ったので語らせてください

Unityの良いところ

さっそくですが、Unityのいいところを語りたくてたまらないので、語らせてください

なんでもできる

Unityは、ゲームエンジンと呼ばれるソフトウェアで、ゲーム制作において必要な機能(3Dモデルの表示、アニメーション、物理演算、音声再生、ネットワーク通信など)を提供してくれます。

ゲーム制作以外の用途、例えばアプリ開発においても、Unityの高機能さと柔軟性を活かして、リッチな表現を簡単に実装できます。

他のゲームエンジンと比較して、ダントツでユーザーが多く、情報がネットで手に入りやすいです。たいていの表現は誰かがやったことがあるので、それを参考にしたり、修正したりすることで様々な表現が比較的簡単に実装できます。

https://unity.com/
UnityのWebサイト

C#が神

UnityではC#(しーしゃーぷ)というプログラミング言語を使ってプログラムを書きます。
C#を普段使わない方からすると、わざわざUnityのためだけに新しい言語を学ぶのは微妙に感じるしれません。が、C#はかなり使いやすいですし、勉強になります。
(Unity以外のC#の用途には詳しくないので、割愛させてください)

静的型付け言語で、また、ポインタを使わなくてよい(使うこともできるらしい)ので、
CやC++(型がある)と、Python(ポインタを使わなくて良い)のいいとこ取りをしているように感じます。

オブジェクト指向プログラミングの機能が豊富にあるので(抽象クラス、インターフェース、ジェネリックなど)、自然と?その辺の知識も増えると思います。実際、抽象クラスやインターフェースをうまく使うと、コードを読む際の認知負荷をかなり下がると感じます。うまく使わないとむしろ読みづらくなってしまうということでもあります。

https://x.com/nekojoker1234/status/1851566213278638386
こんな人もいる

(結局)触っていて楽しい

結局のところ、触っていて楽しいです。
Unityほど簡単に、かつ動きのあるものを作れるソフトウェアを現状では知りません。
JavaScriptとThree.jsを用いてcgの映像を作ったりはできますが、込み入った実装を行おうとすると、かなり大変になると思います。

Unityの微妙なところ

微妙なところもたくさんあるので、語らせてください

学習コストが高い

小学生や中学生でもUnityを使う人はたくさんいるので、難しいというわけではありませんが、Pythonやc言語など一般的なプログラミング言語の学習とは違い、GUIでの操作にも慣れる必要があります。
慣れてある程度使いこなすにはそれなりの時間がかかるので、学習コストは高いと感じます。

Unityに限らず、多機能な3dcgのソフトウェア一般に当てはまる気がします。

UIが微妙

これは、UnityのエディタのUIの話ではなく、Unity上で実現できるアプリのUIの話です。
UnityのUI(uGUI)は、HTMLやCSSほど体系立っているわけではなく、癖があります。

一方で、uGUIのソースコードは公開されているので、カスタマイズしたりオレオレUIを自作することもできますし、その自由度は高いと思います。また、偉大な先人が公開してくださっているアセット/ソースコードを使用することで、複雑なUIもすんなり実現できることがあります。

最近は新たにUI toolkitというUIのシステムが導入され、こちらはHTMLやCSSに近い形でUIを作成できるようになっているそうです。なので、UIが扱いづらいという問題は、今後解消されていくかもしれません。(とはいえ、現在の主流はuGUIなので、その扱いづらさにしばらく付き合う必要がありそうです)

https://unity.com/features/ui-toolkit

コーディングの自由度が高すぎる

Unityで新しいC#のファイルを作成すると、自動的に以下のようなコードが生成されます。

public class NewBehaviourScript : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {

    }
}

Start()は、はじめに一回だけ呼ばれる関数、Updateは、毎フレーム呼ばれる関数です。
こんな感じで、割とざっくりしたところからコードを書き始めるので、深く考えずに書くと容易にコードが複雑になります。

Webフロントエンドのアプリ開発の場合、ReactやVue.jsなどのフレームワークが充実しており、それに乗っかることで、ある程度はコードの構造が整理されると思います。
一方でUnityは、そのようなフレームワークがないので、意識してプログラムの構造を整理しなければ、簡単に複雑になるということです。

ただ、多くのUnityユーザは「自由にのびのび書く → 後から困る」という経験を経験するので、自然に設計の重要性を認識し、知識を深めていく機会を得られるように思います。

https://developers.cyberagent.co.jp/blog/archives/4262/
MVCパターンの記事

重い

重いです。
スマホアプリを作る場合、同じ機能を持ったアプリをUnityで作るのと、swiftやkotlinで作る場合では、一般にUnityでつくる方が動作は遅くなると思います。

ただし、適切にチューニングを行うことで、ストレスにならない程度に動作を軽くすることはできます。(皆さんの遊んだことのあるゲームで、Unityで作られているものはかなり多いと思います)

ちなみに、開発用のpcが高スペックでないと動かない、ということはないです。
参考までに、私のpcのスペックは以下のような感じですが、動作が遅すぎておはなしにならない、ということはまだありません。

  • M1 Macbook Air
  • RAM 8GB

(ただし、他の重いソフトと同時に動かすとかなり遅くなるので、性能が良いに越したことはないと思います。メモリはもっと欲しいです)

Unityを勉強するなら

僭越ながら、Unityを勉強したいならこうするといいんじゃない、というアドバイス的なものを語りたいので、語らせてください

動画の教材を活用する

Unityに限らず、BlenderなどGUIを多く使用するソフトは、動画の教材で学習するのが有効だと感じています。本やサイトだと、GUIの操作についていけず詰むことがしばしばあります。
某demyは普通にお勧めです

  • たまに1500円くらいで講座が買えるようになるので、そこを狙うのがおすすめ。というか、普段の値段はお財布に優しくない
  • 英語の講座だと、100時間以上の講座が上の値段で買えることもあるので、英語が得意な方はおすすめです(字幕は大抵ついてる)

某demy

デモをよく見る

Webアプリなどと違い、Unityで作ったアプリケーションで一般に公開されているものは少ないように思います。Unity関連のOSSは、プラグインのようなものが多いです。

そういう感じで他人の書いたコードを見る機会があまり得られないのですが、Unity公式が配布しているデモやアセットに付属するデモは、かなり有用な知見が得られることが多いです。これはどちらかというと、Unityにある程度慣れた方向けのアドバイスかもしれません。

https://unity.com/demos

作りたいものを作る

結局、これがすごく大切な気がします。
わかりやすい本や動画はたくさんありますが、いずれにしてもUnityの学習は大変なので、続ける要因がないと挫折しやすいように思います。その意味で、作りたいものがあって、それを作るためにUnityを使う、というのが一番いいと思います。
ただし、最初は簡単なものから作ることをお勧めします。初めからポケモンやモンハンを作ろうとすると、多分挫折します。最初は簡単そうに思うもの(それでも、実際は簡単ではないことも多い)を作ってみて、慣れてから難しいものに挑戦するといいと思います。
別にゲームである必要はなく、動画でもアニメーションでも、アプリでも良いと思います。色々作れるのはUnityのいいところです。

作りたいものがない場合は

そうは言っても、作りたいものがない場合もありますよね。
そんな時は、東京大学五月祭 EEIC企画 近未来体験のVR企画に参加するのがお勧めです(唐突な宣伝)。

対外的には

東京大学五月祭 電気電子工学科・電子情報工学科のVR企画のページ。
楽しいよ!来て!!!(VRは10歳以上の方が対象です)
https://2024.eeic.jp/vr/

対内的には

ここに参加するだけで、なんと自動的にUnityを使うタスクが降ってきます。

の幸せスパイラルで、皆さんも幸せになりましょう。

ゲームを作ることについて

上の内容を読んだ皆さんなら、Unityはゲーム以外にも使えそうと思ってもらえたかもしれません。
その上で、ゲームを作ることについて語りたいので、語らせてください

僕自身、ゲームないしアプリを作るようになって痛感するのは、「面白い」ゲームを考えるのは難しいということです。というのも、巷には様々なゲームがあり、ゲームによってその面白さのベクトルが全く異なります(アクションの爽快感を追求したもの、ストーリーを楽しむもの、キャラクターの魅力を楽しむもの、などなど)。「クソゲー」や「鬼畜ゲー」と呼ばれるものもあったりして、「ゲーム」いわんや「面白いゲーム」を定義することはかなり難しいと感じます。

僕なりの意見として、ゲームとはユーザーに届ける体験自体を作ることのできる表現方法なのかなと思います。映画やアニメ、音楽はおおよその時間枠が決まっているため、その中で工夫することになりますが、ゲームはその枠自体も自由に作りかえることができてしまいます。
そして、ユーザーに体験を届けられるのなら、どんな方法であっても、ゲームと呼ぶことはある程度許容されるのかなと思います。
このようなゲームの自由度の高さは、ゲーム開発を難しくも面白くしている要素なのかなと感じます。(この辺の話は、こちらの記事からかなり影響を受けています)

この文脈でゲームを作ることを考えると、Unityを使うのはあくまで手段であって、やりたいことが達成できるのなら、Unreal Engineでも、Pythonでも、あるいはボードゲームのようなアナログな方法でも、なんでもいいんじゃない、というのが僕の考えです。

その上で、Unity楽しいので、ぜひ一緒にやりましょうという記事でした。
普段ゲームをする人はもちろん、しない人でも楽しめると思いますよ。

まとめ

ゆうてますけど、僕自身、まだまだUnityを勉強中です。また、作るものがモバイルアプリに寄りがちなので、上の解説もそこに偏っているように思います。

間違いや補足等ありましたら、遠慮なくご指摘いただけるとありがたいです。
感想やコメントもお待ちしております。

他のアドベントカレンダーもよろしくお願いします。
それではよいお年を🎄

Discussion