Unityでのゲーム開発の究極の初心者ガイド

Unityは、ゲームからインタラクティブな視覚化まで、あらゆるものをプロトタイピングするための優れたツールです。この記事では、Unityの使用を開始するために知っておく必要のあるすべてのことを実行します。

まず、私について少し説明します。私は、UnityとBlenderで5年以上働いている、愛好家のUnity開発者、3Dモデラー、グラフィックデザイナーです。私は現在、University CollegeDublinのFinancialMathsの学生です。時々、フリーランスのグラフィックデザイン、Webプロトタイピング、ゲームプロトタイピングを行っています。

前書き

この記事は、これまでUnityを使用したことがないが、プログラミングやWebデザイン/開発の経験がある人を対象としています。この記事の終わりまでに、基本的なゲームの作成を開始するために必要なすべての関数とコードだけでなく、エンジンの概要も理解できたはずです。

なぜUnityなのか?

ゲームを作りたいなら

インディーゲームの開発に関しては、選択肢はほとんどありません。ゲームを構築する場合の3つの主な選択肢は、Unreal、Unity、またはGameMakerです。

Unityは、おそらく3つのプラットフォームの中で最も意見が少ないです。箱から出してすぐに非常に生の製品を提供しますが、柔軟性が高く、十分に文書化されており、考えられるほぼすべてのジャンルのゲームを構築するために非常に拡張性があります。

Escape from Tarkov(FPS)、Monument Valley(Puzzler)、This War of Mine(Strategy / Survival)など、すべてUnityに組み込まれている非常に成功したゲームがたくさんあります。

実際には、最初のゲームを構築するエンジンはおそらく重要ではないので、私のアドバイスは1つを選んでそれを使用することです。

ユーザーエクスペリエンスのプロトタイプを作成する場合

Unityは、物理学、アニメーション、リアルタイム3Dレンダリングを備えた単なるエンジンであるため、UX研究用の本格的なインタラクティブプロトタイプを作成するのに最適なスペースでもあります。

UnityはVRとARを完全にサポートしているため、クライアントとのアーキテクチャ、自動化、シミュレーションを探索するための優れたツールになる可能性があります。

この記事のセクション

  • なぜUnityなのか?
  • Unityエディターウィンドウ
  • Unityゲームオブジェクト
  • Unityビルトインコンポーネント
  • カスタムコンポーネントの作成
  • モノビヘイビアの構造
  • GameObjectsの操作
  • レイキャスティング
  • 衝突検出
  • 高度な機能
  • 新規参入者へのアドバイス
  • 素敵なリソースとコミュニティ
  • 結論

Unityエディターウィンドウ

エディターウィンドウはいくつかのセクションに分かれています。記事全体で常に参照するため、これについては非常に簡単に説明します。これに精通している場合は、スキップしてください。

シーンビュー:シーン内でのゲームオブジェクトの配置と移動を許可しますゲームビュー:プレーヤーがカメラからシーンをどのように見るかをプレビューしますインスペクター:シーン内で選択したゲームオブジェクトの詳細を提供します。アセット/プロジェクト:すべてのプレハブ、テクスチャ、モデル、スクリプトなどがここに保存されます階層:シーン内のゲームオブジェクトのネストと構造化を可能にします

さあ、始めましょう!

Unityゲームオブジェクト

GameObjectsとは

GameObjectsは、Unityゲームエンジンのすべてのコアビルディングブロックです。名前はほとんどそれを与えます:

Unityのシーン内に配置するものはすべて、「ゲームオブジェクト」でラップする必要があります。

Webデザインのバックグラウンドがある場合は、GameObjectsを要素によく似ていると考えることができます。非常に退屈なコンテナですが、複雑な機能やビジュアルを作成するために非常に拡張性があります。

文字通り、パーティクルエフェクト、カメラ、プレーヤー、UI要素など、…(リストは続きます)はすべてGameObjectです。

階層の作成

Web開発の場合と同様に、GameObjectもコンテナです。さまざまで望ましいレイアウトや抽象化を作成するためにネストするのと同じように、ゲームオブジェクトでも同じことをしたいと思うかもしれません。

ゲームオブジェクトのネストの背後にあるロジックは、Web開発とほとんど同じです。いくつか例を挙げます…

クラッターと効率

Webアナロジー:ユーザーの操作に応じてオンザフライで動的に生成される可能性のある同様の要素が多数あり、それらを整理したいと考えています。Unity Translation: Minecraftクローンを作成していて、シーンに大量のブロックがある場合、パフォーマンス上の理由から、シーンからブロックの「チャンク」を追加および削除する必要があります。したがって、チャンクの親を削除するとすべての子ブロックが削除されるため、チャンクごとに空のGameObjectに親を設定することは理にかなっています。

ポジショニング

Webアナロジー: Webページではなく、コンテナーに対して「相対的」に含まれるコンテンツの位置を維持する必要があります。Unity Translation:プレイヤーの周りをホバリングするヘルパードローンの束を作成しました。プレーヤーを追いかけるように指示するコードを書くのではなく、プレーヤーのゲームオブジェクトの子としてインスタンス化します。

Unityビルトインコンポーネント

アクターコンポーネントモデル

GameObject自体は、ほとんど役に立たない—これまで見てきたように、それらはほとんど単なるコンテナです。それらに機能を追加するには、コンポーネントを追加する必要があります。コンポーネントは、基本的にC#またはJavascriptで記述されたスクリプトです。

Unityはアクターコンポーネントモデルで動作します。簡単に言えば、ゲームオブジェクトはアクターであり、コンポーネントはスクリプトです。

ボタン、フォーム要素、さまざまな異なるディレクティブとカスタマイズ可能なプロパティを持つ柔軟なレイアウトなど、再利用可能な小さなコンポーネントを作成するというアイデアに慣れる前に、Webアプリを作成したことがある場合。次に、これらの小さなコンポーネントをより大きなWebページにアセンブルします。

このアプローチの大きな利点は、再利用性のレベルと要素間の明確に定義された通信チャネルです。同様に、ゲーム開発では、意図しない副作用のリスクを最小限に抑えたいと考えています。注意しないと、小さなバグは制御不能になる傾向があり、デバッグが非常に困難です。したがって、小さくて堅牢で再利用可能なコンポーネントを作成することが重要です。

主要な組み込みコンポーネント

UnityGamesエンジンによって提供される組み込みコンポーネントのいくつかの例の時間だと思います。

  • MeshFilter: 3DメッシュのマテリアルをGameObjectに割り当てることができます
  • MeshRender:マテリアルを3Dメッシュに割り当てることができます
  • [ボックス| Mesh] Collider:衝突中のGameObjectの検出を有効にします
  • リジッドボディ:現実的な物理シミュレーションが3Dメッシュを使用してGameObjectsに作用することを可能にし、ボックスコライダーで検出イベントをトリガーします
  • ライト:シーンの一部を照らします
  • カメラ: GameObjectにアタッチするプレーヤーのビューポートを定義します
  • GUIを表示するためのさまざまなUIキャンバスコンポーネント

他にもたくさんの負荷がありますが、これらはあなたが精通する必要がある主なものです。1つのヒントは、どこにいても、Unityマニュアルとスクリプトリファレンスをオフラインで使用して、これらのすべてのドキュメントにアクセスできることです。

カスタムコンポーネントの作成

組み込みコンポーネントは主に物理とビジュアルを制御しますが、実際にゲームを作成するには、ユーザー入力を受け入れ、それらの標準コンポーネントとGameObject自体を操作する必要があります。

コンポーネントの作成を開始するには、目的のGameObject>コンポーネントの追加>検索バーに新しいコンポーネントの名前を入力>新しいスクリプト(c#)に移動します。

一般的な推奨事項として、UnityでJavascriptを使用しないことをお勧めします。ES6に付属しているすべての優れた機能で更新されているわけではなく、より高度な機能のほとんどは、Javascriptに移植されたC#機能に依存しています…これは私の経験では1つの大きな回避策になります。

モノビヘイビアの構造

主な機能

すべてのコンポーネントはMonoBehaviourクラスから継承します。これにはいくつかの標準的な方法が含まれていますが、最も重要なのは次のとおりです。

  • スクリプトを含むオブジェクトがシーンでインスタンス化されるたびに呼び出されるvoidStart ()。これは、初期化コードを実行する場合に役立ちます。プレイヤーがマッチにスポーンした後、プレイヤーの装備を設定します。
  • すべてのフレームで呼び出されるvoidUpdate()。これは、ユーザー入力を含むコードの大部分が行き、シーン内のプレーヤーの動きなどのさまざまなプロパティを更新する場所です。

インスペクター変数

多くの場合、コンポーネントを可能な限り柔軟にしたい場合があります。たとえば、すべての武器のダメージ、発射速度、has_sightなどが異なる場合があります。すべての武器は基本的に同じものですが、Unityエディターを使用してさまざまなバリエーションをすばやく作成できるようにする必要があります。

これを実行したいもう1つの例は、ユーザーのマウスの動きを追跡し、ビューポートにカーソルを置くUIコンポーネントを作成する場合です。ここで、動きに対するカーソルの感度を制御したい場合があります(ユーザーがジョイスティックまたはゲームパッドとコンピューターのマウスを使用していた場合)。したがって、これらの変数を編集モードで簡単に変更できるようにし、実行時に実験することも理にかなっています。

これは、コンポーネントの本体でパブリック変数として宣言するだけで簡単に実行できます。

ユーザー入力の受け入れ

もちろん、ゲームがユーザー入力に応答することを望んでいます。これを行う最も一般的な方法は、コンポーネント(または他の好きな場所)のUpdate()関数で次のメソッドを使用することです。

  • Input.GetKey(KeyCode.W)真のWキーが押されていることを返します
  • Input.GetKeyDown(KeyCode.W)Wキーが最初に押されたときにTrueを返します
  • Input.GetAxis( "Vertical")、Input.GetAxis( "Horizo​​ntal")-1,1個のマウス入力の動きの間を返します

GameObjectsの操作

ユーザー入力を取得したら、シーン内のGameObjectsが応答するようにします。検討できる応答にはいくつかの種類があります。

  • 平行移動、回転、スケール
  • 新しいゲームオブジェクトを作成する
  • 既存のゲームオブジェクト/コンポーネントへのメッセージの送信

変換

GameObjectにはすべて、現在のゲームオブジェクトに対してさまざまな便利な操作を実行できるようにする変換プロパティがあります。

上記のメソッドはかなり自明です。小文字のgameObjectを使用して、コンポーネントのこの特定のインスタンスを所有するGameObjectを参照していることに注意してください。

一般に、オブジェクトのグローバルな位置/回転ではなく、local [Position、Rotation]を使用することをお勧めします。これにより、通常、ローカルスペースの軸がワールドの原点やx、y、z方向ではなく、親オブジェクトを中心に配置されるため、意味のある方法でオブジェクトを移動しやすくなります。

ローカル空間とワールド空間の間で変換する必要がある場合(これはよくあることです)、次を使用できます。

ご想像のとおり、この背後には、メソッド名の「逆数」によって示唆されるかなり単純な線形代数がいくつかあります。

新しいゲームオブジェクトの作成

GameObjectsは基本的にシーン内のすべてであるため、その場で生成できるようにしたい場合があります。たとえば、プレイヤーが何らかの発射体ランチャーを持っている場合、飛行、ダメージの付与などのための独自のカプセル化されたロジックを持つ発射体をその場で作成できるようにしたい場合があります…

まず、プレハブの概念を紹介する必要があります。これらは、シーン階層内の任意のGameObjectをアセットフォルダーにドラッグするだけで作成できます。

これは基本的に、シーンにあるオブジェクトのテンプレートをすべて同じ構成で保存します。

これらのプレハブコンポーネントを取得したら、シーン内の任意のコンポーネントのインスペクター変数(前に説明したように)に割り当てることができるため、プレハブで指定された新しいゲームオブジェクトをいつでも作成できます。

次に、プレハブの「インスタンス化」を実行し、シーン内の目的の場所に操作して、必要な親関係を確立できます。

他のゲームオブジェクトおよびコンポーネントへのアクセス

多くの場合、他のGameObjectやそれに関連するコンポーネントと通信する必要があります。ゲームオブジェクトへの参照があれば、これは非常に簡単です。

ComponentName comp = some_game_object.GetComponent();

その後、GameObjectを操作するために、コンポーネントのパブリックメソッド/変数のいずれかにアクセスできます。これは簡単なことですが、実際にGameObjectへの参照を取得するには、いくつかの方法があります…

インスペクター変数を介したアクセス

これは最も簡単です。プレハブで前に示したように、GameObjectのパブリック変数を作成し、インスペクターを介して手動でコンポーネントにドラッグアンドドロップするだけです。次に、上記のように変数にアクセスします。

タグ付けによるアクセス

インスペクターを介してゲームオブジェクトまたはプレハブにタグを付け、ゲームオブジェクトの検索関数を使用してそれらへの参照を見つけることができます。

これは、以下のように簡単に実行できます。

GameObject some_game_object = GameObject.FindGameObjectWithTag(“ Brick”);

変換によるアクセス

親オブジェクトのコンポーネントにアクセスしたい場合は、transform属性を使用して簡単にアクセスできます。

ComponentName comp = gameObject.transform.parent.GetComponent();

SendMessageを介したアクセス

あるいは、他の多くのコンポーネントにメッセージを送信したい場合、またはネストされた階層のはるか上にあるオブジェクトにメッセージを送信したい場合は、関数の名前とそれに続く引数を受け入れるメッセージ送信関数を使用できます。

gameObject.SendMessage(“ MethodName”、params); //メッセージをブロードキャストしますgameObject.SendMessageUpwards(“ MethodName”、params); //上にネストされているコンポーネントによってのみ受信されます。

レイキャスティング

人々が「物理ベース」または「光線ベース」のFPSゲームを比較するときに、これを聞いたことがあるかもしれません。レイキャスティングは本質的に、「コライダー」または「リジッドボディ」と接触すると「ヒット」を返し、オブジェクトの詳細を返すレーザーポインターを持っているようなものです。

これが役立つシナリオは2つあります(おそらくもっと多くの負荷があります)。

  1. ゲーム用の武器システムを設計している場合は、ヒット検出にレイキャスティングを使用でき、近接アイテムが短距離でのみ「ヒット」するようにレイの長さをカスタマイズすることもできます。
  2. マウスポインタから3D空間内のポイントへの光線を作成します。つまり、戦略ゲームでユーザーがマウスでユニットを選択できるようにする場合です。

ご覧のとおり、このコードはもう少し複雑です。理解しておくべき重要なことは、マウスが3D空間で指している場所に光線をキャストするには、ScreenPointToRay変換が必要であることです。この理由は、カメラが3D空間をラップトップ画面の2Dビューポートとしてレンダリングしているため、当然、3Dに戻すための投影が必要になるためです。

衝突検出

先ほど、オブジェクトに追加できるColliderコンポーネントとRigidbodyコンポーネントについて説明しました。衝突のルールは、衝突の1つのオブジェクトにはリジッドボディがあり、もう1つのオブジェクトにはコライダーが必要です(または両方に両方のコンポーネントがあります)。レイキャスティングを使用する場合、レイはコライダーコンポーネントが接続されたオブジェクトとのみ相互作用することに注意してください。

オブジェクトにアタッチされたカスタムコンポーネント内でセットアップしたら、OnCollisionEnter、OnCollisionStay、およびOnCollisionExitメソッドを使用して衝突に応答できます。衝突情報を取得したら、GameObjectに責任を負わせ、以前に学習した内容を使用して、それに接続されているコンポーネントと対話することもできます。

注意すべき点の1つは、リジッドボディはオブジェクトに重力などの物理特性を提供するため、これをオフにする場合は、is_kinematicをオンにする必要があります。

高度な機能

現在はこれについては触れませんが、おそらく将来の記事で、それらが存在することを知らせるために説明します。

GUIの作成

Unityには、ゲームのGUIをレイアウトするための本格的なUIエンジンがあります。一般に、これらのコンポーネントはエンジンの他の部分とほとんど同じように機能します。

Unityエディターの拡張

Unityを使用すると、インスペクターにカスタムボタンを追加して、編集モードでワールドに影響を与えることができます。たとえば、世界の構築を支援するために、モジュラー住宅を構築するためのカスタムツールウィンドウを開発できます。

アニメーション

Unityにはグラフベースのアニメーションシステムがあり、ボーンベースのアニメーションシステムを実装しているプレーヤーなど、さまざまなオブジェクトのアニメーションをブレンドして制御できます。

材料とPBR

Unityは、リアルタイムの照明とリアルなマテリアルを可能にする物理ベースのレンダリングエンジンで動作します。現実には、実際に見栄えのするものを作成するには、最初に3Dモデリングを学ぶか、他の誰かが作成して最適化したモデルを使用する必要があります。

新規参入者へのアドバイス

最初のゲームを書くことを計画している場合は、最も些細なゲームでさえ書くのにかかる複雑さと時間を過小評価しないでください。Steamでリリースされるゲームのほとんどには、チームが何年もフルタイムで取り組んでいることを忘れないでください!

単純な概念を選び、それを達成可能な小さなマイルストーンに分解します。コンポーネントをモノリシックコードブロックではなくシンプルに保つと、バグが発生する可能性がはるかに低くなるため、ゲームをできるだけ小さな独立したコンポーネントに分割することを強くお勧めします。

ゲームの任意の部分のコードを作成する前に、同じ問題を解決するために他の誰かが以前に行ったことを調べてください。おそらく、彼らははるかに洗練された解決策を持っているでしょう。

素敵なリソースとコミュニティ

ゲームデザインには、他のどのコミュニティよりも優れたコミュニティの1つがあり、コンテンツを無料またはほぼ無料で提供する、高度なスキルを持つプロが業界にたくさんいます。3Dモデラー、コンセプトアーティスト、ゲームデザイナー、プログラマーなどが必要な分野です。以下のこれらの各フィールドについて、私が遭遇したいくつかの優れた一般的なリソースをリンクしました。

コンセプトアート

  • Feng Zhu Design School(90時間以上のコンセプトアートチュートリアル)
  • Tyler Edlin Art(毎月の課題についてプロからのフィードバックがある素晴らしいBSTアートコミュニティ)
  • アートカフェ(有名なコンセプトアーティストへのインタビューとワークショップ)
  • トレント・カニウガ(イラストレーター兼2Dアーティストで、独自のゲームも制作中)

3Dモデリング

  • CG Cookie(Blender史上最高のメッシュモデリングの基本、Blender用の他の優れたコンテンツがたくさんあります)
  • Tor Frick(Blenderのハードサーフェスモデラーとスカルプター)
  • Gleb Alexandrov(Blenderの短い強力なレンダリングチュートリアル)

ゲームデザイン

  • DoubleFine Amnesia Fortnight(2週間のハッカソンを行い、設計プロセス全体を記録するGameDevs)
  • GameMakers Toolkit(ゲームデザインの原則を検証します)

プログラミング

  • 手作りヒーロー(Cでゲームとエンジンを一から書く)
  • Jonathan Blow(ゲーム開発をライブストリーミングするインディー開発者)
  • Brackeys(Nice Unityチュートリアル)

結論

皆さんがこのチュートリアルを気に入ってくれたことを願っています!ゲームやUIのプロトタイプだけでなく、グラフィックデザインの仕事も少ししているので、ポートフォリオをチェックしください。私もリンクされています。

ポートフォリオ| LinkedIn