贪食蛇

素材下载

素材 0604.zip

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 预制物件拉进里面

完成!

SHXJ
Latest posts by SHXJ (see all)

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

发布留言