素材下载
STARTO!
建立一个 2D 专案
首先设定 MainCamera 属性,背景为黑色;调整大小为 40
建立一个 Sprites 资料夹
将开头下载的四张素材拉进 Sprites 资料夹
选取四张图片
将每单位像素数改为 1
选取套用
将 board_horizontal 与 border_vertical 各拉两张进去阶层资料夹
修改 border vertical 物件的属性 X = -35
修改 border vertical (1) 物件的属性 X = 35
修改 board_horizontal 物件的属性 Y = 24.5
修改 board_horizontal (1) 物件的属性 Y = -24.5
修改 border vertical 物件的名称为 “BorderLeft”
修改 border vertical (1) 物件的名称为 “BorderRight”
修改 board_horizontal 物件的名称为 “BorderTop”
修改 board_horizontal (1) 物件的名称为 “BorderBottom”
将四个 BorderXX 物件选起来
增加元件 > 2D 物理 > 2D 盒状碰撞器
将 “是触发器” 打勾
将 food.png 拉到阶层视窗
选择 food 物件,增加元件 > 2D 物理 > 2D 盒状碰撞器,并且将 “是处发器” 打勾
将 food 物件重新命名为 FoodPrefab
在专案管理器建立一个 Prefab 资料夹
将 FoodPrefab 物件拉到 Prefab 资料夹制做成预制物件
删除阶层视窗中的 FoodPrefab 物件
新增一个 Scripts 资料夹
新增一个 C# 脚本,名为 SpawnFood.cs
编辑并输入以下程式码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SpawnFood : MonoBehaviour
{
// Start is called before the first frame update
public GameObject foodPrefab;
public Transform borderTop;
public Transform borderBottom;
public Transform borderLeft;
public Transform borderRight;
void Start()
{
InvokeRepeating("Spawn", 3, 4);
}
void Spawn()
{
int x = (int)Random.Range(borderLeft.position.x, borderRight.position.x);
int y = (int)Random.Range(borderBottom.position.y, borderTop.position.y);
Instantiate(foodPrefab, new Vector2(x, y), Quaternion.identity);
}
// Update is called once per frame
void Update()
{
}
}
储存脚本并退出,并将这个脚本放在 MainCamera 里面
将对应的元件一个一个拉进来
将 snake.png 拉到阶层视窗
重新命名 snake 物件名称为 “Head”
将 Head 物件增加元件 > 2D 物理 > 2D 盒状碰撞器,并将大小改为 X = 0.7 Y = 0.7
继续帮 Head 物件增加元件 > 2D 物理 > Rigidbody 2D,将身体类型改为 Kinematic
将 Head 物件拉进 Prefab 资料夹里面制作成预制物件
将 Prefab 里面的 Head 预制物件变更名称为 “TailPrefab”
建立一个 C# 脚本,命名为 Snake
编辑并输入以下程式码
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class Snake : MonoBehaviour
{
// Start is called before the first frame update
bool ate = false;
bool isDied = false;
public GameObject tailPrefab;
Vector2 dir = Vector2.right;
List<Transform> tail = new List<Transform>();
void Start()
{
InvokeRepeating("Move", 0.3f, 0.3f);
}
// Update is called once per frame
void Update()
{
if (!isDied)
{
if (Input.GetKey(KeyCode.RightArrow))
dir = Vector2.right;
else if (Input.GetKey(KeyCode.DownArrow))
dir = -Vector2.up;
else if (Input.GetKey(KeyCode.LeftArrow))
dir = -Vector2.right;
else if (Input.GetKey(KeyCode.UpArrow))
dir = Vector2.up;
}
else
{
if (Input.GetKey(KeyCode.R))
{
for (int i = 0; i < tail.Count; i++)
tail[i].gameObject.SetActive(false);
tail.Clear();
transform.position = new Vector3(0, 0, 0);
isDied = false;
}
}
}
void Move()
{
if (!isDied)
{
Vector2 v = transform.position;
transform.Translate(dir);
if (ate)
{
GameObject g = (GameObject)Instantiate(tailPrefab, v, Quaternion.identity);
tail.Insert(0, g.transform);
ate = false;
}
else if (tail.Count > 0)
{
tail.Last().position = v;
tail.Insert(0, tail.Last());
tail.RemoveAt(tail.Count - 1);
}
}
}
void OnTriggerEnter2D(Collider2D coll)
{
if (coll.name.StartsWith("Food"))
{
ate = true;
Destroy(coll.gameObject);
}
else
{
isDied = true;
}
}
}
将 Snake 脚本加进 Head 物件里面
将 TailPrefab 预制物件拉进里面
完成!
- 受保护的内容: NAS 版 Mathbot 管理网站与 Linebot 启动方法 - 2024 年 11 月 15 日
- Realtime 啥鬼的 - 2021 年 6 月 15 日
- nodejs 数学游戏 - 2021 年 6 月 8 日




































在〈贪食蛇〉中有 1 则留言