当前位置: 首页 > article >正文

Unity3D 小案例 像素贪吃蛇 02 蛇的觅食

Unity3D 小案例 像素贪吃蛇 第二期 蛇的觅食

像素贪吃蛇

食物生成

在场景中创建一个 2D 正方形,调整颜色,添加 Tag 并修改为 Food。

创建食物

然后拖拽到 Assets 文件夹中变成预制体。

预制体

创建食物管理器 FoodManager.cs,添加单例,可以设置食物生成的坐标范围,提供生成一个食物的方法。

因为 Random.Range 的取值范围是 [min, max),为了取到 max 的值,需要给右边界加一。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FoodManager : MonoBehaviour
{
    public static FoodManager instance;

    public GameObject food;

    public int borderLeft = -8;
    public int borderRight = 8;
    public int borderTop = 4;
    public int borderBottom = -4;

    void Awake()
    {
        if (instance == null)
        {
            instance = this;
        }
        else
        {
            Destroy(gameObject);
        }
    }

    void Start()
    {
        // 初始生成一个食物
        GenerateFood();
    }

    /// <summary>
    /// 生成食物
    /// </summary>
    public void GenerateFood()
    {
        GameObject obj = Instantiate(food, transform);
        int x = Random.Range(borderLeft, borderRight + 1);
        int y = Random.Range(borderBottom, borderTop + 1);
        obj.transform.position = new Vector3(x, y, 0);
    }
}

在场景中创建节点,挂上脚本,拖拽引用。

食物管理器

运行游戏,可以看到场景中生成了一个食物。

生成一个食物

吃掉食物

给食物的预制体添加碰撞体,勾选 Is Trigger

添加碰撞体

同样,蛇头也要添加碰撞体,还要再添加一个刚体,Body Type 设置为 Kinematic,不需要受到重力影响。

添加刚体

Snake.cs 中添加碰撞函数,判断碰撞物体的标签是 Food,就销毁食物,生成新的蛇身,并生成下一个食物。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Snake : MonoBehaviour
{
    // ...

    void OnTriggerEnter2D(Collider2D other)
    {
        if (other.CompareTag("Food"))
        {
            Destroy(other.gameObject);
            GenerateBody();
            FoodManager.instance.GenerateFood();
        }
    }
}

此时运行游戏,蛇头可以吃掉食物了。

但是有时候蛇头还未到达食物的位置,食物就被吃掉了,甚至蛇头只是经过食物的附近,食物也消失了。这是因为碰撞体的范围问题,默认的 Size 是 (1, 1),可以稍微调小一些,例如 (0.5, 0.5)

调整碰撞体大小

调整后的效果:

吃掉食物


http://www.kler.cn/news/306423.html

相关文章:

  • Oracle EBS中AR模块的财务流程概览
  • 安全API
  • 综合案例-数据可视化-柱状图
  • python 读取excel数据存储到mysql
  • JVM 运行时数据区域
  • Amazon EC2:引领企业迈向云计算的未来
  • Lua 拷贝
  • 本地调试spark,访问kerberos鉴权的hdfs、hive
  • SOEX解锁Web3社交软件的无限可能
  • strncpy函数的使用和模拟实现
  • 远程Linux网络连接( Linux 网络操作系统 04)
  • Flutter启动无法运行热重载
  • 动态库相关知识解析
  • 教育培训小程序开发,简单实用的入门指南
  • GO 匿名函数
  • 【python版】示波器输出的csv文件(时间与电压数据)如何转换为频率与幅值【方法③】
  • 【解决方案】实验室管理系统(lims)整体解决方案设计书(word原件)
  • 探索Python轻量级数据库:TinyDB的奇妙之旅
  • QT Mode/View之View
  • CyclicBarrier的源码分析
  • 34. MyBatis如何处理SQL注入问题?有哪些防范措施?
  • 基于http请求的一种安全校验认证方案记录
  • 【C++】缺省(默认)参数
  • 1.2 交换技术
  • Spring Boot母婴商城:安全、便捷、高效
  • c++ 红黑树(带头结点)
  • PostgreSQL的repmgr命令参考(2)
  • k8s Service 服务
  • 数据结构——(java版)Map与Set
  • 《JavaEE进阶》----16.<Mybatis简介、操作步骤、相关配置>