unity学习64,第3个小游戏:一个2D跑酷游戏

news2025/3/12 2:06:26

目录

学习参考

素材资源导入

1 创建项目

1.1 创建1个2D项目

1.2 导入素材

2 背景图bg

2.0 bg素材

2.1 创建背景

2.2 修改素材,且修改摄像机等

2.2.1 修改导入的原始prefab素材

2.2.2  对应调整摄像机

2.2.3 弄好背景

2.3 背景相关脚本实现

2.3.1 错误例子解析

2.3.2 bg缓慢移动的代码

2.3.3 到边界后bg重复迭代移动的代码

3 地面ground

3.0 地面的素材

3.1 创建好地面

3.1.1 地图层级

3.1.2 给地面增加碰撞

3.1.3 拼好2个地面

3.2 地面ground移动的代码

4 地面修改

4.1 地图尺寸缩小

4.1.1 屏幕宽大约2.8

4.2 设计3个不同地面

4.3 地面也做成prefab,记得选原生的,脱离其他地面的影响

4.4 定义地面的数组,把3个prefab拖进去

4.5  对应脚本

4.6 重大BUG和解决

5 音效的 (这后面都没写完,下次继续搞把)


学习参考

Unity小白超神教程:2D跑酷_哔哩哔哩_bilibili关注一下视频中的公众号,就可以获取资源哈!, 视频播放量 31145、弹幕量 109、点赞数 508、投硬币枚数 333、收藏人数 1004、转发人数 212, 视频作者 Gamer飞羽, 作者简介 玩游戏、做游戏的up一枚,《新印象 Unity 2020游戏开发基础与实战》与《新印象:Unity游戏开发实例教程》作者。,相关视频:【Unity3D经典案例】--天天酷跑,无限场景怎么来的???原来这么简单粗暴,使用Unity制作无限跑酷游戏,Unity 2D 搞定<跑酷超级马里奥>,「福利」「中英字幕」Udemy - Unity休闲3D跑酷游戏制作,Cocos Creator零基础小白超神教程,Unity小白超神教程:气球大战,Unity跑酷游戏开发UI篇 —mvc框架的游戏实战教程_Untiy3d开发新手教程学习#知识分享官#,unity横版2D游戏零基础开发教程A,史上最全Unity3D教程https://www.bilibili.com/video/BV16t4y1z7xw?spm_id_from=333.788.videopod.sections&vd_source=5fa6d2958ae880d9550a17f8050fd5ed

素材资源导入

  • 想下载项目资源,结果需要用夸克,用了了,感觉比百度网盘还恶心
  • 彷佛看到当年360的样子,赶紧给卸载了
  • 直接用之前flappy bird的素材做这个跑酷吧

1 创建项目

1.1 创建1个2D项目

1.2 导入素材

虽然素材很不搭,反正瞎搞^ ^

2 背景图bg

2.0 bg素材

  • 这个bg图是378*537,竖版的,
  • 手机跑酷虽然竖版不少,但是这个可能横板的更好
  • 先这样吧,无所谓了,以后有素材的也好替换吧

2.1 创建背景

  • 用了一个竖版的分辨率 1080*1920
  • 然后把摄像机的size拉大,仍然不去调整素材本身的尺寸
  • 暂时看起来也没啥问题,先这样

2.2 修改素材,且修改摄像机等

2.2.1 修改导入的原始prefab素材

  • 突发奇想,之前觉得这个小鸟的素材bg,16pixels/1米 很奇葩
  • 然后我这强行给改了会怎么样
  • 果然图片在unity直接变小了好多!!
  • 我喜欢用标准的 100pixels/1米

2.2.2  对应调整摄像机

size只需要2.5倍差不多够了,之前都是16倍

2.2.3 弄好背景

  • 弄好2张图片,都是 bg
  • 图片横向378像素,因此x填入3.78即可, 手动改可弄不精确

2.3 背景相关脚本实现

2.3.1 错误例子解析

  • Transform.position不能直接当作变量使用
  • 必须先通过创建一个变量,获得其内容后,计算后中转,再赋值给Transform.position

如果这么写,会报错

trans1.position.x=trans1.position.x-2*bgSpeed1*Time.deltaTime;

Assets\Scripts\bgControl.cs(26,13): error CS1612: Cannot modify the return value of 'Transform.position' because it is not a variable

必须这么写

Vector2 v1=trans1.position;

v1.x=v1.x-2*bgSpeed1*Time.deltaTime;

trans1.position=v1;

2.3.2 bg缓慢移动的代码

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


public class bgControl : MonoBehaviour
{
    public float bgWidth1;
    public float bgSpeed1=0.2f;

    //use this for initialization;
    void Start()
    {

        
    }

    //Update is called once per frame;
    void Update()
    {
        //需要遍历其下每个bg,都需要这样移动
        foreach(Transform trans1 in transform)
        {
            //每个背景自动移动
            //向左边移动,x需要变小
            Vector2 v1=trans1.position;
            v1.x=v1.x-2*bgSpeed1*Time.deltaTime;
            trans1.position=v1;

        }


    }    
}

2.3.3 到边界后bg重复迭代移动的代码

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


public class bgControl : MonoBehaviour
{
    public float bgWidth1;
    public float bgSpeed1=0.2f;

    //use this for initialization;
    void Start()
    {

        
    }

    //Update is called once per frame;
    void Update()
    {
        //需要遍历其下每个bg,都需要这样移动
        foreach(Transform trans1 in transform)
        {
            //每个背景自动移动
            //向左边移动,x需要变小
            Vector2 v1=trans1.position;
            v1.x=v1.x-2*bgSpeed1*Time.deltaTime;
            trans1.position=v1;

            //背景更换位置
            //如果移动距离超过了宽度,再给加2个宽度,放到另外1个图后面
            if(v1.x<-bgWidth1)
            {
                v1.x=v1.x+2*bgWidth1;
                trans1.position=v1;
            }
        }
    }    

}

3 地面ground

3.0 地面的素材

  • 地面素材 800*392,横向的
  • 这个bg图是378*537,竖版的,
  • 导致地面比bg大一倍,有点不匹配啊。。。。
  • 管他呢,就当只有400用 ^ ^ 反正都张一个样,叠起来无所谓
  • 记得也把素材16比1 改成100比1

3.1 创建好地面

3.1.1 地图层级

  • 因为默认层级0
  • 所以bg -99
  • ground就-9吧
  • 这样新加的东西层级都会高于 bg和ground

3.1.2 给地面增加碰撞

3.1.3 拼好2个地面

  • 因为地面本身很大,只要注意下花纹
  • 重叠很大就行了,后面也需要按这个距离去更换地面

3.2 地面ground移动的代码

  • 为什么不用之前bg相同的代码
  • 因为地面有些代码内容会不同

  • 新建 groundControl ,内容可以拷贝 bgControl的
  • 但是要改一些变量名
  • 记得把外面的初始速度,地面宽度要改

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


public class groundControl : MonoBehaviour
{
    public float groundWidth1;
    public float groundSpeed1=1f;

    //use this for initialization;
    void Start()
    {

        
    }

    //Update is called once per frame;
    void Update()
    {
        //需要遍历其下每个,都需要这样移动
        foreach(Transform trans1 in transform)
        {
            //每个自动移动
            //向左边移动,x需要变小
            Vector2 v1=trans1.position;
            v1.x=v1.x-2*groundSpeed1*Time.deltaTime;
            trans1.position=v1;

            //背景更换位置
            //如果移动距离超过了宽度,再给加2个宽度,放到另外1个图后面
            if(v1.x<-groundWidth1)
            {
                v1.x=v1.x+2*groundWidth1;
                trans1.position=v1;
            }
        }
    }    

}

4 地面修改

  • 跑酷的地图要有jump,地面不能无缝连接!而且需要是随机的!

4.1 地图尺寸缩小

  • 地图尺寸也缩小了
  • 比如关心X,原始800,这里0.3=240像素=2.4米

脚本的地面长度也修改为2.4

4.1.1 屏幕宽大约2.8

但是很显然我现在地面的宽度小于屏幕,因此

屏幕大概是3.5/3, 也就是地面2.4,屏幕宽2.8 所以2个地面移动出屏幕,实际得是2.8.否则地面会重叠

4.2 设计3个不同地面

  • 前面的需要修改
  • 新建3个ground
  • 每个地面设计不同的分数,我这直接拿小鸟缩小点当分数
  • 注意,因为小鸟分数是作为ground的子物体,前面ground缩放变小过,所以这里的小年分数,也做成prefab,然后统一把 birdScore 倍数搞大点

  • 至少设计3个地面
  • 每个地图设计不同的分数
  • ground1: 0
  • ground1: 3
  • ground1: 2

4.3 地面也做成prefab,记得选原生的,脱离其他地面的影响

方便后面修改


 

4.4 定义地面的数组,把3个prefab拖进去

    //定义一个需要随机生成的gb的数组

    public GameObject[] GroundPrefabs;

4.5  对应脚本

  • 可以实现
  • 随机地面的高度不同
  • 随机地面的 缺口不一样长
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class groundControl : MonoBehaviour
{
    public float groundWidth1;
    public float groundSpeed1=1f;
    //定义一个需要随机生成的gb的数组
    public GameObject[] GroundPrefabs;

    //use this for initialization;
    void Start()
    {

        
    }

    //Update is called once per frame;
    void Update()
    {
        //需要遍历其下每个,都需要这样移动
        foreach(Transform trans1 in transform)
        {
            //每个自动移动
            //向左边移动,x需要变小
            Vector2 v1=trans1.position;
            v1.x=v1.x-2*groundSpeed1*Time.deltaTime;
            trans1.position=v1;

            
            if(v1.x<-groundWidth1)
            {
                //创建新地面newTrans
                //,transform)这是是设置为当前gB的子物体
                Transform newTrans=Instantiate(GroundPrefabs[Random.Range(0,GroundPrefabs.Length)],transform).transform;
                //获得新地面位置
                Vector2 v2= newTrans.position;
                //修改新地面位置
                //为了避免2个地面叠一起,因此这个宽度只能加不能减小,或者减小很小
                v2.x=v1.x+groundWidth1*3.5f/3f*2f+Random.Range(0,0.3f);
                v2.y=v1.y+Random.Range(-0.4f,0.6f);
                //赋值,更新位置
                newTrans.position=v2;
                //销毁出了屏幕的老地面trans1
                Destroy(trans1.gameObject);
                
            }
        }
    }    

}

4.6 重大BUG和解决

就是地面高度,会读之前的那个,然后可能越随越高,越随越低啊

修改一句代码就可以

                v2.y=v1.y+Random.Range(-0.4f,0.6f);

修改为

                v2.y=v2.y+Random.Range(-0.4f,0.6f);

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


public class groundControl : MonoBehaviour
{
    public float groundWidth1;
    public float groundSpeed1=1f;
    //定义一个需要随机生成的gb的数组
    public GameObject[] GroundPrefabs;

    //use this for initialization;
    void Start()
    {

        
    }

    //Update is called once per frame;
    void Update()
    {
        //需要遍历其下每个,都需要这样移动
        foreach(Transform trans1 in transform)
        {
            //每个自动移动
            //向左边移动,x需要变小
            Vector2 v1=trans1.position;
            v1.x=v1.x-2*groundSpeed1*Time.deltaTime;
            trans1.position=v1;

            
            if(v1.x<-groundWidth1)
            {
                //创建新地面newTrans
                //,transform)这是是设置为当前gB的子物体
                Transform newTrans=Instantiate(GroundPrefabs[Random.Range(0,GroundPrefabs.Length)],transform).transform;
                //获得新地面位置
                Vector2 v2= newTrans.position;
                //修改新地面位置
                //为了避免2个地面叠一起,因此这个宽度只能加不能减小,或者减小很小
                v2.x=v1.x+groundWidth1*3.5f/3f*2f+Random.Range(0,0.3f);
                v2.y=v2.y+Random.Range(-0.4f,0.6f);
                //赋值,更新位置
                newTrans.position=v2;
                //销毁出了屏幕的老地面trans1
                Destroy(trans1.gameObject);
                
            }
        }
    }    

}

5 音效的 (这后面都没写完,下次继续搞把)

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


public class AudioControl : MonoBehaviour
{
    //单例
    public static AudioControl Instance;
    //播放组件
    private AudioSource player;

    //use this for initialization;
    void Start()
    {
        //自己创建类的唯一单例
        Instance=this;
        //获得播放组件
        player=GetComponent<AudioSource>();

        //这里可以搞背景音乐

    }

    //Update is called once per frame;
    void Update()
    {
 
    }    

    
    public void play(string name)
    {
        //通过名称获取音频clip
        name="sfx_point";
        AudioClip clip=Resources.Load<AudioClip>(name);
        //播放
        player.PlayOneShot(clip);

    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2313498.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在本地部署DeepSeek等大模型时,需警惕的潜在安全风险

在本地部署DeepSeek等大模型时&#xff0c;尽管数据存储在本地环境&#xff08;而非云端&#xff09;&#xff0c;但仍需警惕以下潜在安全风险&#xff1a; 1. 模型与数据存储风险 未加密的存储介质&#xff1a;若训练数据、模型权重或日志以明文形式存储&#xff0c;可能被物…

【redis】string类型相关操作:SET、GET、MSET、MGET、SETNX、SETEX、PSETEX

文章目录 二进制存储编码转换SET 和 GETSETGET MSET 和 MGETSETNX、SETEX 和 PSETEX Redis 所有的 key 都是字符串&#xff0c;value 的类型是存在差异的 二进制存储 Redis 中的字符串&#xff0c;直接就是按照二进制数据的方式存储的 不仅仅可以存储文本数据&#xff0c;还可…

GaussDB安全配置指南:从认证到防御的全方面防护

一、引言 随着企业数据规模的扩大和云端化进程加速&#xff0c;数据库安全性成为运维的核心挑战之一。GaussDB作为一款高性能分布式数据库&#xff0c;提供了丰富的安全功能。本文将从 ​认证机制、权限控制、数据加密、审计日志​ 等维度&#xff0c;系统性地讲解如何加固 Ga…

Ubuntu20.04搭建gerrit code review

一、环境准备 1. 安装 Java 环境‌ Gerrit 依赖 Java 运行环境&#xff08;推荐 JDK 8&#xff09;&#xff1a; sudo apt install openjdk-11-jdk 验证安装&#xff1a; java -version ‌2. 安装 Git sudo apt install git ‌3. 可选依赖 数据库‌&#xff1a;Gerrit …

MacOS安装FFmpeg和FFprobe

按照网上很多教程安装&#xff0c;结果都失败了&#xff0c;后来才发现是路径问题&#xff0c;其实安装过程很简单&#xff08;无奈&#xff09; 第一步&#xff1a; 在官网下载 打开页面后&#xff0c;可以看到FFmpeg、FFprobe、FFplay和FFserver的下载图标 第二步&#xff1…

Redis7系列:设置开机自启

前面的文章讲了Redis和Redis Stack的安装&#xff0c;随着服务器的重启&#xff0c;导致Redis 客户端无法连接。原来的是Redis没有配置开机自启。此文记录一下如何配置开机自启。 1、修改配置文件 前面的Redis和Redis Stack的安装的文章中已经讲了redis.config的配置&#xf…

SpringAI介绍及本地模型使用方法

博客原文地址 前言 Spring在Java语言中一直稳居高位&#xff0c;与AI的洪流碰撞后也产生了一些有趣的”化学反应“&#xff0c;当然你要非要说碰撞属于物理反应也可以&#xff0c; 在经历了一系列复杂的反应方程后&#xff0c;Spring家族的新成员——SpringAI&#xff0c;就…

Unity 基础知识总结(持续更新中...)

引擎基础 Unity有哪几个主要窗口&#xff1f; Scene窗口 用于场景搭建和UI界面拼接 Game窗口 游戏运行预览 Hierarchy窗口 查看和调整场景对象层级结构 Project窗口 游戏工程资源 Inspector创建 属性查看器&#xff0c;属性设置、脚本组件挂载 Unity提供了几种光源…

IDEA接入阿里云百炼中免费的通义千问[2025版]

安装deepseek 上一篇文章IDEA安装deepseek最新教程2025中说明了怎么用idea安装codeGPT插件&#xff0c;并接入DeepSeek&#xff0c;无奈接入的官方api已经不能使用了&#xff0c;所以我们尝试从其他地方接入 阿里云百炼https://bailian.console.aliyun.com/ 阿里云百炼‌是阿…

3.03-3.09 Web3 游戏周报:Sunflower Land 周留存率 74.2%,谁是本周最稳链游?

回顾上周的区块链游戏概况&#xff0c;查看 Footprint Analytics 与 ABGA 最新发布的数据报告。 【3.03–3.09】Web3 游戏行业动态 Sui 背后开发公司 Mysten Labs 宣布收购游戏开发平台 ParasolYescoin 创始人因合伙人纠纷被警方带走&#xff0c;案件升级为刑事案件Animoca B…

NVIDIA k8s-device-plugin源码分析与安装部署

在《kubernetes Device Plugin原理与源码分析》一文中&#xff0c;我们从源码层面了解了kubelet侧关于device plugin逻辑的实现逻辑&#xff0c;本文以nvidia管理GPU的开源github项目k8s-device-plugin为例&#xff0c;来看看设备插件侧的实现示例。 一、Kubernetes Device Pl…

langChainv0.3学习笔记(初级篇)

LangChain自0.1版本发布以来&#xff0c;已经历了显著的进化&#xff0c;特别是向AI时代的适应性提升。在0.1版本中&#xff0c;LangChain主要聚焦于提供基本的链式操作和工具集成&#xff0c;帮助开发者构建简单的语言模型应用。该版本适用于处理简单任务&#xff0c;但在应对…

聚焦两会:科技与发展并进,赛逸展2025成创新新舞台

在十四届全国人大三次会议和全国政协十四届三次会议期间&#xff0c;代表委员们围绕多个关键议题展开深入讨论&#xff0c;为国家未来发展谋篇布局。其中&#xff0c;技术竞争加剧与经济转型需求成为两会焦点&#xff0c;将在首都北京举办的2025第七届亚洲消费电子技术贸易展&a…

Ubuntu 24.04 安装与配置 JetBrains Toolbox 指南

&#x1f4cc; 1. JetBrains Toolbox 介绍 JetBrains Toolbox 是 JetBrains 开发的工具管理器&#xff0c;可用于安装、更新和管理 IntelliJ IDEA、PyCharm、WebStorm、CLion 等。本指南记录了 JetBrains Toolbox 在 Ubuntu 24.04 上的 安装、路径调整、权限管理 及 遇到的问题…

【AI】神经网络|机器学习——图解Transformer(完整版)

Transformer是一种基于注意力机制的序列模型,最初由Google的研究团队提出并应用于机器翻译任务。与传统的循环神经网络(RNN)和卷积神经网络(CNN)不同,Transformer仅使用自注意力机制(self-attention)来处理输入序列和输出序列,因此可以并行计算,极大地提高了计算效率…

【VUE2】第二期——生命周期及工程化

目录 1 生命周期 1.1 介绍 1.2 钩子 2 可视化图表库 3 脚手架Vue CLI 3.1 使用步骤 3.2 项目目录介绍 3.3 main.js入口文件代码介绍 4 组件化开发 4.1 组件 4.2 普通组件注册 4.2.1 局部注册 4.2.2 全局注册 1 生命周期 1.1 介绍 Vue生命周期&#xff1a;就是…

贪心算法三

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是贪心算法&#xff0c;并且掌握贪心算法。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! >…

猫耳大型活动提效——组件低代码化

1. 引言 猫耳前端在开发活动的过程中&#xff0c;经历过传统的 pro code 阶段&#xff0c;即活动页面完全由前端开发编码实现&#xff0c;直到 2020 年接入公司内部的低代码活动平台&#xff0c;满足了大部分日常活动的需求&#xff0c;运营可自主配置活动并上线&#xff0c;释…

机器学习 Day02,matplotlib库绘图

1.matplotlib图像结构 容器层&#xff1a;画板&#xff0c;画布&#xff0c;坐标系辅助层&#xff1a;刻度&#xff0c;标题&#xff0c;网格&#xff0c;图例等图像层&#xff1a;折线图&#xff08;主讲&#xff09;&#xff0c;饼图&#xff0c;直方图&#xff0c;柱状图等…

MySQL中有哪几种锁?

大家好&#xff0c;我是锋哥。今天分享关于【MySQL中有哪几种锁&#xff1f;】面试题。希望对大家有帮助&#xff1b; MySQL中有哪几种锁&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 MySQL 中&#xff0c;锁是用于确保数据的一致性和并发控制的机…