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ゲームアルカノイドを完了しました。