我将在本教程中解释如何制作2D Snake游戏。
首先,打开Unity并打包一个2D项目。在这个项目中,我们将使用3种不同的形象,如蛇,食物和边界。所以,在开始之前创建这些图像。
导入这些图像,并从名称顶部,底部,右侧,左侧的边框图像创建周围的边框。把你的蛇图像放在现场。不要忘记添加Rigidbody 2D和Box Collider 2D(已检查IsTrigger)。蛇的尺度应该比蛇小一点,因为我们不想把蛇打到尾部。
创建一个名为Snake的C#脚本,并将其附加到您的蛇。让它编辑它 创建公共游戏对象:
1
2
3
4
5
6
7
|
public
class
Snake
:
MonoBehaviour
{
public
GameObject
food
;
public
Transform
rBorder
;
public
Transform
lBorder
;
public
Transform
tBorder
;
public
Transform
bBorder
;
|
现在,我们将用键盘箭头来移动和控制我们的蛇。我们需要一个移动功能,一些变量来编辑动作,需要在InvokeRepeating开始时调用移动功能。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
private
float
speed
=
0.1f
;
Vector2
vector
=
Vector2
.
up
;
Vector2
moveVector
;
void
Start
(
)
{
InvokeRepeating
(
"Movement"
,
0.3f
,
speed
)
;
}
void
Update
(
)
{
if
(
Input
.
GetKey
(
KeyCode
.
RightArrow
)
)
{
vector
=
Vector2
.
right
;
}
else
if
(
Input
.
GetKey
(
KeyCode
.
UpArrow
)
)
{
vector
=
Vector2
.
up
;
}
else
if
(
Input
.
GetKey
(
KeyCode
.
DownArrow
)
)
{
vector
=
-
Vector2
.
up
;
}
else
if
(
Input
.
GetKey
(
KeyCode
.
LeftArrow
)
)
{
vector
=
-
Vector2
.
right
;
}
moveVector
=
vector
/
3f
;
}
void
Movement
(
)
{
transform
.
Translate
(
moveVector
)
;
}
|
按播放按钮和测试代码。您可以更改速度和moveVector变量来优化移动速度。
接下来,我们将创造食物。创建一个食物预制,并添加Box Collider 2D(Istrigger被检查)。食物应在边界内产生。我们将在Start()中调用spawn函数。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public
GameObject
food
;
void
Start
(
)
{
SpawnFood
(
)
;
}
public
void
SpawnFood
(
)
{
int
x
=
(
int
)
Random
.
Range
(
lBorder
.
position
.
x
,
rBorder
.
position
.
x
)
;
int
y
=
(
int
)
Random
.
Range
(
bBorder
.
position
.
y
,
tBorder
.
position
.
y
)
;
Instantiate
(
food
,
new
Vector2
(
x
,
y
)
,
Quaternion
.
identity
)
;
}
|
再次测试。一开始就创造出一种食物,蛇就会移动。现在,添加碰撞功能来收集食物并创建另一个。另外,在收集食物时,会添加尾部。添加“使用System.Collections.Generic”和“使用System.Linq”集合来使用列表。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
List
tail
=
new
List
(
)
;
bool
eat
=
false
;
void
Movement
(
)
{
Vector2
ta
=
transform
.
position
;
if
(
eat
)
{
if
(
speed
&
gt
;
0.002
)
{
speed
=
speed
-
0.002f
;
}
GameObject
g
=
(
GameObject
)
Instantiate
(
tailPrefab
,
ta
,
Quaternion
.
identity
)
;
tail
.
Insert
(
0
,
g
.
transform
)
;
Debug
.
Log
(
speed
)
;
eat
=
false
;
}
else
if
(
tail
.
Count
&
gt
;
0
)
{
tail
.
Last
(
)
.
position
=
ta
;
tail
.
Insert
(
0
,
tail
.
Last
(
)
)
;
tail
.
RemoveAt
(
tail
.
Count
-
1
)
;
}
transform
.
Translate
(
moveVector
)
;
}
void
OnTriggerEnter2D
(
Collider2D
c
)
{
if
(
c
.
name
.
StartsWith
(
"food"
)
)
{
eat
=
true
;
Destroy
(
c
.
gameObject
)
;
SpawnFood
(
)
;
}
}
|
200新X-45旗新新新新新新旗新新旗新新旗新新旗新新旗新新旗旗新新旗新新200新200新新200新200新200新新200新新200新新200新新200新新200新新200新新200新新200新新200新新200新新新200新新200新新200新新新200新新200新新 添加2个布尔值并修改键盘控件,如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
bool
vertical
=
false
;
bool
horizontal
=
true
;
void
Update
(
)
{
if
(
Input
.
GetKey
(
KeyCode
.
RightArrow
)
&
amp
;
&
amp
;
horizontal
)
{
horizontal
=
false
;
vertical
=
true
;
vector
=
Vector2
.
right
;
}
else
if
(
Input
.
GetKey
(
KeyCode
.
UpArrow
)
&
amp
;
&
amp
;
vertical
)
{
horizontal
=
true
;
vertical
=
false
;
vector
=
Vector2
.
up
;
}
else
if
(
Input
.
GetKey
(
KeyCode
.
DownArrow
)
&
amp
;
&
amp
;
vertical
)
{
horizontal
=
true
;
vertical
=
false
;
vector
=
-
Vector2
.
up
;
}
else
if
(
Input
.
GetKey
(
KeyCode
.
LeftArrow
)
&
amp
;
&
amp
;
horizontal
)
{
horizontal
=
false
;
vertical
=
true
;
vector
=
-
Vector2
.
right
;
}
moveVector
=
vector
/
3f
;
}
|
让我们明白所有的代码。我们创造了蛇,食物和边界。Snake与InvokeRepeating()一起移动包括Movement()。我们用边界之间的SpawnFood()函数创建食物。Snake通过OnTriggerEnter()的检测名称来收集食物。在if语句之后,您可以在OnTriggerEnter()中添加“else”,使得“如果碰撞者的名字是食物,而不是收集它”。否则,结束游戏“,这意味着如果你打边界或蛇本身,结束比赛。还可以在OnTriggerEnter()中管理分数。