[Unity3Dゲーム開発]「アルカノイド」ゲーム開発チュートリアル

免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/q764424567/article/details/99434394

I.はじめに

オリジナルの「アルカノイド」が、そのアーケードスタイルの性質上、非常に中毒限り、まだあったこと、1986年にリリースされた、ユニティに発展するのは非常に簡単です。

誰もが理解できるように、いつものように、すべての作品は、単に可能な限り説明します。

ここでは、ゲームのプレビューは、次のとおりです。
ここに画像を挿入説明

2、バージョン

プロジェクトのバージョン:ユニティ2018.3.14f1
更新されたバージョンもあなたがして、古いバージョンを使用している場合、より良い結果を得るために、発生する可能性がありますAPIの一部が使用できないエラーをうまく利用することができ、ユニティ2018.3.14f1バージョンをご使用ください

第三に、チュートリアル

1、カメラの設定

まず、メインカメラのシーンメインカメラを見つけ、その後、背景色が暗く調整し、午後に示すようにサイズを変更します。
ここに画像を挿入説明

2、背景を設定

注意:画像を右クリックし、名前を付けて保存]を選択し、プロジェクトの資産フォルダを見つけ、新しいスプライトのフォルダに保存します。
ここに画像を挿入説明

プロジェクトエリアで私たちをみましょう:
ここに画像を挿入説明
この絵は、画面全体をカバー

3、階層的なセット

私たちは、2Dのゲームに取り組んでいる、いくつかのケースでは、いくつかの画像があるが、ボールと背景パターンが描かれているとき、例えば、互いの上に描かれています。

私たちは私たちの背景パターンは、ボールは常にトップ(したがって、目に見える)に描かれていることを確実にするために、バックグラウンドである必要があり、労働組合を教えてみましょう。

私たちは、ソート層の背景画像を変更、並べ替え、レイヤを使用することができます

私たちは、レイヤーを並べ替え追加することを選択してみましょう。.. リストからレイヤをソートし、背景レイヤーを追加し、以下に示すように、第一の位置に移動:
ここに画像を挿入説明

私たちは、スプライトレンダラコンポーネントの背景画像を見つけて、私たちの新しいソート背景レイヤーを割り当ててみましょう:
ここに画像を挿入説明

4、国境を追加

ここに画像を挿入説明ここに画像を挿入説明ここに画像を挿入説明
选择图片另存为,把资源导入到项目中 Sprite文件夹中

ここに画像を挿入説明
然后把这些边界摆放到场景中:
ここに画像を挿入説明
添加边界的碰撞:
选中边界:
ここに画像を挿入説明
添加碰撞器:
Add Component -> Physics 2D -> Box Collider 2D
ここに画像を挿入説明

5、添加球拍

球拍图像
ここに画像を挿入説明
注意:选择图片,另存图片,选择另存为,将其保存到项目中的Sprite文件夹中

将球拍图片放置到场景中,调整位置,X0,Y-95,Z0.
ここに画像を挿入説明
球拍的碰撞器:
选中球拍,添加碰撞器
Add Component -> Physics 2D -> Box Collider 2D
ここに画像を挿入説明
选中球拍,添加刚体
Add Component -> Physics 2D -> Rigidbody 2D
ここに画像を挿入説明
Gravity Scale:0(防止球拍出界)
Collision Detection:Contonuous 连续(防止因物理二维引擎bug而使球穿过球拍的小故障)
在Z轴上冻结旋转:这使球拍冻结了角度。

6、球拍移动

我们添加一个Racket.cs脚本:
ここに画像を挿入説明
双击脚本来打开它:

using UnityEngine;
using System.Collections;

public class Racket : MonoBehaviour {

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {

    }
}

我们的Start函数在开始游戏时由统一自动调用。我们的Update函数一次又一次地自动调用,大致与默认设置为60的游戏帧速率相关联。

还有另一种类型的Update函数,它被称为FixedUpdate,它也被一次又一次的调用,但是在一个固定的时间间隔内。单位物理是在完全相同的时间间隔内计算的,所以使用它总是一个好主意FixedUpdate在做物理相关的计算时,因为我们的球拍是一个物理物体(因为它有一个刚体)。

我们可以移除Start和Update函数并创建一个FixedUpdate函数:

using UnityEngine;
using System.Collections;

public class Racket : MonoBehaviour {

    void FixedUpdate () {

    }
}

我们可以使用刚体组件Rigidbody的velocity属性控制球拍移动
移动的原理:Speed * 运动方向
ここに画像を挿入説明
让我们先添加一个速度变量到我们的脚本中:

using UnityEngine;
using System.Collections;

public class Racket : MonoBehaviour {
    // Movement Speed
    public float speed = 150;

    void FixedUpdate () {

    }
}

玩家可以使用键盘上的A/D控制左右移动,检查玩家输入的函数可以使用Unity自带的GetAxisRaw函数来获取水平输入,它会返回来一个-1 到1之间的值,-1为左边,1为右边

void FixedUpdate () {
    // Get Horizontal Input
    float h = Input.GetAxisRaw("Horizontal");
}

现在我们可以设置运动方向乘以速度:

void FixedUpdate () {
    // Get Horizontal Input
    float h = Input.GetAxisRaw("Horizontal");

    // Set Velocity (movement direction * speed)
    GetComponent<Rigidbody2D>().velocity = Vector2.right * h * speed;
}

将Racket脚本,附加到球拍物体上面。
接下来我们按下Play,我们现在可以移动球拍了:
ここに画像を挿入説明

7、这个球

球的图片
ここに画像を挿入説明
注意:选择图片,另存为,加入到项目中Sprite文件中
摆放到场景中:
ここに画像を挿入説明

添加碰撞器:Add Component -> Physics 2D -> Box Collider 2D
ここに画像を挿入説明
球也应该从墙壁上弹起。如果它直接飞向墙壁,那么它就会反弹到相反的方向。如果它撞到墙上45°角度,然后它应该在一个-45°夹角(等等)…这背后的数学非常简单,可以用脚本来完成,但是我们将通过分配一个物理材料球对撞机。物理材料包含有关对撞机物理方面的信息,如摩擦和弹性。

让我们右键单击项目区,选择Create -> Physics Material 2D给它起个名字球料:ここに画像を挿入説明
之后我们可以看看Inspector并调整材料性能以使其反弹:
ここに画像を挿入説明
现在我们只需要把材料从项目区进入材料球的对撞机插槽:
ここに画像を挿入説明

添加刚体:Add Component -> Physics 2D -> Rigidbody 2D
ここに画像を挿入説明
Mass:0.0001(这将有助于防止球推开球拍)
Linear Drag:0(这将防止球使用重力)
Interpolate:Interpolate插值(使物理尽可能精确)
Collision Detection:Continuous连续(有助于防止因统一物理2D引擎bug而产生的碰撞错误)

8、添加球的脚本

Add Component -> New Script->Ball.cs

接着我们双击打开它:

using UnityEngine;
using System.Collections;

public class Ball : MonoBehaviour {

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {

    }
}

我们不需要更新函数,所以让我们删除它:

using UnityEngine;
using System.Collections;

public class Ball : MonoBehaviour {

    // Use this for initialization
    void Start () {

    }
}

让我们用刚体的速度属性使其移动。向上由某人速度:

using UnityEngine;
using System.Collections;

public class Ball : MonoBehaviour {
    // Movement Speed
    public float speed = 100.0f;

    // Use this for initialization
    void Start () {
        GetComponent<Rigidbody2D>().velocity = Vector2.up * speed;
    }
}

将Ball.cs赋给 球物体
我们可以按下播放键,看球从边框弹出:
ここに画像を挿入説明

9、球拍碰撞角

当球击中球拍时,我们希望球员能够对球的外角有一定的控制:

ここに画像を挿入説明

让我们打开球脚本,这样我们就可以实现出角功能了。当球与其他东西碰撞时,我们会用OnCollisionEnter2D函数,Unity自动调用的函数:

using UnityEngine;
using System.Collections;

public class Ball : MonoBehaviour {
    // Movement Speed
    public float speed = 100.0f;

    // Use this for initialization
    void Start () {
        GetComponent<Rigidbody2D>().velocity = Vector2.up * speed;
    }

    void OnCollisionEnter2D(Collision2D col) {
        // This function is called whenever the ball
        // collides with something
    }
}

球的速度取决于它击中球拍的位置。

y值永远是1,因为我们希望它飞向顶部,-1是飞向底部。x值是它击中球拍的位置,也就是它的速度。

1  -0.5  0  0.5   1  <- x值取决于它被击中的位置
===================  <- 这是那个球拍

我们真正需要做的就是找出球在哪里,相对于球拍。我们可以通过简单的分割球来做到这一点x球拍坐标宽度…这是我们的功能:

float hitFactor(Vector2 ballPos, Vector2 racketPos,
                float racketWidth) {
    // ascii art:
    //
    // 1  -0.5  0  0.5   1  <- x value
    // ===================  <- racket
    //
    return (ballPos.x - racketPos.x) / racketWidth;
}

注意:我々は、相対的な位置を得るためには、ボールラケットPO.xの捜索隊値の値を引きます。
これが私たちのOnCollisionEnter2D関数です。

void OnCollisionEnter2D(Collision2D col) {
    // Hit the Racket?
    if (col.gameObject.name == "racket") {
        // Calculate hit Factor
        float x=hitFactor(transform.position,
                          col.transform.position,
                          col.collider.bounds.size.x);

        // Calculate direction, set length to 1
        Vector2 dir = new Vector2(x, 1).normalized;

        // Set Velocity with dir * speed
        GetComponent<Rigidbody2D>().velocity = dir * speed;
    }
}

我々はプレーを押して、私たちは今バウンス上のボールの方向に依存することができた場合には、ラケットの位置に当たります。

10、加算ブロック

私たちは、私たちのブロックとして、次の画像を使用します。

青:ここに画像を挿入説明緑:ここに画像を挿入説明ピンク:ここに画像を挿入説明赤:ここに画像を挿入説明黄:ここに画像を挿入説明

私たちは、行くためにプロジェクトにこれらのリソースを置きます

コンポーネントの追加 - >物理学2D - >ボックス衝突2D:インパクターを追加します。

新しいスクリプトを追加Block.cs

その後、我々はそれを開きます。

using UnityEngine;
using System.Collections;

public class Block : MonoBehaviour {

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {

    }
}

我々は彼らを必要としないので、私たちは、ブートおよび更新プログラムを削除することができます。我々はすでにOnCollisionEnter2D機能に精通している、それでは、再びそれを使用してみましょう:

using UnityEngine;
using System.Collections;

public class Block : MonoBehaviour {

    void OnCollisionEnter2D(Collision2D collisionInfo) {
        // Destroy the whole Block
        Destroy(gameObject);
    }
}

注意:破壊(これは)のみスクリプトブロックアセンブリを弱体化されます。我々は全体の近所を破壊したい場合は、次に我々は、ゲーム自体にブロックを破壊する(ゲームオブジェクト)を、破壊するために使用する必要があります。

その後、我々は、このブロックは、シーンに入る広がり:

ここに画像を挿入説明

そして、再生ボタンを押してください!

おめでとう、あなたはあなた自身の2Dゲームアルカノイドを完了しました。

おすすめ

転載: blog.csdn.net/q764424567/article/details/99434394