[Unity3Dゲーム開発]ユニティ「2Dアイリス」のチュートリアル

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

I.はじめに

のは、電子スタイルの2Dゲームで団結しましょう。両プレイヤーはお互いに競争することができるようになります。目標は、ビットマルチスネークゲームのように、途中で他のプレイヤーをトラップあなたの光を移動することです。

当社のゲームは、コードの未満60行、および3つだけの資産で、非常にシンプルになります。

誰もがそれを理解できるように、いつものように、すべてのものは、単にできるだけ説明します。

次は最後の試合のプレビューです:ここに画像を挿入説明

第二に、プロジェクトの説明

バージョン:Unity5.0.0f4

第三に、テキスト

1、カメラの設定

ここに画像を挿入説明

図2に示すように、背景画像

無地の黒の背景には、かなり退屈なので、我々は、当社のグリッドの背景画像用することができます私たちの選択の一部を描画する描画ツールを使用してみましょう:
ここに画像を挿入説明
:私たちのプロジェクトスプライトフォルダにドラッグ画像
ここに画像を挿入説明
の設定を変更します:
ここに画像を挿入説明
注意:ユニット2あたりのピクセルを、これは単位のゲーム世界に収まる2×2ピクセルを意味します。プレーヤースプライトは、2×2画素の大きさを持つことになりますので、我々は、この値のすべてのテクスチャを使用します。その他の設定は、単に視覚効果。私たちは、画像が圧縮されず、非常に明確に見えるようにしたいです。

シーンにドラッグ:
ここに画像を挿入説明
注:再調整位置(0、0、0)。

レベル調整:
ここに画像を挿入説明
注意:通常、私たちは、レイヤの並べ替え新しい背景を作成しますが、そのような単純なゲームのために、十分なレイヤーの順序を使用します。

図2に示すように、照明

プレイヤーは、彼らが動くどこオーラを残して、それでは、最初のものを作成すべきです。

グリーンランタン:

我々は最初だけからなる青2x2pxの絵を描きます。
ここに画像を挿入説明
ここに画像を挿入説明

設定のインポート:
ここに画像を挿入説明

拖到场景中:
ここに画像を挿入説明
添加物理组件:
ここに画像を挿入説明
制作预制体:
ここに画像を挿入説明
粉红灯笼:
让我们重复上面的工作流程,以获得粉色灯塔图像:

ここに画像を挿入説明
ここに画像を挿入説明
所以我们最终得到了另一个预制件:
ここに画像を挿入説明

3、玩家

现在是加入玩家的时候了。玩家应该是一个简单的白色方块,可以通过按一些键移动。玩家也会拖着灯笼到任何他去的地方。

让我们为玩家画一个白色的2x2px图像:
ここに画像を挿入説明
ここに画像を挿入説明
导入设置:
ここに画像を挿入説明
拖入场景中:
ここに画像を挿入説明
修改层级:
ここに画像を挿入説明
注意:正如前面提到的,我们通常会使用排序层。然而,由于我们的游戏中只有三个元素:背景、玩家和灯光,所以我们将保持简单,只使用三个不同的元素层序价值。

Player添加物理组件:
ここに画像を挿入説明
注意:我们启用了IsTrigger以避免与玩家自己的“光环”发生碰撞。只要我们有IsTrigger启用后,玩家将只接收碰撞信息,而不会实际与任何东西发生冲突。这很快就有意义了。

添加刚体:
ここに画像を挿入説明
添加玩家移动脚本Move.cs:

using UnityEngine;
using System.Collections;

public class Move : MonoBehaviour {

    // Use this for initialization
    void Start () {

    }

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

    }
}

首先,我们想知道是否按下了移动键。现在我们只想为两个玩家创建一个移动脚本,所以让我们使移动键可自定义,这样我们就可以使用箭一个玩家的键和WSAD另一个玩家的钥匙:

using UnityEngine;
using System.Collections;

public class Move : MonoBehaviour {
    // Movement keys (customizable in Inspector)
    public KeyCode upKey;
    public KeyCode downKey;
    public KeyCode rightKey;
    public KeyCode leftKey;

    // Use this for initialization
    void Start () {

    }

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

    }
}

如果我们保存脚本并查看Inspector然后,我们可以将关键变量设置为Arrow Keys:
ここに画像を挿入説明
好的,让我们检查一下我们的按键更新职能:

// Update is called once per frame
void Update () {
    // Check for key presses
    if (Input.GetKeyDown(upKey)) {
        // Do stuff...
    }
    else if (Input.GetKeyDown(downKey)) {
        // Do stuff...
    }
    else if (Input.GetKeyDown(rightKey)) {
        // Do stuff...
    }
    else if (Input.GetKeyDown(leftKey)) {
        // Do stuff...
    }
}

现在,只要玩家按下其中的任何一个键,我们就想让玩家移动到那个方向。如前所述,我们将使用刚体的速度那个的财产。速度总是运动方向乘以运动速度…让我们首先添加一个运动速度变量:

using UnityEngine;
using System.Collections;

public class Move : MonoBehaviour {
    // Movement keys (customizable in Inspector)
    public KeyCode upKey;
    public KeyCode downKey;
    public KeyCode rightKey;
    public KeyCode leftKey;

    // Movement Speed
    public float speed = 16;

    ...
}

剩下的就很简单了。我们要做的就是修改我们的更新函数再一次设置刚体的velocity 属性:

// Update is called once per frame
void Update () {
    // Check for key presses
    if (Input.GetKeyDown(upKey)) {
        GetComponent<Rigidbody2D>().velocity = Vector2.up * speed;
    }
    else if (Input.GetKeyDown(downKey)) {
        GetComponent<Rigidbody2D>().velocity = -Vector2.up * speed;
    }
    else if (Input.GetKeyDown(rightKey)) {
        GetComponent<Rigidbody2D>().velocity = Vector2.right * speed;
    }
    else if (Input.GetKeyDown(leftKey)) {
        GetComponent<Rigidbody2D>().velocity = -Vector2.right * speed;
    }
}

注:-向量2.向上手段降下来和-向量2.右手段左边.

让我们也修改一下我们的启动函数非常快地给玩家一个初始速度:

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

然后我们点击Play,用箭头可以移动我们的Player:
ここに画像を挿入説明
Player灯饰
我们想要添加一个功能,以创建一个灯塔,无论球员去哪里。我们真正需要做的就是在玩家转变成一个新的方向后,尽快创建一个新的“光环”,然后在玩家进入另一个方向之前,始终在灯光中心进行缩放。

我们将需要一个辅助功能,产生一个新的照明大楼。首先,我们将向脚本中添加两个变量。其中一个是闪电城预制板,另一个是目前被玩家拖着的墙:

public class Move : MonoBehaviour {
    // Movement keys (customizable in Inspector)
    public KeyCode upKey;
    public KeyCode downKey;
    public KeyCode rightKey;
    public KeyCode leftKey;

    // Movement Speed
    public float speed = 16;

    // Wall Prefab
    public GameObject wallPrefab;

    // Current Wall
    Collider2D wall;

    ...

现在我们可以用实例化若要创建在玩家当前位置生成新的“光环”的函数,请执行以下操作:

void spawnWall() {
    // Spawn a new Lightwall
    GameObject g = (GameObject)Instantiate(wallPrefab, transform.position, Quaternion.identity);
    wall = g.GetComponent<Collider2D>();
}

注:变换位置是玩家目前的位置四元数身份是默认的旋转。我们还保存了游戏对象Collider2D在我们墙变量来跟踪当前墙。

让我们保存脚本,然后拖动淡青色预制件项目区在剧本里壁板插槽:
ここに画像を挿入説明
好了,是时候利用我们的助手函数了。现在我们将修改脚本的更新功能在改变方向后生成一个新的“光塔”:

// Update is called once per frame
void Update () {
    // Check for key presses
    if (Input.GetKeyDown(upKey)) {
        GetComponent<Rigidbody2D>().velocity = Vector2.up * speed;
        spawnWall();
    }
    else if (Input.GetKeyDown(downKey)) {
        GetComponent<Rigidbody2D>().velocity = -Vector2.up * speed;
        spawnWall();
    }
    else if (Input.GetKeyDown(rightKey)) {
        GetComponent<Rigidbody2D>().velocity = Vector2.right * speed;
        spawnWall();
    }
    else if (Input.GetKeyDown(leftKey)) {
        GetComponent<Rigidbody2D>().velocity = -Vector2.right * speed;
        spawnWall();
    }
}

当游戏开始时,我们还会孕育出一个新的“光塔”:

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

如果我们保存脚本并按下Player,然后我们可以看到,在每个方向改变之后,一个新的光塔是如何产生的:
ここに画像を挿入説明
到现在为止还好。

现在灯台只是个小方块,我们还得把它们放大。让我们创建一个新的适口函数,它接受对撞机和两点,然后将对撞机放在这两个点之间:

void fitColliderBetween(Collider2D co, Vector2 a, Vector2 b) {
    // Calculate the Center Position
    co.transform.position = a + (b - a) * 0.5f;

    // Scale it (horizontally or vertically)
    float dist = Vector2.Distance(a, b);
    if (a.x != b.x)
        co.transform.localScale = new Vector2(dist, 1);
    else
        co.transform.localScale = new Vector2(1, dist);
}

*注意:这个函数一开始看起来有点混乱。在两点之间安装对撞机的明显方法是对撞机.setMinMax()但团结组织不允许这样做。相反,我们将简单地使用变换位置属性将其精确定位在两个点之间,然后使用地区规模属性使其变得非常长,因此它正好适合于点之间的位置。公式A+(b-a)0.5也很容易理解。首先,我们从a到b用(b-a)…然后我们简单地把这个方向的一半加到这个点上。a,这就产生了中心点。之后,我们通过比较这两条线,找出这条线应该是水平的还是垂直的。x坐标。如果它们相等,则这条线是水平的,否则是垂直的。最后,我们调整比例,使墙是区单位长和1单位范围。

让我们利用我们的适口功能。我们总是想要适应对撞机之间的最后一个对撞机结束和球员的当前位置。所以首先,我们必须跟踪最后一架对撞机的尾声。

我们将添加一个lastWallEnd变量到我们的脚本中:

public class Move : MonoBehaviour {
    // Movement keys (customizable in Inspector)
    public KeyCode upKey;
    public KeyCode downKey;
    public KeyCode rightKey;
    public KeyCode leftKey;

    // Movement Speed
    public float speed = 16;

    // Wall Prefab
    public GameObject wallPrefab;

    // Current Wall
    Collider2D wall;

    // Last Wall's End
    Vector2 lastWallEnd;

    ...

并在我们的spawnWall函数:

void spawnWall() {
    // Save last wall's position
    lastWallEnd = transform.position;

    // Spawn a new Lightwall
    GameObject g = (GameObject)Instantiate(wallPrefab, transform.position, Quaternion.identity);
    wall = g.GetComponent<Collider2D>();
}

注意:从技术上讲,最后一道墙的位置应该是变位,但我们用了玩家的变换位置这里。原因是在第一堵墙产卵的时候,还没有最后一堵墙,所以我们不能设置最后沃伦德就位。相反,我们总是把它设置在球员的当前位置,然后再打下一道墙,结果几乎是一样的。

快好了。现在我们可以修改我们的更新再次作用,以始终适合当前墙之间的最后一面墙的结束位置和球员的当前位置:

// Update is called once per frame
void Update () {
    // Check for key presses
    if (Input.GetKeyDown(upKey)) {
        GetComponent<Rigidbody2D>().velocity = Vector2.up * speed;
        spawnWall();
    }
    else if (Input.GetKeyDown(downKey)) {
        GetComponent<Rigidbody2D>().velocity = -Vector2.up * speed;
        spawnWall();
    }
    else if (Input.GetKeyDown(rightKey)) {
        GetComponent<Rigidbody2D>().velocity = Vector2.right * speed;
        spawnWall();
    }
    else if (Input.GetKeyDown(leftKey)) {
        GetComponent<Rigidbody2D>().velocity = -Vector2.right * speed;
        spawnWall();
    }

    fitColliderBetween(wall, lastWallEnd, transform.position);
}

如果我们保存脚本并按下Player,然后我们就可以看到在播放器后面是如何创建的:
ここに画像を挿入説明
如果我们仔细看一看,我们就能看到墙角上的墙少了一点:
ここに画像を挿入説明
我们的问题有一个很容易解决的办法。我们要做的就是回到我们的适口功能和始终使墙壁一个单位长:

void fitColliderBetween(Collider2D co, Vector2 a, Vector2 b) {
    // Calculate the Center Position
    co.transform.position = a + (b - a) * 0.5f;

    // Scale it (horizontally or vertically)
    float dist = Vector2.Distance(a, b);
    if (a.x != b.x)
        co.transform.localScale = new Vector2(dist + 1, 1);
    else
        co.transform.localScale = new Vector2(1, dist + 1);
}

如果我们保存脚本并按下Play,踢然后我们可以看到一些完全匹配的角:
ここに画像を挿入説明

4、加入另一个玩家

プレーヤーをクリックして、右の重複は、オブジェクトをコピー]をクリックし、またはCtrl + C Ctrlキー+ Dを行います:
ここに画像を挿入説明
私たちは、コピーされたプレーヤーplayer_pinkの名前を変更し、変更(-3、0、0)を調整します:
ここに画像を挿入説明
我々はまた、移動することができます淡いピンクのプリフォームプリフォームの壁ソケットをWSADキーを変更し、ドラッグ:
ここに画像を挿入説明
私たちがプレイを押すと、それから、私たちは今、WSADキーで矢印キーで、二人の選手を制御することができます。

ここに画像を挿入説明

5、衝突検出

さて、私たちの条件を失うためにゲームを追加してみましょう。プレイヤーへの壁は、ゲームを失うことになります。

私たちは、私たちは、スクリプトを動かす新しいOnTriggerEnter2Dを追加する物理コンポーネント(コライダーと剛体)私たちが今行う必要があるとされて追加されました。プレイヤーが何かに衝突した場合には、統一が自動的にこの関数を呼び出します:

void OnTriggerEnter2D(Collider2D co) {
    // Do Stuff...
}

「Collider2DのCoパラメータは、プレイヤーがコライダーたちは、この壁のコライダーの背後にドラッグし、現在ではプレイヤーではないことを確認しましょう衝突し、次のとおりです。

void OnTriggerEnter2D(Collider2D co) {
    // Not the current wall?
    if (co != wall) {
        // Do Stuff...
    }
}

この場合、プレイヤーはゲームに敗北を意味し、任意の他の壁でなければなりません。私たちは、ここでしか、単純な破壊の選手をそれを維持します。

void OnTriggerEnter2D(Collider2D co) {
    // Not the current wall?
    if (co != wall) {
        print("Player lost:" + name);
        Destroy(gameObject);
    }
}

注意:この時点では、画面の勝者と敗者の一部を追加すること自由に感じなさい。

6、コンテンツ拡張

私達はちょうどユニティで電子光サイクルの2Dゲームのスタイルを作成しました。この強力なゲームエンジンのおかげで - いつものように、ほとんどの機能は実装が簡単です。ゲームは多くの可能性を提供し、様々な機能を追加することができますがあります。

  • 画面に勝つか負けます
  • 2人以上のプレイヤー
  • オンラインマルチプレイヤー
  • 人工知能
  • いくつかの特殊効果
  • より良いスプライトなどの
    ゲームを面白くするためにいつものように、今リーダーまで。

おすすめ

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