unityを1年間触ってみて　(UECアドカレ2024-2 10日目)

　こんにちは。UEC23のぬか喜びの庭です。大学に入学後初めてプログラミングというものをやり始め、プログラミング歴約1年と8カ月という若輩者です。そんな私ですが、大学入学前よりゲームエンジンなるものは触ってみたいと思っておりました。なんやかんや課題や趣味に忙殺される日々を送り、昨年の12月に初めてunityなるものをinstallして触り始めました。この記事ではそんなプログラミングも初心者、unity触ったことない人間が1年間でどのくらいできるようになるかを書いていこうかなと思います。さすがに奮闘録だけだと面白くないのでunityで簡易電卓を作ったので、そのコードを共有します。

 本記事はUEC 2 Advent Calendar 2024の10日目です。
 [アドカレのサイトはこちらから](https://adventar.org/calendars/10198)

 また前日の記事はryota2357さんの[EcoString と CompactString から Small String Optimization と Clone-on-Write の実装方法を学ぶ](https://ryota2357.com/blog/2024/sso-cow-from-ecostring-compactstr/)でした。私はRUSTという言語を触ったことがない人類ですが、触ってみようかなと思いました。またUTF-8の根幹にまで触れていて非常に興味深い記事でした。

# unityとは
　まずunityを知らない人もいると思いますので、unityについて説明していきます。
unityとは端的に言うとゲームエンジンです。**ゲームを作れます。** 
もちろんゲームエンジンなのでゲームを作るがメインの使用用途ですが、物理演算シュミレーションやVR・メタバース関連の開発等にも使用されます。

# unity奮闘録
### 12月~3月
　調布祭が終わり、時間の余裕が出てきたタイミングで「そろそろやらなきゃいつまでもゲームエンジンを触らない」と思い12月にunityをinstallしました。いわゆる猫本を買い、主に2Dの勉強を始めました。この時期にposition,rotation,collider,rigidbodyといったゲームエンジンならではの要素をなんとなーく ~~理解した~~ 理解したつもりだったものの、プログラミング力の低さからC#については本当に何もわからない感じでした。わからないときにAIを一切使わずGoogleさんとにらめっこしていたため本当に習得ペースは遅かったです。習得は遅かった一方でunityのググり方というものはこの時期に身に着けることができたかと思います。

 ## 4月~5月
　2年になり一つの転機が訪れました。情報工学工房にてVR・メタバースの授業をとることができたのです。怠惰な自分は課題の形式が毎週なければ急に触らないようになってしまう人間なので、このタイミングで毎週ちゃんとunityと ~~お友達になる~~ 触ることができたかなと思います。情報工学工房ではメタバースを選択しました。Clusterを用いてワールドを作成するといった授業です。3月までの時点でunityのおおよその要素は勉強していたのでここからは主にClusterのCCK（Cluster Creater Kit）を練習することがメインになっていきました。

 ### 6月~7月
  IVRCというコンテストに作品を出すために勉強を重ねてワールドを制作し始めました。私はClusterのワールドではコードをほぼ書かずに、CCKを利用して作成しました。制作しながら自分のunityへの知識の不足、経験不足に頭を悩ませました。原因ははっきりしており、Colldier,Rigidbodyがそれぞれ当たり判定、物理演算といったざっくりとした理解しかしていなかったことと、3Dモデルに関する知識(Render,Material,bone等)の知識がなかったことが原因です。
しかしながら、情報領域演習やその他科目の課題等( ~~#計算機通論を許すな~~ )に押しつぶされ勉強時間をあまり確保できませんでした。
それでもunityに慣れたおかげである程度のものは作れるようになりました。情報領域演習ではTurtle Graphicで描画せよという課題がありました、Pythonの実行環境を作っていないかつ、Pythonを実行環境→Pythhon勉強→Turtle Graphic作成よりUnityでTurtle Graphicを作って描画するほうが楽と判断し、unityで作りました。

### 8月~9月
　待ちに待った夏休みです。最高ですね。昨年はゲームに時間を費やしなにも自分の勉強に使わなかった怠惰な2カ月を過ごしましたが、今年はunityをしっかり勉強するぞ　という気持ちを持って勉強しました。
 　まずIVRCに間に合うようにワールドを作成しました。先に言っておきます。ワールドのクオリティは黒歴史レベルでひどいです。おもに知識不足のなか期限ぎりぎりまで作ったことが原因です...

　さて夏休みの活動ですがなにげにこの夏休みが自分のunityへの理解を大きく深めたと思っています。Rigid BodyやColliderの仕組み、C#におけるClass等のオブジェクト指向概念、UnityEngineでなぜRigid body変数を使うことができるのか等を大きく理解できました。
　また3Dモデルを触り、Boneがあることを理解しました。ホロライブMMDをインポートしunityちゃんのモーションをホロライブMMDに入れてみるといったことをやってみました。
 　最後にVRChatの開発をはじめました。UdonSharpという多くの方が聞いたことない言語を使いますが、中身はC#です。**本当に書きやすい!! VRC最高** トラストランクの関係で全体にアップロードできるワールドはまだないですが、実際に動くものとしてはコネクト4を作りました。これからメタバース関連の開発はできればVRCの開発をしたいです。
### 10月~12月
　授業の課題が楽しすぎて?あまりunityを触れてませんでしたが、記事用に知識をOutPutしたり、unityの要素の試行をしてみたりしていました。あとはJavaを触ったり、Reactのチュートリアルやったり、etx...夏休みにblenderや3Dモデルの知識が不足していることを理解したにもかかわらず、別のことをやってます。反省ですね... わたしのPCのメモリとグラボ的にunityの動きやVRCの動きが限界一歩前なのでPCも欲しい...VRに興味あるからメタクエストも欲しい。欲しいものが多すぎますね


### unity奮闘録まとめ
　さてプログラミング初心者によるunity勉強録でした。情報領域演習第3の授業開始と同時にチェッカーを通して課題終わらせれる（こともある）くらいのプログラミング力がついた今の目線で見ると、Unityは技術のエンドコンテンツです。プログラミング、3Dモデルの理解、API等のググり方等をすべて勉強した上で扱えるものです。しかし、エンドコンテンツから勉強してそれぞれの基礎的な内容を理解していくことも悪くないなと思いました。来年は3Dモデル、blenderを理解し、モーションキャプチャ等を勉強し、モーションキャプチャを使ったunityアプリを作ってみた!　の記事が書けるくらい知識が身に付いたらなぁと思います。

# ちょっとしたunity講座
 　アドカレ用になにか簡単なものを作るとして何を作ろうかなと思ったのでとりあえずunityで電卓を作ってみました。簡易的なものなのです。

　先に完成品とコードをGitHubに置いておいたので、GitHubからご覧ください。
 [アドカレ用unity電卓](https://github.com/nukayorokobinoniwa/UEC-Adcare-2024-Calculator "GitHub")

 実際の細かい作り方を解説するとすっっっっごく長くなるのでだいぶ端折って実装方針を書いていきます。コード自体はGitHubに乗せているのでそちらからご覧ください。

 今回はバックエンドのような働きをするDirectorオブジェクトと、そのオブジェクトに値や演算子、等の処理を送るボタンに分けて実装しました。

 さて実際のunityの開発画面ですが、次のような画面で開発しています。
 ![スクリーンショット (99).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3857737/03137e97-e6a4-6ba0-b96c-33c1c2b69a8f.png)

 今回はUIのボタンおよびテキストのみを使用して作成しました。
 そのため今回はunityのUIの使い方がメインの話になります。
 余談ですが、Prefabで作るべき数字ボタンや、演算子ボタンをまぁいいかの精神でPrefabで作らなかったです。反省反省。
 

 UnityのUIはデフォルトでは使いづらいです。UIの位置がカメラと合わないので...
 まずUICanvasを追加したらCanvasのInspectorウィンドウのCanvasのRender Modeの設定をScreen Space-Cameraに変えましょう。これだけでUIが一気に作りやすくなります。

 さてUIですが、今使用している2022.3.23f1バージョンではレガシーとTextMeshProの両方が使用可能です。ただレガシーは使いづらいのでTextMeshProのほうで開発します。

 TextMeshProを使用してUIButtonやUItextを作成します。そこにそれぞれのオブジェクトに対応するコードをアタッチしてあげれば完成です。(3分クッキングでいう完成したものはこちらですレベルのはしょり)記事が長くなりすぎたので許してください。

 # 最後に
 記事が長くなってきて焦って話を終わりに持ってきてますが、何かの分野でつよつよになれたらなぁという思いがあるので今後もunityを勉強していきます。来年のアドカレでは日記風記事ではなくもっと面白い強い内容を書けるように頑張ります。
 明日ははんかくさんの記事です、楽しみにしています。

 ここまでご覧いただきありがとうございました。