【Unity】2D游戏-愤怒的小鸟教学实战(附源码和实现步骤 超详细)

简介: 【Unity】2D游戏-愤怒的小鸟教学实战(附源码和实现步骤 超详细)

需要源码和资源文件请点赞关注收藏后评论区留言私信~~~

下面我们将在Unity3D中实现愤怒的小鸟的简单版,游戏中最复杂的部分是物理系统,但是借助于Unity3D编辑器,我们就不用担心太多了

一、效果展示

先展示程序运行效果如下

运行程序可以将小鸟弹射出去 并且可以显示运动轨迹 读者可以自行优化

二、程序目录结构

Hierarchy视图结构如下

Assets文件夹目录结构如下图所示

Scripts里面存放的C#脚本文件 结构如下图

Prefabs文件夹中存放的预制体 结构如下图

三、实现步骤

因为愤怒的小鸟是一个2D游戏,所以需要在新建项目时选择2D模板 然后将资源包导入项目中,里面包含图片等资源 如下图所示

摄像机设置

在Project视图中找到Scenes文件夹 然后找到level01.unity文件夹 双击打开 设置里面的背景颜色

地面设置

在Project视图中 找到Sprites文件夹内的ground.png文件 在Inspector视图中 导入设置 将Pixels Per Unit设置为16 然后单击apply按钮

tips:之后所以的图标都设置为16 这意味着16*16的像素时游戏世界中的一个单位,之所以选择16,是因为鸟的大小是16*16

现在地面只是图像 不是物理世界的一部分,事物不会与其相撞,也不会站在它的上面,所以我们需要添加一个碰撞器,让其具有物理特性 这样物体就可以站在地面上。在Inspector视图中 选择Add Component->Physics 2D->Box Collider 2D组件添加即可

边界设置

创建空对象 命名为borders  同样为他添加碰撞器 操作步骤如下面所述 并且勾选Is Trigger属性 并且为右边和上面添加边界 也要添加两个碰撞器

现在需要销毁任何进入边界的对象的功能 单击borders对象 在Inspector视图中 选择Add Component New Script命令,将脚本命名为Borders

云彩设置

把cloud.png拖入Scenes视图中 重复上一步 把云彩摆到你喜欢的位置即可

击打物设置

下面我们添加一些小鸟的击打物 比如木头 石头 冰之类的 拖到Scenes视图中 都要将Pixels Per Unit设置为16 同样要添加刚体属性 选择Add Component->Physics 2D-> Rigidbody 2D命令即可

弹弓设置

将slingshot.png文件拖入Scenes视图中 将Pivot设置为Top

设置鸟

设置鸟的物理特性 包括运动轨迹 碰撞等等 此处省略不表

敌人设置

我们将绿猪设置为敌人 可以进行击打  同样还要设置敌人的游戏逻辑

弹弓橡胶设置

我们还要为弹弓添加橡胶  这样更加美观真实

四、代码

部分代码如下 需要全部源码和资源文件请点赞关注收藏后评论区留言私信

1

using UnityEngine;
public class Spawn : MonoBehaviour
{
    // 鸟的预制体
    public GameObject birdPrefab;
    // 鸟是否在触发区域
    bool occupied = false;
    void FixedUpdate()
    {
        // 鸟不在触发区域
        if (!occupied && !sceneMoving())
            spawnNext();
    }
    void spawnNext()
    {
        // 生成一只鸟
        Instantiate(birdPrefab, transform.position, Quaternion.identity);
        occupied = true;
    }
    void OnTriggerExit2D(Collider2D co)
    {
        // 鸟离开触发区域
        occupied = false;
    }
    bool sceneMoving()
    {
        // 找到所有的鸟的刚体,看看是否还有仍然移动的
        Rigidbody2D[] bodies = FindObjectsOfType(typeof(Rigidbody2D)) as Rigidbody2D[];
        foreach (Rigidbody2D rb in bodies)
            if (rb.velocity.sqrMagnitude > 5)
                return true;
        return false;
    }
}

2

using UnityEngine;
public class Rubber : MonoBehaviour
{
    //橡胶预制体
    public Transform leftRubber;
    public Transform rightRubber;
    //调整橡胶旋转和长度
    void adjustRubber(Transform bird, Transform rubber)
    {
        // 橡胶的旋转变化
        Vector2 dir = rubber.position - bird.position;
        float angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
        rubber.rotation = Quaternion.AngleAxis(angle, Vector3.forward);
        // 橡胶的长度变化
        float dist = Vector3.Distance(bird.position, rubber.position);
        dist += bird.GetComponent<Collider2D>().bounds.extents.x;
        rubber.localScale = new Vector2(dist, 1);
    }
    //OnTriggerStay2D函数将通知我们鸟是否还在弹弓上
    void OnTriggerStay2D(Collider2D coll)
    {
        // 弹弓的橡胶拉伸
        adjustRubber(coll.transform, leftRubber);
        adjustRubber(coll.transform, rightRubber);
    }
    //鸟离开时触发事件
    void OnTriggerExit2D(Collider2D coll)
    {
        // 弹弓的橡胶设置为默认值
        leftRubber.localScale = new Vector2(0, 1);
        rightRubber.localScale = new Vector2(0, 1);
    }
}

3

 

using UnityEngine;
public class PullAndRelease : MonoBehaviour
{
    // 鸟的默认位置
    Vector2 startPos;
    // 添加的力
    public float force = 1300;
    void Start()
    {
        startPos = transform.position;
    }
    //监听鼠标抬起事件
    void OnMouseUp()
    {
        // 禁用isKinematic,这样刚体就会再次受到重力和速度的影响
        GetComponent<Rigidbody2D>().isKinematic = false;
        // 添加力
        Vector2 dir = startPos - (Vector2)transform.position;
        GetComponent<Rigidbody2D>().AddForce(dir * force);
        // 销毁当前组件脚本
        Destroy(this);
    }
    //监听鼠标拖拽事件
    void OnMouseDrag()
    {
        //将鼠标位置转换为世界位置
        Vector2 p = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        //设置最大半径
        float radius = 1.8f;
        Vector2 dir = p - startPos;
        if (dir.sqrMagnitude > radius)
            dir = dir.normalized * radius;
        //设置位置
        transform.position = startPos + dir;
    }
}

4

using UnityEngine;
public class Trail : MonoBehaviour
{
    //轨迹的预制体
    public GameObject[] trails;
    //使用一个计时器变量用来记录当前生成的数组下标
    int next = 0;
    void Start()
    {
        //每100毫秒生成一条新路径对象
        InvokeRepeating("spawnTrail", 0.1f, 0.1f);
    }
    void spawnTrail()
    {
        //只要鸟的移动速度够快,才去刷出轨迹
        if (GetComponent<Rigidbody2D>().velocity.sqrMagnitude > 25)
        {
            //实例化trails数组中next下标的对象
            Instantiate(trails[next], transform.position, Quaternion.identity);
            //next+1增加next
            next = next + 1;
            //next等于预制体数组最大值就从0开始
            if (next == trails.Length) next = 0;
        }
    }
}

创作不易 觉得有帮助请点赞关注收藏~~~

相关文章
|
3月前
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
172 6
|
2月前
|
测试技术 C# 图形学
掌握Unity调试与测试的终极指南:从内置调试工具到自动化测试框架,全方位保障游戏品质不踩坑,打造流畅游戏体验的必备技能大揭秘!
【9月更文挑战第1天】在开发游戏时,Unity 引擎让创意变为现实。但软件开发中难免遇到 Bug,若不解决,将严重影响用户体验。调试与测试成为确保游戏质量的最后一道防线。本文介绍如何利用 Unity 的调试工具高效排查问题,并通过 Profiler 分析性能瓶颈。此外,Unity Test Framework 支持自动化测试,提高开发效率。结合单元测试与集成测试,确保游戏逻辑正确无误。对于在线游戏,还需进行压力测试以验证服务器稳定性。总之,调试与测试贯穿游戏开发全流程,确保最终作品既好玩又稳定。
98 4
|
2月前
|
前端开发 图形学 开发者
【独家揭秘】那些让你的游戏瞬间鲜活起来的Unity UI动画技巧:从零开始打造动态按钮,提升玩家交互体验的绝招大公开!
【9月更文挑战第1天】在游戏开发领域,Unity 是最受欢迎的游戏引擎之一,其强大的跨平台发布能力和丰富的功能集让开发者能够迅速打造出高质量的游戏。优秀的 UI 设计对于游戏至关重要,尤其是在手游市场,出色的 UI 能给玩家留下深刻的第一印象。Unity 的 UGUI 系统提供了一整套解决方案,包括 Canvas、Image 和 Button 等组件,支持添加各种动画效果。
132 3
|
2月前
|
设计模式 存储 人工智能
深度解析Unity游戏开发:从零构建可扩展与可维护的游戏架构,让你的游戏项目在模块化设计、脚本对象运用及状态模式处理中焕发新生,实现高效迭代与团队协作的完美平衡之路
【9月更文挑战第1天】游戏开发中的架构设计是项目成功的关键。良好的架构能提升开发效率并确保项目的长期可维护性和可扩展性。在使用Unity引擎时,合理的架构尤为重要。本文探讨了如何在Unity中实现可扩展且易维护的游戏架构,包括模块化设计、使用脚本对象管理数据、应用设计模式(如状态模式)及采用MVC/MVVM架构模式。通过这些方法,可以显著提高开发效率和游戏质量。例如,模块化设计将游戏拆分为独立模块。
180 3
|
2月前
|
图形学 C++ C#
Unity插件开发全攻略:从零起步教你用C++扩展游戏功能,解锁Unity新玩法的详细步骤与实战技巧大公开
【8月更文挑战第31天】Unity 是一款功能强大的游戏开发引擎,支持多平台发布并拥有丰富的插件生态系统。本文介绍 Unity 插件开发基础,帮助读者从零开始编写自定义插件以扩展其功能。插件通常用 C++ 编写,通过 Mono C# 运行时调用,需在不同平台上编译。文中详细讲解了开发环境搭建、简单插件编写及在 Unity 中调用的方法,包括创建 C# 封装脚本和处理跨平台问题,助力开发者提升游戏开发效率。
200 0
|
2月前
|
vr&ar 图形学 API
Unity与VR控制器交互全解:从基础配置到力反馈应用,多角度提升虚拟现实游戏的真实感与沉浸体验大揭秘
【8月更文挑战第31天】虚拟现实(VR)技术迅猛发展,Unity作为主流游戏开发引擎,支持多种VR硬件并提供丰富的API,尤其在VR控制器交互设计上具备高度灵活性。本文详细介绍了如何在Unity中配置VR支持、设置控制器、实现按钮交互及力反馈,结合碰撞检测和物理引擎提升真实感,助力开发者创造沉浸式体验。
147 0
|
2月前
|
图形学 开发者
【独家揭秘】Unity游戏开发秘籍:从基础到进阶,掌握材质与纹理的艺术,打造超现实游戏视效的全过程剖析——案例教你如何让每一面墙都会“说话”
【8月更文挑战第31天】Unity 是全球领先的跨平台游戏开发引擎,以其高效性能和丰富的工具集著称,尤其在提升游戏视觉效果方面表现突出。本文通过具体案例分析,介绍如何利用 Unity 中的材质与纹理技术打造逼真且具艺术感的游戏世界。材质定义物体表面属性,如颜色、光滑度等;纹理则用于模拟真实细节。结合使用两者可显著增强场景真实感。以 FPS 游戏为例,通过调整材质参数和编写脚本动态改变属性,可实现自然视觉效果。此外,Unity 还提供了多种高级技术和优化方法供开发者探索。
52 0
|
3月前
|
图形学 缓存 算法
掌握这五大绝招,让您的Unity游戏瞬间加载完毕,从此告别漫长等待,大幅提升玩家首次体验的满意度与留存率!
【8月更文挑战第31天】游戏的加载时间是影响玩家初次体验的关键因素,特别是在移动设备上。本文介绍了几种常见的Unity游戏加载优化方法,包括资源的预加载与异步加载、使用AssetBundles管理动态资源、纹理和模型优化、合理利用缓存系统以及脚本优化。通过具体示例代码展示了如何实现异步加载场景,并提出了针对不同资源的优化策略。综合运用这些技术可以显著缩短加载时间,提升玩家满意度。
136 5
|
3月前
|
图形学 开发者 存储
超越基础教程:深度拆解Unity地形编辑器的每一个隐藏角落,让你的游戏世界既浩瀚无垠又细节满满——从新手到高手的全面技巧升级秘籍
【8月更文挑战第31天】Unity地形编辑器是游戏开发中的重要工具,可快速创建复杂多变的游戏环境。本文通过比较不同地形编辑技术,详细介绍如何利用其功能构建广阔且精细的游戏世界,并提供具体示例代码,展示从基础地形绘制到植被与纹理添加的全过程。通过学习这些技巧,开发者能显著提升游戏画面质量和玩家体验。
147 3
|
3月前
|
图形学 机器学习/深度学习 人工智能
颠覆传统游戏开发,解锁未来娱乐新纪元:深度解析如何运用Unity引擎结合机器学习技术,打造具备自我进化能力的智能游戏角色,彻底改变你的游戏体验——从基础设置到高级应用全面指南
【8月更文挑战第31天】本文探讨了如何在Unity中利用机器学习增强游戏智能。作为领先的游戏开发引擎,Unity通过ML-Agents Toolkit等工具支持AI代理的强化学习训练,使游戏角色能自主学习完成任务。文章提供了一个迷宫游戏示例及其C#脚本,展示了环境观察、动作响应及奖励机制的设计,并介绍了如何设置训练流程。此外,还提到了Unity与其他机器学习框架(如TensorFlow和PyTorch)的集成,以实现更复杂的游戏玩法。通过这些技术,游戏的智能化程度得以显著提升,为玩家带来更丰富的体验。
64 1