\r\n\r\n

Unityでゲームを書く:ビギナーズガイド

成長著しいインディーゲーム開発において、ユニティはデファクトスタンダードとなっています。低価格で使いやすく、豊富な機能を備えているため、迅速なゲーム開発に最適です...

このガイドは無料でPDFをダウンロードすることができます。このファイルを今すぐダウンロードするご自由にコピーして、お友達やご家族とシェアしてください。

インターネット経済で意外と知られていないのが、インディペンデントゲームの台頭です。かつては数千万ドル規模のトリプルAスタジオが独占していましたが、現代のゲーム開発リソースを個人またはプログラマーやデザイナーの小規模なアドホック集合の手に渡すために、多くのツールセットが開発されました。以前、最高のインディーゲームを紹介したことがありますが、Unityのようなツールが何を実現できるのか、ぜひ参考にしてみてください。

これらのインディーズゲーム開発チームは、柔軟性とリスク許容度を示し、多くの場合、ビッグバジェットのライバルよりも早くゲームイノベーションを推進することができました。近年、『Minecraft』『Limbo』『Super Meat Boy』など、驚異的な成功を収めたインディーズプレミアが多数ありますが、そうしたゲームを**するスキルがなくても、Buildboxを使って**プレイすることは可能です。

Unityは、急成長するインディーゲーム開発分野において、低コスト、使いやすさ、豊富な機能により、迅速なゲーム開発に最適なデファクトスタンダードとなっています。Unityは自由度が高いので、ちょっとしたDIYのノウハウで自分だけのオリジナルゲームコントローラーを作ることもできますよ。

eveonlineの開発者である***のような大規模なスタジオでさえ、ゲームのコンセプトを迅速にプロトタイプ化するために使用しています。ユニティは、ほぼすべてのタイプのビデオゲームに適応できる、いくつかのスクリプト言語用のフックを備えた物理およびレンダリングエンジンである「箱入りゲームエンジン」です。

Unityにはゲーム環境を操作するためのビジュアルエディターがありますが、Unityは「ゼロプログラミング」のゲームクリエイターツールではありません。結果を出すためにはプログラミングが必要ですが、どんな「ゲーム○○」プログラムよりもはるかに柔軟で強力なツールも手に入れることができます。

Unityは作業を代行してくれるわけではありませんが、参入障壁はかなり低くなります。C++とOpenGLでゼロから始めると、実際に画面に何かが描画されるまでに数日かかることがあります。Unityは、ゲーム制作の基本的な要素を、初心者プログラマーが直感的に操作できるようにしたもので、10秒程度で完成します。

今日は、Unity**でゲームをプレイするために必要な知識を、大きく10章に分けてご案内します。

§1 - 統一版

§2 - Unityのインストール

§3 - オブジェクト指向の例題の紹介

§4-統一基準

§5-例:ゲームの基本要素

§6 - 統一されたスクリプト

§7-例:Pongのスクリプティング

§8 - ドキュメントを見る / もっと知る

§9-ゲームのビルド/スタンドアロンアプリケーションへのコンパイル

§10 閉会の辞

1 ユニフォーム版

Unityには、プロ版と無料版の2つの基本スタイルがあります。多くの違いがありますが、大まかに言えば、プロバージョンは多くの視覚的な改善(リアルタイムのソフトシャドウやポストプロセッシングなど)をサポートし、より複雑なゲームに非常に役立つ比較的マイナーな機能も数多く備えています。

とはいえ、比較的シンプルなゲームを作るなら、Unityの無料版でも十分すぎるほどです。興味のある方のために、以下、主な違いを詳しく説明します。

1.1 価格設定

Unityの無料版はもちろん無料です。ただし、年間売上が10万ドル以上の企業には、無料版のUnityをライセンスできないなどの制約があります。このような組織はこのガイドの範囲外ですが、もしあなたがそのような組織かもしれないと思ったら、springのPro版を使うのが賢明かもしれません。

UnityのPro版は月額75ドル、永久ライセンスは1500ドルで、これで作れるゲームに制限はない。このガイドでは、利用可能な機能の概要をできるだけ完全に把握できるように、30日間の****期間を使用します。 Studicaは、129ドルの費用で1年間の学生ライセンスも提供しています。

1.2 特徴

Unityの無料版には、不足している機能がたくさんあります。しかし、最も重要な違いは以下の通りです。Unityの無料版には、ゲームの見栄えと実行速度を向上させる多くのレンダリングオプション(LODサポート、画面空間のポストプロセス、高度なシェーダー、リアルタイムソフトシャドウ、遅延レンダリング)が不足しています。また、フルメカニムアニメーションシステムや一部の人工知能ツールも欠落しています。

一般的に、複雑で大規模なプロジェクトや、グラフィックス性能が重要な場合は、プロバージョンを使用する価値があると言われています。私はOculus Rift用のバーチャルリアリティゲームを開発しており、ヘッドセットと適切にやり取りするためには画面空間での後処理サポートが必要なため、プロバージョンを使用しています。

2 unityのインストール

Unityは簡単にインストールできます。実行ファイルは、unity3d.com/get-unity/downloadからダウンロードできます。

ダウンロードしたら、実行し、インストーラーの指示に従ってください。インストールが完了すると、「Unityライセンスを有効化する」というタイトルのウィンドウが表示されます。Unity Pro 30-day **** Editionを起動する」にチェックを入れ、「OK」を選択します。

おめでとうございます。現在、30日間のUnified Proの試用が可能です。試用期間終了後、プロ版を購入したくない場合は、無料版に切り替えて、既存のコンテンツを維持することができます。

オブジェクト指向のパラダイム入門

Unityを使い始める前に、少し基本をおさらいしておきましょう。 UnityはゲームプログラミングにC#とJavaScriptをサポートしていますが、このチュートリアルではC#を使用します。

まず、プログラミングをしたことがない人は、このチュートリアルを脇に置いて、簡単な作業であれば言語を使って問題ないと感じるまで、Microsoftの「C言語入門」を数日かけて学習してください。

C#とは少し違うものがいい(でも必ずしもUnityで使える言語ではない)という方は、「初心者にやさしいプログラミング言語6選」をご覧ください。

C言語やJavaなどの命令型言語やオブジェクト指向言語でプログラミングをしたことがある人は、入門書を閲覧して、過去に使ったことのある他の言語との違いに慣れ親しんでください。いずれにせよ、C#で簡単な問題を解くことに慣れるまではチュートリアルを続けないでください(例えば、最初の100個の素数を表示するプログラムを書けと言ったら、Googleを参照せずにそのプログラムを書けるようになることです)。

ここで理解すべき最も重要な概念は、オブジェクト指向のパラダイム(略してOOP)である。オブジェクト指向言語では、プログラムはオブジェクトと呼ばれる機能単位に分割される。各オブジェクトには、それぞれプライベート変数と関数があります。オブジェクトに固有の関数をメソッドと呼びます。

各オブジェクトを分離し、そのメソッドを通じて他のオブジェクトに相互作用させることで、意図しない相互作用の可能性を減らし、バグを拡張することができます。また、変更を加えずに後で再利用できるようなオブジェクトを作成することも可能です。ユニフィケーションでは、これらのオブジェクトを構築し、ゲーム・エンティティにアタッチします(その振る舞いを管理することになります)。

オブジェクトはクラスからインスタンス化されます。クラスとは、オブジェクトの定義を列挙したファイルにすぎません。つまり、ゲーム内の敵のAIを扱うMookオブジェクトが欲しい場合は、「Mook」クラスを書き、このファイルを各敵のエンティティに添付すればいいのです。ゲームを起動すると、各敵に「ムック」オブジェクトのコピーが装備されています。

以下のように、新しいスクリプトをオブジェクトにアタッチします。

まず、オブジェクトを選択してインスペクタを表示し、「コンポーネントを追加する」ボタンをクリックします。

新規スクリプト」を開き、任意の名前を入力し、「作成と追加」をクリックします。

これで新しいスクリプトができ、それをダブルクリックすることで編集できるようになりました

そのクラスファイルを以下に示します。

using UnityEngine;public class Mook : MonoBehaviour { private float health; void Start () { health = 100; } void Update(){ if (health > 0) { /* Search for player if you encounter the player on the road, kill him if you get shot, remove a random amount of health */ } }}

分解してみよう。

  • Use UnityEngine: この行は、Unityのライブラリを使用することをC#に伝え、Unityのゲームエンジンに接続できるようにします。
  • Public lesson Mook:Mono behaviour: この行は、クラスとその名前 - Mook を宣言しています。
  • Private float health: クラスのプライベート変数(クラス内部からしか変更できない)を宣言しています。変数にはStartで値が与えられる。
  • Void Start():Startというメソッドを宣言しています。Startは、ゲーム開始時に一度だけ実行される特殊なメソッドです。
  • Void Update():Updateもフレーム毎に実行される特殊なメソッドです。ゲームロジックのほとんどはここにあります。
  • // 道でプレイヤーに出会ったら、殺す:この行はコメントです(ダブルスラッシュで始まる行はC#では無視されます)。コメントは、特定のコードの役割を思い出すために使用します。この例では、コメントで記述された動作を実際に実行する、より複雑なコードブロックの代わりに、このコメントが使用されています。

StartとUpdateの他に、ほぼすべての名前のメソッドを独自にインスタンス化することができます。ただし、作成したメソッドは呼び出されない限り実行されません。addTwoNumbersという仮想のクラスに対して、2つの数字を足し合わせるメソッドを宣言してみましょう。

public float addTwoNumbers(float a, float b) { return a+b;}

これは、addTwoNumbers という float を返す public (他のオブジェクトからアクセス可能) メソッドを宣言しており、入力として 2 つの float (a と b と呼ばれる) を受け取ります。そして、2つの値の合計を出力として返す。

このメソッドを同じクラスから呼び出す(例:内部から更新する)方法を以下に示します。

float result = addTwoNumbers(1, 2);

他のクラスからメソッドを呼び出すのは似ている。

addTwoNumbers instance;float result = instance.addTwoNumbers(1, 2);

この場合も、クラスのインスタンスを作成し、適切なメソッドにアクセスして足したい数を与え、その結果をresultに格納するだけです。単純なことです。

通常のゲームオブジェクトのパラメータではアクセスできない特別なプロパティ(パーティクルエミッターなど)を持つオブジェクトにスクリプトをアタッチする場合、GetComponentメソッドを使用して、そのオブジェクトを別のタイプのゲームエンティティとして扱うことができます。

以下にその構文を示す。

GetComponent<ParticleSystem>().Play();

もし、これらのことをよく知らないのであれば、「C#入門」に戻ってください。そうすれば、この先、イライラせずに済みます。

4 統一的な基準

このセクションでは、Unityエンジンの基本的な仕組みを学びます。Unityのワークフローは次のとおりです。

  1. ゲーム内でキャラクタの役割を果たすエンティティを作成します(空白のゲームオブジェクトは、抽象的な論理タスクに使用することができます)。
  2. クラスファイルを書くか見つけて、それをスクリプトとしてエンティティに追加します(インスペクタビューのaddcomponentボタンを使用)。
  3. Run&gt; test&gt; debug&gt;動くまで繰り返し、次の要素に移る。

Unityには、ユーザーの好みに応じて様々なレイアウトが可能な基本的なビュータブが多数用意されています。主な要素は、以下の5つです。

  1. ゲーム: インタラクションやテストが可能なゲームの実行例が表示されます。
  2. 風景:ゲーム世界の静的で編集可能なバージョンを提供します。
  3. インスペクター:エディタータブで選択することで、ゲームワールド内の個々のエンティティを修正することができます。
  4. プロジェクト:プロジェクトのファイルを参照し、モデルやマテリアルなどのリソースをエディタタブにドラッグして、ゲームワールドに配置することができます。
  5. 階層:このタブにはワールド内のすべてのオブジェクトが表示され、シーン内の遠くのオブジェクトを見つけたり、クリックやドラッグでエンティティ同士を関連付けたりすることができます。

これらの位置関係は、以下の地図に示されている。

4.1 統一された実体

4.1.1 グリッド

メッシュとは、3次元の形状を一様に表現したものです。Unityに内蔵されている基本的なボディオブジェクト(立方体、球体、円柱など)を使用するか、BlenderやMayaなどのモデリングパッケージから独自の3Dモデルをインポートします。 Unityは.fbxや.3dsなど様々な3Dフォーマットをサポートしています。

グリッドを操作する基本ツールは、インターフェイスの左上にあるズーム、回転、パンの各ボタンです。これらのボタンは、エディタビューでモデルにコントロールアイコンを追加し、エディタビューを使って空間上で操作することができます。オブジェクトのテクスチャや物理特性を変更するには、オブジェクトを選択し、インスペクタビューでマテリアルとリジッドボディ要素を解析します。

4.1.2 gui要素

GUI TextやGUI Texture GameObjectを使って、従来のGUIスプライトやテキストをエディタで表示することが可能です。しかし、UI要素を扱うより堅牢でリアルな方法は、3DテキストとQuad GameObject(透明テクスチャとアンライト透明シェーダ付き)を使って、HUD要素をエンティティとしてゲーム世界に配置する方法です。

階層表示では、これらのゲームプレイ要素をメインカメラにドラッグしてサブオブジェクトにすることができ、カメラと一緒に移動・回転することを保証します。

GUI要素(テキストとテクスチャ)は、インスペクタタブの関連フィールドを使用してサイズとスケールを変更できます。

4.1.3 材料

マテリアルは、テクスチャとシェーダの組み合わせで、プロジェクトタブからゲームオブジェクトに直接ドラッグすることができます。明暗のあるオブジェクトに貼られたテクスチャは、それが適用されているオブジェクトの「インスペクタ」タブで調整することができます。

テクスチャをインポートするには、テクスチャを .jpg, .png, .bmp に変換して、Unity プロジェクトディレクトリの assets フォルダにドラッグします(デフォルトでは、このフォルダは My Documents に表示されます)。数秒後、エディタにローディングバーが表示されます。これが完了すると、「プロジェクト」タブにテクスチャとして画像が表示されるようになります。

4.1.5 照明

ライトは、世界に光を投射するゲームオブジェクトです。シーン内に照明がない場合、すべてのポリゴンが同じ明るさで描画されるため、世界が平坦で色あせて見える。

ライトの位置や回転、いくつかの内部機能のカスタマイズが可能です。強度」スライダーは光の明るさを、「範囲」は光が消えていくスピードをコントロールします。

シーンビューのガイド線は、照明の最大範囲を示しています。この2つの設定を使い分けることで、思い通りの効果を得ることができます。また、光の色、光が当たっている面に表示されるパターン(クッキー)、光を直接見たときに画面に表示される光点の種類を調整できます。クッキーを使って、よりリアルな照明パターンのフェイク、ドラマチックなフェイクシャドーの作成、プロジェクターのシミュレートが可能です。

光の種類は大きく分けて、スポットライト、点光源、指向性光源の3種類があります。

スポットライトは3次元空間に位置し、角度可変の円錐形で一方向にのみ光を投射する。トーチやサーチライトに適しており、一般に照明をより正確にコントロールすることができます。スポットライトは影を落とすことがあります。

点光源は、3次元空間内に位置し、全方向に均一に光を照射する。点光源は、影を作らない。

最後に、平行光源は太陽光を模したもので、あたかも無限の距離から光を投げかけているように、一方向に光を照射するものです。平行光は、シーン内のすべてのオブジェクトに影響を与え、影を発生させることができます。

4.1.6 パーティクルシステム

パーティクルシステムとは、数百、数千のパーティクルを同時に生成し、制御できるゲームオブジェクトのことです。パーティクルは、3次元空間に表示される最適化された小さな2次元オブジェクトです。パーティクルシステムは、簡略化されたレンダリングと物理演算を使用しますが、何千ものエンティティをスタッタリングなしにリアルタイムに表示することができます。

これらの効果を得るために多くのパラメータを調整することができ、「コンポーネントエディタ」 &gt; 「パーティクルシステムの選択」 &gt; 「インスペクタを開く」タブでパーティクルシステムを生成してアクセスすることができます。&gt; "open inspector "タブで、これらのパラメータにアクセスするためのパーティクルシステムを生成することができます。各粒子のサイズ、速度、向き、回転、色、質感を変更でき、これらのパラメータのほとんどを時間経過とともに変化するように設定することができます。

Collisionプロパティで、このプロパティが有効で、Simulation spaceがWorldに設定されている場合"ワールド "にあるオブジェクトに衝突するパーティクルを取得し、雨、動く水、火花など、多くのリアルなパーティクルエフェクトに使用することができます。

5 例:ゲームの基本要素

このチュートリアルでは、**ピンポンの簡単なゲーム - 私たちはDIYで前に数回説明したことがある:。

  • Arduinoクラシック卓球
  • Arduino OLED Pong

このセクションでは、コアエレメントをどのように配置するかについて説明します。

まず、ピンポンゲームを基本的な構成要素に分解してみましょう。まず、パドル2本とボール1個が必要です。ボールが画面外に飛んでしまうので、それをリセットする仕組みが必要です。また、テキストには現在のスコアを表示させ、unityのコアな要素をすべて見せるために、ボールを打つときに奇妙なパーティクル効果を使いたいのです。ゲーム全体にドラマチックな照明が必要になってきます。

内訳は、ボールオブジェクト(球体)、スポナー、パーティクルエミッター付きパドルプロップ2個、3Dテキストエンティティ、スポットライトです。このチュートリアルでは、デフォルトの物理マテリアルであるバウンスを使用し、バウンス合成を乗算に設定します。以下、10枚のスクリーンショットから設定内容を紹介します。

まず、キューブパドルのプロップを作成します。

適当に拡大縮小して複製し、ボールのパドルの間に球体を配置します。

次に、3DTextオブジェクトを作成し、それを正しく拡大縮小して配置し、「フォントサイズ」プロパティを変更して、より少ないピクセル数の画像を取得します。

次に、2つのパーティクルシステムを作成し、必要な機能をピックアップしてパドルに装着する。

次に、シーンのフレームを正しく設定するために、カメラの位置と回転を設定します。カメラを選択すると、右下にカメラビューの小さなプレビューが表示されます。

最後に、ボールがプレイエリアから飛び出さないようにするための緩衝材として、2つのキューブを追加で作成する必要があります。インスペクター」タブの「メッシュレンダラー」のチェックを外すことで、不可視にすることができます。

再生」をクリックすると、ゲームの基本的な要素が表示されます。

さて、このような設定ができたので、これらの要素を**ゲームにどう書くかについて説明します。

6 ユニフォームスクリプト

オブジェクトにスクリプトをアタッチした後、インスペクタでスクリプトをダブルクリックすると、スクリプトを修正することができます。Unityのデフォルトの開発環境であるMonoDevelopが起動します。Monodevelopは、プログラミングに最適化された機能を持つテキストエディタです。

キーワードとコメントは青と緑で、値と文字列は赤で表示されます。EclipseなどのIDEを使ったことがある人なら、MonoDevelopはとてもよく似ています。以下のように、エディター内からスクリプトを構築して、構文エラーをチェックすることができます。

一般的に、スクリプトをUnityと連動させるには、スクリプトを含むオブジェクトが持つ要素を参照する必要があります(これらの要素の一覧は、関連するオブジェクトを選択するとインスペクタタブで見ることができます)。そして、各要素に対してメソッドを呼び出したり、変数を設定することで、必要な変更を実行することができます。

あるオブジェクト上のスクリプトが他のオブジェクトのプロパティに影響を与えるようにしたい場合は、スクリプト内に空のGameObject変数を作成し、インスペクタを使ってシーン内の他のオブジェクトに代入します。

オブジェクトが持つ可能性のある要素のリストは以下の通りです(上の例のパドルのインスペクタビューから抜粋)。

  1. トランスフォーメーション
  2. キューブ(メッシュフィルター)
  3. ボックスクラッシャーズ
  4. グリッドレンダラ

オブジェクトのあらゆる面にスクリプトから影響を与えることができます。次に、これを行う方法を具体的に説明します。

6.1 変換

Unityのゲームオブジェクトのtransform関数は、そのオブジェクトの物理パラメータ(スケール、位置、向き)を制御します。

transform.position = newPositionVector3;transform.rotation = newRotationQuaternion;transform.localScale = newScaleVector3;

上の例では、名前付き変数は、名前で指定された型になります。3 各ベクトルの x、y、z 成分にアクセスすることができます(たとえば、変換 position.y はゼロ平面上のオブジェクトの距離を与えます)。

ただし、ジンバルロックを避けるため、回転はクォータニオン(4成分ベクトル)として扱われます。手動での操作は直感的でないため、クォータニオンを使用することができます。オイラー法は次のようなものである。

transform.rotation = Quaternion.Euler(pitch, yaw, roll);

ある場所から別の場所へオブジェクトを滑らかに移動させたい場合、クォータニオンとベクトルのSlerp法が便利です。slerpは3つのパラメータ(現在の状態、最終状態、変化率)を受け取り、与えられた率でそれらの間を滑らかに補間します。以下にその構文を示す。

transform.position = Vector3.Slerp(startPositionVector3, newDestinationVector3, 1);

6.2 レンダラ

Unityのレンダラー機能では、プロップの表面を画面上に描画する方法を制御することができます。テクスチャーの貼り替え、色の変更、オブジェクトの明暗や視認性の変更も可能です。以下にその構文を示す。

renderer.enabled = false; renderer.material.color = new Color(0, 255, 0); renderer.material.mainTexture = myTexture; renderer.material.shader = newShader;

その多くは、機能が明確になっています。最初の例は、問題のオブジェクトを見えなくするもので、多くの場合、これは便利なトリックである。2番目の例は、議論中のオブジェクトに新しいRGBカラー(つまり緑)を割り当てています。3つ目は、メインの拡散テクスチャを新しいテクスチャ変数に割り当てることです。最後の例は、オブジェクトマテリアルのシェーダを新しく定義したシェーダ変数に変更するものです。

6.3 物理的

Unityには物理エンジンが統合されており、すべての物理サンドボックスゲームはこのエンジンを使用しています。これにより、オブジェクトの物理特性を指定し、そのシミュレーションの詳細を扱うことができるようになります。まとめると、教科書や変換システムを使って独自の物理を実装しようとするよりも、可能な限りUnityの物理エンジンを使ったほうがシンプルで堅牢になるということです。

すべての物理プロップはコライダーを必要とします。しかし、実際のシミュレーションそのものは、インスペクタービューに追加できるリジッドボディで対応します。剛体は、キネマティック、ノンキネマティックのいずれでもよい。

キネマティック物理プロップは、周囲の非キネマティック物理プロップと衝突し(そしてそこから効果を生み)ますが、衝突そのものには影響されません。静的なキネマティック・プロップは動かない物体として有名ですが、動くキネマティック・プロップは止められない力として有名です(ちなみに、衝突しても単に通り過ぎるだけです)。

このほか、物体の角度抵抗(回転させるのに必要なエネルギー)の調整、質量の変更、重力の影響の有無の表示、力のかけ方などが可能です。

rigidbody.angularDrag = 0.1f;rigidbody.mass = 100;rigidbody.isKinematic = false;rigidbody.useGravity = true;rigidbody.AddForce(transform.forward * 100);

すべて自明なことである。ここで注意したいのは、フォワードコンバージョンです。Vector3はすべて3つのコンポーネント(.forward, .up, .right)が関連付けられており、それらにアクセスして回転させることができます(forwardはエディタ内の青い矢印の方向です)。この前方変換キーワードは、単純に現在のオブジェクトの前方ベクトルで、サイズは1です。オブジェクトにもっと力を出すために浮動小数点数を乗じることができます。また、コンバートだけでなく、コンバート・アップも参照できます。そうですね、そしてそれを否定することで逆の結果を得ることができます。

6.4 衝突事故

ゲームを作るとき、物理シミュレーションだけでなく、衝突によってコード内に何らかの状態変化を起こしたいことがよくあります。そのためには、衝突検出の方法が必要です。

統一体の衝突を検出するためには、ある種の準備が必要である。まず、衝突するオブジェクトのうち少なくとも1つは、非キネマティックな剛体が取り付けられている必要があります。どちらのオブジェクトも、正しいコライダーが非トリガーに設定されている必要があります。2つの物体の合計速度は、単に相手の物体を飛び越えるのではなく、実際に衝突するのに十分な低速でなければならない。

ここまで気をつければ、衝突チェックの対象となるオブジェクトに付属するスクリプトに、専用の衝突判定メソッドを配置することで、衝突チェックを行うことができます。その方法を以下に示す。

void OnCollisionEnter(Collision other) { //do things here}

このメソッドは、他のオブジェクトがあなたのオブジェクトに接触した最初のフレームで自動的に実行されます。collision entity other は、ヒットしたオブジェクトへの参照である。例えば、ゲームオブジェクト、リジッドボディ、トランスフォーム機能として参照することで、様々な操作を行うことができます。OnCollisionEnter はおそらく最もよく使う関数ですが、oncollisionxit と OnCollisionStay(それ以外は同じ構文と使い方)も使えます。これらはそれぞれ、オブジェクトとの衝突を停止した最初のフレームとオブジェクトと衝突した各フレームの間に起動されます。

光線投影と呼ばれるものを行うと便利な場合があります。レイキャスティングでは、ある原点からあるベクトルに沿って無限に細い線(レイ)を世界に投影し、それがオブジェクトに衝突したときに、最初に衝突した位置などを返します。以下に、光線投影のコードを示します。

RaycastHit hit;if (Physics.Raycast(transform.position, -Vector3.up, out hit)) { float distanceToGround = hit.distance;}

これは、現在のオブジェクトの位置から -Vector3.up に沿ってレイをキャストし(真下に)、変数 hit が最初に衝突するオブジェクトにリンクされます。光線が何かに当たると、その距離に応じてヒットディスタンスに入ったり、ゲームオブジェクトに当たってヒットしたオブジェクトを操作したりすることができます。

このような光の投射は、撮影者が銃の向きを判断したり、カメラで見ている最中に対象物を選択したり、ある種の動作に利用することができます。

6.5 時間補正

このようにオブジェクトを操作する際に重要な要素となるのが、フレームレートです。どんなに慎重に最適化しても、フレームレートは常に変化するので、それに合わせてゲームスピードも変化させたくない。もし、他の人があなたの開発したゲームよりも速いコンピュータであなたのゲームを動かしていたら、ゲームが2倍のスピードで動くのは困りますよね。

これを修正する方法は、使用した値に最後のフレームをレンダリングするのにかかった時間を掛けることです。これは、time.deltaTimeを使用することによって行われます。 これは、フレームごとに増分される変数の速度を、「フレームごとの変化」から「秒ごとの変化」に効果的に変更し、おそらくフレームごとに増分または減分される値を変更する必要があります。

6.6 音源とリスナー

ユニティは、2Dサウンドと3Dサウンドの2種類のサウンドをサポートしています。3Dサウンドは距離によって音量が変わり、カメラに対して相対的に動くと歪みますが、2Dサウンドはそうではありません。

2Dサウンドはコマ切れ音やBGMに、3Dサウンドは世界のイベントから発生する音に使用されます。3Dかどうかを変更するには、プロジェクトビューでサウンドを選択し、インスペクタビューに切り替えてドロップダウンメニューから適切なオプションを選択し、「再インポート」ボタンを押します。

実際に音を出すには、オーディオソースをプロップ(3Dサウンドの場合、音を出したいプロップ)に取り付ける必要があります。次に、オーディオクリップのフィールドを開き、サウンドファイルを選択する必要があります。

myAudioSource.pause()とmyAudioSource.Pause()を使うことができます。これらのサウンドファイルを操作するには、再生( )します。audiosourceのinspectorタブで、音の減衰挙動、音量、ドップラーシフトを調整することができます。

6.7 入力

ユーザーからの入力を一切受け付けないゲームは、ゲームとは呼べない。読み込むことができる入力には様々な種類があり、そのほとんど全てにinputとKeyCodeオブジェクトでアクセスすることができます。以下は入力文の例です(1フレームにつき1つの値を計算します)。

Vector3 mousePos = Input.mousePosition;bool isLeftClicking = Input.GetMouseButton(0);bool isPressingSpace = Input.GetKey(KeyCode.Space);

これらの線の機能はほぼ自明であり、この3つの入力参照を使えば、最近のほとんどの3Dコンピュータゲームの制御方式を再構築することができます。

6.8 デバッグ用スクリプト

スクリプトが動作しないとして良いドクターが言ったように、あなたは困っているかもしれません。C#に明らかな構文エラーがある場合、通常、playを押したときにゲームの実行が拒否されますが、エディタでスクリプトをビルドすると、非常に有用なエラーメッセージが表示されます。次の表をご覧ください。

これらのバグは通常、修正するのが最も困難なものではありません。もっと問題なのは、微妙なセマンティックエラーで、自分が思うようなファイルではなく、有効なC#でいっぱいのファイルを書くことができた場合です。このようなエラーが発生し、その原因を突き止めるのに苦労している場合、状況を改善するためにできることがいくつかあります。

まず、ゲームの実行を一時停止して、コンソールを確認します。エディター上部の一時停止アイコンをクリックし、ウィンドウメニューの下部からc***oleを選択(またはCtrl&gt; Shift&gt; Cを押す)すると、ゲームを一時停止することができます。エラーがない場合でも、警告は何が問題だったのかの手がかりになります。

それでもうまくいかない場合は、内部変数の状態を出力してスクリプトの状態を見ることで、プログラムが思った通りの動作をしているかどうかを検証してみることもできます。デバッグログ(文字列)を使用すると、プログラムの実行がある行に達したときに、文字列の内容をコンソールに表示することができます。一般に、「こうなるはずだ」と思うことから「こうなるべきだ」と逆算していくと、やがてデバッグプリントが期待通りにならない地点に行き着くものです。そこを間違えているんです。

7 例:ポンのスクリプト化

ピンポンを作るには、パドルの間を速いスピードで往復するボール、ボールがパドルを通過したことを知るスコアボード、ボールがパドルを通過したら再スタートする仕組みなど、ゲームの核となる要素に分解して考えてみましょう。最初のステップとして、ボールに非キネマティック剛体、パドルに2つのキネマティック剛体を追加し、すべての剛体の重力を無効にし、標準リソースから適切な物理素材を指定します(バウンス結合を乗算に設定したバウンス)。

以下では、ボールのスクリプトを解説付きでご覧いただけます。ボールは複雑なパターンで跳ね、常に両軸の動きを維持し、不可能ではないが困難な速度で水平方向に加速しなければならない、という基本的な目標を達成する必要がある。

株式会社ボールハンドラ.cs

次に、パドルをスクリプト化する必要があります。ボタンを押すとパドルが上下に動く必要がある(ただし、特定の範囲を超えないこと)。また、オブジェクトと衝突したときにパーティクルシステムを起動させる必要があります。

パドルプロセッサー.cs

次に、敵のAIが必要です。敵のパドルを一定の速度でボールに向かって移動させるものです。これには、最大限シンプルにするために、Vector3.Slerpを使用することにします。また、私たちのパドルに見られるような粒子の挙動も求めています。

エネマズ

最後に、スコアボードを更新し、ボールがアウトオブバウンズになったときにリセットするスクリプトが必要です。

スコアボード更新プログラム.cs

このスクリプトと、ピンポンゲームを実行するときに記入するリファレンスで、ゲームを体験するのです

私のピンポン・デモをダウンロードすれば、私が説明した内容を実際に確認することができます。Windows、Mac、Linuxの各システムで動作します。

8 資料を見る・詳細を見る

Unityは複雑なエンジンであり、このようなガイドでカバーできる範囲をはるかに超える機能を備えています。このガイドを読めば、ゲーム開発のスタートラインに立つことができますが、自己啓発はどんな努力においても重要なスキルであり、ここではなおさらです。

ここで重要なリソースとなるのが、Unity Script Referenceです。 ScriptReferenceはC#とJavascriptの検索可能なデータベースで、Unityのすべてのコマンドと機能のリスト、機能の説明と短い構文例を含んでいます。

Unityのエディターやインターフェイスについて質問がある場合や、ビデオチュートリアルがお好みの場合は、高品質のUnityビデオチュートリアルが多数用意されています。 catlikeCodeでは、より広範囲(ただしそれほど広くない)のUnityテキストチュートリアルも提供されています。

最後に、ドキュメントやチュートリアルの範囲を超えた質問がある場合は、Answers.Unity3dのWebサイトで回答しています。回答はボランティアで行われていますので、まずは自分の質問に回答がないかをデータベースで検索し、ボランティアの時間を尊重するようにしてください。

9 ゲームのビルド/スタンドアロン・アプリケーションへのコンパイル

自慢のゲームを作ったら(あるいは、ちょっといかがわしいPongの例のクローンを作る練習をしたら)、エディターからゲームを取り出して、インターネットに公開して、友達や家族に遊んでもらえるようなものに作り変えましょう。そのためには、別途アプリケーションを構築する必要があります。Unityでは、これがとても簡単にできるのが良いところです。しかし、気をつけなければならないのは、潜在的なウッカリです。

初心者の方は、エラーのないプロジェクトしか作れないことを意識してください。エディタでは、ゲームはいくつかのエラー条件を無視しますが、それでもビルドの試みは中断されます。この場合、エラーメッセージがコンソールに出力されるだけで、画面には結果が表示されないので、確認し忘れるとイライラすることがあります。ただし、エラーなくコンパイルできたら、「ファイル」メニューの「ビルド設定」を選択するか、Ctrl&gt; Shift

>B. 複数のプラットフォーム向けにゲームを構築するための簡単なダイアログボックスが表示されます。

オプションを選択してビルドをクリックすると、実行ファイルとデータディレクトリの両方を含むディレクトリにインストールするように促されます。両方のファイルをzipで圧縮して配布することができます(ただし、Unityのデモでビルドしたゲームに課金されるのは利用規約違反になりますので、ご注意ください)。

10 閉会の辞

他のゲーム開発ツールと同様、Unityの成功の鍵は反復的な開発です。野心的であることはもちろんですが、その野心を小さな塊に分解し、その塊を並べることで、たとえ最終的な野心に到達できなかったとしても、少なくとも首尾一貫した製品を作ることができるのです。

最も重要な要素を理解することから始めましょう。最もシンプルで実現可能な製品、つまり、あなたが作ることができる最も簡単でシンプルなもので、なおかつ価値のある何かを達成したと感じられるものを念頭に置いてください。大きな野望に着手する前に、最低限実行可能なプロジェクトを作る。

このチュートリアルは強力な出発点を与えてくれますが、ユニフィケーションを学ぶ最良の方法はゲームを作ることです。自分の知識の隙間を埋めるゲームを作り始め、それが出てくると、徐々に知識の流れが知らないものを侵食していきます。

ここまで読んで、Unityで必要なコーディングに少し圧倒された方は、ぜひ「Unityを使ってゲーム開発を学ぶ方法」や「**プログラミングなしでビデオゲームを作る方法**」をご覧ください。

Unityは強力なツールであり、少し探せば印象的なプロジェクトをより速く構築することができます。あなたが作ったものをぜひ下のコメント欄で教えてください。

あなたが興味を持っているかもしれない記事

匿名者
匿名者

0 件の投稿

作家リスト

  1. admin 0 投稿
  2. 匿名者 0 投稿

おすすめ