Unity で 2D 横型ゲームのデモを開発する

 

#LanWゲームプロジェクト

5d211f15aba14b70ac770a6b275e9b94.jpeg

目次

(1) はじめに

(2) インストールチュートリアル

(3) 開発プロセス

1. 新築

2.キャラクターを設定する

3.主人公の動きをコントロール

4. アクション切り替えのアニメーションを追加

5. カメラ追跡

6.物を集める

7. UI の作成

8. 敵を作る

9. 敵のアイを作る

10. カエルのアニメーションの作成

11.コードを最適化する

12.効果音を設定する

13.ダイアログを作る

14.デッドバウンダリを作る

15.シーン遷移を行う

16.視差 視差

17. メニューを作成する

18.オーディオトラックを作る

19. ゲームをパックする

(4) よくある問題と解決策

(5) ありがとう


 

 

(1) はじめに

この記事では主に、Unity を使用して単純な水平プラットフォーム ジャンピング ゲームのデモを開発する方法を紹介します. このゲームで表示される資料はすべて unity ストアからのものです. 開発プロセスは参照コードの一部のみを示しています. ゲームのすべてのプロジェクト ファイルと Theコードは https://gitee.com/lan-dashai/lan-w-game-project/tree/master にあります

ソフトウェア環境
Visual stdio 2019 
Unity Hub;
エディターバージョン: Unity 2021.3.7f1c1(LTS);


(2) インストールチュートリアル

1. 最初に Web ページで URL を検索します: https://unity.cn/unity-ggac-2021
2. クリックして unity ハブをダウンロードします
3. エディター バージョンをインストールします

(3) 開発プロセス

1. 新築

*アセット ストアで適切なパッケージを検索し、パッケージ マネージャーでダウンロードしてダウンロードしてインポートします
*背景画像の単位あたりのピクセル数を 16 に変更し (各グリッドには 16 ピクセルが含まれます)、適用します 背景画像をレベル ウィンドウにドラッグしますその位置をロードしてリセットする

主なインターフェースは次のとおりです

450a5bc22ca64e56aae76c092adc5485.png
 レベルで新しい 2D obj タイルマップを作成します
* 表示するために背景画像を非表示にします ウィンドウ 2D でタイル パレットを選択します
* ウィンドウで新しいものを作成し、それに map という名前を付けます デフォルトのジャンプ フォルダーに maps という名前の新しいフォルダーを作成します
* タイル マテリアルを設定します16 個のスプライトを自動的にカットするには、モードを複数に変更します. スプライト エディターをクリックします. ウィンドウ内の GridByCellSize ピクセルをクリックして 16*16 に設定し、カットします. カットしたら、[適用] をクリックしてタイルにドラッグします
.パレット. ブラシをクリックしてマップを描画します (編集をオフにします) (消しゴムを使用します 消去することができ、現在のタイル マップを選択することを忘れないでください) *メイン カメラの属性サイズを 6 に調整します 背景画像をクリックして追加

ます新しい並べ替えレイヤーは、背景と前景に名前を付けます背景をBGに設定します

 

 

2.キャラクターを設定する

*キャラクター画像を20に変更し、レベルで新しい2D Spriteを作成し、キャラクターをSprite Renderの編集パネルのSpriteにドラッグしてリセットし、キャラクターのAd​​d ComponentをクリックしてRigidbody 2Dを追加します(剛体は紙を回転させ
 ます*引き続きキャラクターを
作成します コライダー ボックスを追加します コライダー 2D 3 つのボックスを接続するアイコン (編集) をクリックし、緑色の境界線を適切な位置に引きます マップにタイルマップ コライダー 2D を追加します ゲームを実行し
 、キャラクターは地面に立つことができます

51da2068382c4ee1b40fd3a3189b6ada.png

b1708f990fcb4b529124ed32caf7af0c.png

 

d7488a1b6f7a4655be4854d36e18d39d.png

 

 

3.主人公の動きをコントロール

* キャラクターのコードを追加 Add New Scripts 名前を付けて PlayerController スクリプトを
開いて
剛体を作成 public Rigidbody2D Rd; 剛体を作成した剛体にドラッグ
初期速度を作成 public float Speed; 10 に設定して
移動方法を作成newfloat 入力を受け取る GetAxis ( horizo​​ntal) if ステートメントが 0 (つまり -1 または 1) でない場合 Rd.velocity 剛体の動き = newVector2 (Horizo​​ntalMove * Speed, Rd.velogy.y); Freeze Rotation にチェックを
入れるキャラクター剛体のコンストレインの Z (Z 軸を固定) そうしないと、移動時に剛体が回転してしまいます.
速度パラメータは試用中に調整できますが、試用が終わった後は保存されません.を手動で設定し、
文字の向きを変更するコードを記述する 移動メソッドで float を作成して、入力を受け入れる GetAxisRaw (水平)-1 0 1 整数 if ステートメント 0 でない場合、オブジェクトの transform.scale (in unity) = new Vector3(FaceDirection,1,1); * (
最適化されたコード) Update を FixedUpdate() に変更して、フレームが 60 未満のコンピューターでプログラムをスムーズに実行できるようにします。 deltaTime、ゲーム内の Speed を 400 に変更します。
ジャンプ力を作成するコードを書く public float JumpForce 移動関数 if Input.GetButtonDown("Jump") then Rigidbody.velocity = (Rigidbody.velocity.x, JumpForce * Time.deltaTime); に if ステートメントを追加し、JumpForce を設定します。 Unity キャラクターの 剛体の Gravity Scale を 400 の 2 に変更します。

dc86c0bd98b246edb8c212b73156e5e9.png

cc869d42797a402cb2729b06493c439f.png

e95b9889fdf44c1b920e8b4638b7d57d.png

 

 

 

4. アクション切り替えのアニメーションを追加

*Add Animator コンポーネントをキャラクターに追加し、新しい Animation フォルダーを作成して管理します.下の新しい Player フォルダーに新しい Animation Controller を作成し、Player という名前を付けて、コンポーネントの Controller 位置にドラッグし、Window Animation Animation をクリックします。 [作成] をクリックして作成し、アイドル
(静止) という名前を付けます アセット内のすべてのアイドル画像を 16 に変更し、それらすべてをタイムラインにドラッグします
*サンプリング レートのサンプル (3 点が開いている) を 10 に設定します (またはすべてを選択します)ノードを適切な長さにドラッグします)
*新しいアニメーションを作成し、名前を付けます ランのファイル保存場所に注意してください アセットでキャラクター画像のラン画像を開き、16に変更します タイムラインにドラッグして、 Samples のサンプリング レートを 10 にします (Loop Time はデフォルトでチェックされています)
Animator コンポーネントの Parameters コンポーネントのドロップダウン トライアングルで Float を選択し、Float を追加して Running という名前を付けます
*接続線を選択し、Has Exit Time のチェックを外します (noアニメーション バッファはすぐに切り替わります) [設定] の [遷移期間] を 0 に変更します (時間の変換は必要ありません) [条件] で、プラス記号をクリックして条件の値を追加し、それを 0.1 に変更します. 同様に、[条件のより大きい] を [実行] から [実行] に変更し 
ますIdle to Less
*新しい変数を作成するコードを書く public Animator Animator; Animator.SetFloat( 移動関数「Running」で、Math.Abs​​ (受け入れられた水平方向の絶対値)) を追加 保存後、文字エンコードに戻りますunity のコンポーネントを開き、そこに Animator コンポーネントをドラッグします
*アニメーション ジャンプとフォールの作成 画像 16 を Animator コンポーネントにドラッグし、接続を設定します (実行、アイドル リンク ジャンプ、ジャンプ リンク フォール、フォール リンク アイドル) *パラメーターの追加 ジャンピング フォール アイドル *接続パラメーターを設定します (ランおよびアイドル ジャンプ時

実行Jumping は Jump に true です) (Jump の Jumping は false で、Falling は Fall に true です) (Fall の Falling は false で、Idle は Idle に true です) *PlayController スクリプトを開く*コードを書く void SwitchAnimation if ( Animator.GetBool ("Jumping"
)
) {剛体の y 座標が < 0 の場合、Jumping を false に設定し、Falling を true に設定} *
コードを記述 public LayerMask Ground; 地面を取得するには、Ground という名前のタイルマップに新しいレイヤー設定を追加し、Player Set を選択します。エンコーディング コンポーネントの Ground を Ground
* コードを記述します public Collider2D Collider2D; キャラクターのコリジョン ボディを取得するには、SwitchAnimation の elseif を記述します (Collider2D.IsTouchingLayers(Ground)) {Set Falling を false に、Idle を true にします} *Bool を at に定義します関数の冒頭 Animator.SetBool("Idle", false);
(ちらつきがある場合はレイヤーまたはelseifを確認してください)!
*ボックスコライダーをキャラクターに減らしますクリクルコライダーの衝突ボディを下半身の位置に追加します
※ Rigidbody と Animator を private に変更するコードを記述し、その取得メソッドを start = GetComponent<Rigidbody 2D>; = GetComponent<Animator>; (<> 内の名前は unity コンポーネントでの名前) に記述します (定義の前に追加
[ SerializeField] は、それを表示して操作不能にすることができます)

5a3de6437c9b40ffad58377638bbfae8.png

1cb8e2b89ee44ab0826c2c337cf1674a.png

 

 

5. カメラ追跡

*メインカメラのコードを追加 CameraControl と名付け
コンポーネントを追加 Cinemachine コンポーネントメニューにカメラを追加 2Dカメラを作成 プレーヤーをドラッグしてフォローする (デッドゾーン調整がエリアに追従し始める 画面のX/Yはキャラクターの固定位置を調整する) ctrl d 画面いっぱいになるまで背景をコピーし
、新しい Empty を作成し、BackGround という名前を付け、 
2DCamera の Add Extension コンポーネントで 3 つの背景を整理し、CinemachineConfiner を選択し、
BackGround に Polygon Collider2D を追加し、トリガーに設定します (チェックします)。 Edit をクリックして、ポリゴンの頂点を画面の隅に引っ張ります.ctrl を押しながらクリックして削除し、2D カメラの Bounding Shape2D に追加します

b63d5c26e812487aa9c2ba880e8147f2.png

 

6.物を集める

*Cherry用のフォルダを作成し、絵の素材を16に変更し、ドラッグ&インポートしてコンポーネントAnimatorを追加し、Assetsのanimationフォルダの下にAnimationControllerを作成してCherryという名前を付け、Animatorにドラッグ&インポートし、新しいCherryアニメーションを作成しますコンポーネントエディタで画像をドラッグ
* Box Collider2D を Cherry に追加 Edit をクリックして isTrigger に調整 (これは衝突するかどうかを検出し、衝突効果を持たせないためのデバイスです) *
Cherry という新しいタグを作成しますCollection
※キャラクターのコードを開いて新しい関数を作成する void OnTriggerEnter2D()にif文を書く if (collision.tag == "Collection") {Destory (collision.gameObject);} 衝突オブジェクトのタグがCollectionの場合、衝突オブジェクトを破壊します * カウンターを作成します public int Cherry
破壊後 write Cherry++;

8b49adb86be84d0f9ccba0091eea3b36.png

 

7. UI の作成

*レベル1で新しいUIキャンバスUIキャンバスを作成し、キャンバスを右クリックしてUIテキストを追加し、Cherryという名前を付けます。
オブジェクトの位置を見つけ、テキストを適切な位置に移動し、テキストの内容を変更して適切なサイズを調整します
*新しい UI テキストに Numbers という名前を付け、テキスト コンテンツとその属性を
書き込み用に変更します コードは UI テキストを取得します public Text CherryNumber; を使用して保存した後、Number をそれにドラッグします *
コードを追加 CherryNumber.text = Cherry.ToString( ); OnTriggerEnter
(固定テキスト位置)で *Cherry テキストの設定方向マップ (中央中央のアイコン ) をクリックし、左上隅の数値テキスト
として場所を選択します。同じ操作(Cherry の UI イメージを作成し、UI を作成し、 Gem の衝突体とコード)

3ba63f96b1e14d7abe80809f18066350.png

 

 


8. 敵を作る

*Enemy Frog を作成し、その中にカエルの絵をドラッグし、その Idle アニメーションと Jump アニメーションを作成し、それに Rigidbody 2D と Box collider 2D を追加し、衝突体の位置を調整します *新しい関数 private void OnCollisionEnter2D() {} を作成

ますstatement when collision.gameObject.tag (トリガー タイプでない場合は、gameObject を追加する必要があります) == "Enemy"; When Destory(collision.gameObject)
コードを調整して、キャラクターが落下を実行しているときに && 新しい条件を追加します。 action
*怪我をして退却するキャラクターを追加するコードを書く new public bool IsHurt; in Update Run Movement when if (IsHurt == false); 衝突体が敵に当たったとき && キャラクターの x 軸
が敵のx軸(左から敵に触れた時) IsHurt = true キャラクター剛体.Velocity = New Velocity(-10,y) 逆は
右側も同じ
*else ifを追加するときのコードを書く(IsHurt) in SwitchAnimation, if (剛体の x 速度の絶対値 <0.1f), IsHurt = false; (落下するコードの上に書きます。そうでない場合は、実行と落下を続けます) * 書き込み コードはアニメーション コードを追加し
ますIsHurt で条件を指定し、SetFloat("Running", 0); を書き込み、損傷アクションが完了した後に通常のアクションに戻るようにします。

 

9. 敵のアイを作る

* Frog Get GetComponent<> のコード プライベート変数 rb を Start に追加
* Heri に Frog のサブ項目を移動領域として追加し、観察しやすくし、色を変更
* IsFaceLeft ブール値を作成して左右の動きを観察するコードを作成を超えない 左右の点の xy 座標サブオブジェクトが別々に設定されている DetachChildren
* xy を作成するコードを記述し、Start で値を割り当て、実行後に 2 つの点を破棄します
a73d853d9ffa470f96cb227913af5280.png

 

 

10. カエルのアニメーションの作成

*カエルのジャンプ落下アニメーション接続をそれぞれ追加して設定
*y軸の動きをJumpFoeceに変更するコードを書く if rb.IsTouchingLayers(Ground)のpre-if文を追加し、ジャンプアニメーションをオンにしてジャンプを自動実行する イベントを
追加キーフレームをアニメーション コンポーネント コントローラにドラッグし、立ちアニメーションの最後までドラッグし、記述された Movement() に Function を設定し、コード内の Movement コメントを更新します *コードを記述して、SwitchAnimation() を追加する if Jumping がジャンプするアニメーションを変更する
else
if地面に衝突し、落下アニメーションをオフにします
* カエルの死のアニメーションを追加します Any State 接続から、コントローラのトリガー スイッチを追加し、Death という名前を付けます
*パブリックの Death 関数をカエルに追加するコードを記述します。
EnemyFrog エンティティ EnemyFrog Forg = collision.gameObject を、キャラクター アニメーションのタッチ フロッグの if 文に追加 GetComponent<EnemyFrog>(); し、Frog を使用して Death を呼び出します *Destroy 関数を追加するコードを記述します Destroy(
gameObject ) カエルの場合; 死のアニメーションの最後にキー フレームを追加して、破壊を有効にします。

c1982938fa9644c488c52d6aa9c67c24.png

 f8a70495bca94c478c2e2fa1b1822b72.png

 

 ed59a4204c874857946daf94013bf243.png

9864feea5b124d7db6824afe6c6e5e6a.png 

 

0d205011ca914376aa966287713e7307.png

 

11.コードを最適化する

*ルート ディレクトリに新しい C# Enemy を作成し、新しい変数 protected Animator Anim を作成し、Start Update 関数を取得して保護された仮想 void Start() (保護された仮想関数) に適応させます * EnemyFrog の: 親クラスを Enemy に変更し、カエルの変数
Animator とその Start でコメントを取得
* カエルの Start を protected に設定 override void Start () (親クラスのメソッドをオーバーライド) と同時に base.Start () を呼び出し
* Destory と Destory に注釈を付けてコピーDeath 関数を Enemy にして All を public に設定
※文字コード内のカエルを破壊するコードを修正、新しいカエルのコメントを新しい Enemy に変更、一番下の frog.destroy を Enemy.destroy に変更

bfff420a7b5f42a2b60f8e45b14a68d2.png

 

12.効果音を設定する

*プレーヤー用のコンポーネント オーディオ ソースを追加 クリック オーバーライドは、右上隅にあるすべてを適用して、新しく追加されたすべてのコンポーネントを perfabs プリセットに追加します *AudioClip にドラッグ アンド ドロップして、bgm を追加し
ます)
*蛙のヘリの小さな矢印をクリックして蛙のコンポーネントに入り、AudioScouceを追加する 
*敵に爆発効果音の変数 protected AudioSource DeathAudio を作成するコードを記述し、死の中で DeathAudio.play() を有効にする getComponent を作成;
さまざまなサウンドを追加同様にキャラクターへのエフェクト文字コード public AudioSource ____ と .play を記述し、コンポーネント内の効果音をドラッグします。 

549a254c13ae4b71ab83b0571a9295c0.png

 

13.ダイアログを作る

*level1のCanvasに新規UI Panelを作成し、EnterDialogという名前を付けます
*色を変更し、位置を下部に固定するように変更し、幅を600、高さ125に変更し、Y軸を100に変更します *サブアイテムを作成し
ますそのためには、UI Text を右クリックし、
Create a Trigger collision body で家のドアに位置、内容、テキスト サイズを設定します (ドアに触れるとダイアログが表示されます)
* 家コードを追加するコードを記述します変数 gameObject を作成 Dialog 
* 関数 OnTriggerEnter2D と OnTriggerExit2D を追加するコードを書く if ステートメント 衝突ボディのタグがプレーヤーの場合、Dialog.SetActive (true/false); (スイッチを設定) (テキストの浅いインとアウトのアニメーションを作成
) )
* Heri で EnterDialog のアニメーションを作成し、EnterDialog という名前を付けます
* 赤い丸をクリックして最初の透明なフレームを記録し、20 番目のフレームが表示されて記録を停止し、実行します

 fdb17c7fb9bc4d4c9e4f3046aa30b3cd.png

 8dbb395b77a64093936abfe1a5776763.png

14.デッドバウンダリを作る

*level1 は新規プロジェクト DeadLine を作成してレイアウト下に配置し、長さを調整してそのラベルを追加し、DeadLine に変更します
*UnityEngine.SceneManagement を使用してコードを記述します;
*collision.tag == の場合、文字 TriggerEnter2D に if ステートメントを追加しますDeadLine ";
ScenManager.LoadScene(SceneManager.GetActiveScene().name);
* コードを改善し、切り替えシーンを切り取るために新しい関数 Restart() を作成します
* if; delay 1 に Invoke("Restart", 1) を追加します2 番目に再起動してシーンを切り替え
、GetComponent<AudioSource>().enabled = false; を追加し続けます; 音楽をオフにします

 

15.シーン遷移を行う

*SceneManagement を使用して EnterHouse のコードを作成
*scenManager.LoadScene(SceneManager.GetActiveScene().buildIndex +1) で e を押したときに update に if ステートメントのコードを記述 *現在のシーン番号 +1
*File Build Settings を開き、シーンを Observable にドラッグ数字 
※コードをドラッグしてエンターのダイアログに追加
同じようにシーン2に対してシーン1に戻るコードを書く

eb3f4f51c50449ed9f952e49cdfe6bf9.png

 

16.視差 視差

・Areaを新規作成し、背景ポリゴンコライダーをAreaにコピー・背景コライダー削除・カメラリセット ・新規コード作成
Parallax
・変数を追加するコードを書く float MoveRate(調整範囲) float StartPoint(初期位置決定)カメラを変換 (位置を調整)
* コードを記述して StartPoint = transform.posion.x を取得
* y 軸変数を追加  
* bool 変数 lockY を追加
* update if ロック Y の場合は追加し、前のコードを実行 それ以外の場合 y 軸 = 初期座標 y + カメラの動き * マグニチュード
* 上下したくない 動くオブジェクトの lockY を確認する

423ef54308874fb3af195f4ccedb4cbd.png

 

17. メニューを作成する

*新しいシーン メニューを作成します
*UI パネルを追加し、それを黒に変更します ソース画像 (元の画像)を null に変更します
*パネル コントロールの色を追加し、ソースを変更します コンポーネントを追加します ボタン テキスト メッシュ... ボタンを追加します
*ボタンのサイズのテキストの色を調整します
*書き込みますコード メニュー 関数 PlayGame() を直接作成 SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1); *
関数 QuitGame() を追加 Application.Quit();
* ボタンの親クラスにコードを追加ボタンの On コンポーネントをクリックして親クラスを選択し、この時点で PlayGame 関数を選択してゲームを実行し、ボタンをクリックして入力します

7c7bc3360f03499bad5c080577c3f9d5.png

 6b1969fb784245ab9c7ef0b37e26ebbd.png

 

18.オーディオトラックを作る

*Assets は MainMixer という名前の新しいオーディオ ミキサーを作成し、Window Audio で AudioMixer を見つけ、メニューを開きます
*bgm の出力を選択し、マスターを選択し、マスターのインスペクターで Attenuation のボリュームの右ボタンを編集可能なエクスポーズに変更し
、最小値を -80 に設定 最大値 0
* 新しい変数を作成するコードを記述 public AudioMixer メニュー内の AudioMixer コンポーネントをドラッグ
* 新しい関数を作成するコードを記述 public void SetVolume (float 値) AudioMixer.SetFloat("The name of the editable code just changed", float value );
* トラック バーのコードを追加 SetVolume 関数を使用して上記を選択
* すべてのサウンド エフェクトのマスターを追加して、音量をまとめて変更

6c8604a710324b659d00e405e528e16a.png

 

19. ゲームをパックする

[ビルド設定] で、左下隅にある [プレイヤー設定] を選択し、必要なパラメーターを設定して戻り、右下隅にある [ビルド] をクリックしてゲームをパッケージ化します。
7516bdf178e14706a41ca11cf06cd1ac.png

 

(4) よくある問題と解決策

1.Unity サービスにアクセスできません。ログインするか、このプロジェクトへのメンバーシップをリクエストしてください

解決策: ①「ウィンドウ」-「一般」-「サービス」をクリック (または直接ショートカットキー ctrl + 0) ②「新規リンク」をクリック-独自のプロジェクト ID を選択-「作成」をクリックします。

2.Unity の問題:変数 ... が割り当てられていません。

解決策: 剛体コンポーネントをオブジェクトに追加します。

3.ヒントUnassignedReferenceException: The variable target of Moving has not been assigned.おそらく、inspector.Moving.Update () (Assets/_Tutorial/Moving.cs:13) で、Moving スクリプトのターゲット変数を割り当てる必要があります。

解決策: オブジェクトをタガーに引き込んで設定します。


(5) ありがとう

1.私のUnity啓蒙の先生、Maikouさん、@M_STDIOに感謝します
2.ゲームで使用される材料はすべてUnityストアからのものです
3.交換して一緒に学ぶことを歓迎します。 qq.com。

 

 

おすすめ

転載: blog.csdn.net/weixin_61056520/article/details/126428530