このチュートリアルは、統一された基本的なポンクローンを強化し、古典的なポンの美学、改善されたゲームプレイメカニクス、レトロスタイルのUIを追加します。 Pongゲームをアップグレードしましょう! パート2:レトロの改良&拡張ゲームプレイ このチュートリアルは、前のポンクローンに基づいています。 プロジェクトをGitHubまたは完全なパート1からダウンロードしてから、先に進みます。 作業中のデモと最終的な改善されたゲームも利用可能です。 重要な改善: クラシックスタイリング:黒と白のスプライトをインポートし、本物のレトロなビジュアルのためにユニットあたりのピクセル(64)を調整します。メインカメラの背景を黒に変更し、それに応じてパドルとボールスプライトを更新します。複数のスケーリングされた白いスプライトを使用して中央の仕切りを作成します 衝突の拡張:ボール衝突処理を改良して、パドルの衝撃角度を計算し、バウンスをより現実的にします。 これには、メソッドを更新して、関数を使用します。プレーヤーと敵のパドルに適切にタグを付けることを忘れないでください <code>BallController<code>OnCollisionEnter2D敵のAIの改善:<code>launchAngle時間ベースの計算を使用して、応答性と課題を高めて敵のパドルの動きを滑らかにします。 スクリプトを変更して、を使用して、速度とタイミングを調整して最適な滑らかさを実現します。 境界線を追加して、AIパドルが画面から外れないようにします。 スクリプトは、ボールが破壊された後、敵のパドルの位置をリセットする必要があります。 EnemyControllerレトロの一時停止メニュー:InvokeRepeating("Move", .02F, .02F)カスタムピクセルフォント(SilkScreenなど)を使用して一時停止メニューを作成します。適切な機能を備えた「リセット」および「メインメニュー」ボタンを含めます。 BoundsControllerスクリプトは、メニュー要素を一時停止/隠すこととともに、一時停止と再開を管理します。 「showonpause」で一時停止メニュー要素にタグを付けるようにしてください。 ダイナミックメインメニュー:バックグラウンドにシミュレートされたAIゲームプレイを備えたメインメニューを設計します。 メインゲームシーンを複製し、不要な要素を削除し、タイトルと「再生」ボタンを追加します。メインメニューのAIパドルを制御するには、UIManagerおよびスクリプト(敵AIに似ていますが、スピードとタイミングの調整を備えています)を使用してください。 スコアリングシステム:プレーヤーとAIスコアを追跡し、UIに表示するスコアリングシステムを実装し、UI(AutoPlayerスクリプトを使用して)に表示し、スコアの制限(例:7ポイント)の場合はゲームを終了します。 )画面上にゲームが表示され、到達します。 AutoEnemyスクリプトには勝者が表示されます。 「showonfinish」を使用して、要素上のゲームにゲームにタグを付けることを忘れないでください。 PointCounter GameOver コードスニペット: (BallController.cs -OncollisionEnter2d&launchangle) void OnCollisionEnter2D(Collision2D col) { if (col.gameObject.tag == "Enemy") { float y = launchAngle(transform.position, col.transform.position, col.collider.bounds.size.y); Vector2 d = new Vector2(1, y).normalized; rig2D.velocity = d * speed * 1.5F; } if (col.gameObject.tag == "Player") { float y = launchAngle(transform.position, col.transform.position, col.collider.bounds.size.y); Vector2 d = new Vector2(-1, y).normalized; rig2D.velocity = d * speed * 1.5F; } } float launchAngle(Vector2 ball, Vector2 paddle, float paddleHeight) { return (ball.y - paddle.y) / paddleHeight; }ログイン後にコピー (enemycontroller.cs -move) void Move() { if (ball == null) { ball = GameObject.FindGameObjectWithTag("Ball").transform; } ballRig2D = ball.GetComponent(); if (ballRig2D.velocity.x > 0) { if (ball.position.y > this.transform.position.y + .5F) { transform.Translate(Vector3.up * speed * Time.deltaTime); } else if (ball.position.y < this.transform.position.y - .5F) { transform.Translate(Vector3.down * speed * Time.deltaTime); } } // ... bounds checking ... }ログイン後にコピー (uimanager.cs -partial) // ... other methods ... public void showFinished() { foreach (GameObject g in finishObjects) { g.SetActive(true); } } // ... other methods ...ログイン後にコピー (pointcounter.cs) void Update () { text.text = rightBound.GetComponent().enemyScore + "\t\t" + leftBound.GetComponent().playerScore; }ログイン後にコピー (gameover.cs) void Update () { if(uiManager.playerWon){ text.text = "GAME OVER!\nPLAYER WON!"; } else if(uiManager.enemyWon){ text.text = "GAME OVER!\nENEMY WON!"; } }ログイン後にコピー AIスクリプトの速度やタイミングなどの値を調整して、ゲームプレイの難易度を微調整することを忘れないでください。 この強化されたポンクローンは、より完全で魅力的なレトロなゲーム体験を提供します。 githubリンク(入力に提供されていない)には、プロジェクトファイル全体が含まれます。