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

目录

学习参考

素材资源导入

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);

    }

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PyTorch系列教程:编写高效模型训练流程

当使用PyTorch开发机器学习模型时&#xff0c;建立一个有效的训练循环是至关重要的。这个过程包括组织和执行对数据、参数和计算资源的操作序列。让我们深入了解关键组件&#xff0c;并演示如何构建一个精细的训练循环流程&#xff0c;有效地处理数据处理&#xff0c;向前和向后…

PX4中的DroneCAN的实现库Libuavcan及基础功能示例

简介 Libuavcan是一个用C编写的可移植的跨平台库&#xff0c;对C标准库的依赖小。它可以由几乎任何符合标准的C编译器编译&#xff0c;并且可以在几乎任何体系结构/OS上使用。 在 DroneCAN 中&#xff0c;Libuavcan 有一个 DSDL 编译器&#xff0c;将 DSDL 文件转换为 hpp 头…

计算机网络(1) 网络通信基础,协议介绍,通信框架

网络结构模式 C/S-----客户端和服务器 B/S -----浏览器服务器 MAC地址 每一个网卡都拥有独一无二的48位串行号&#xff0c;也即MAC地址&#xff0c;也叫做物理地址、硬件地址或者是局域网地址 MAC地址表示为12个16进制数 如00-16-EA-AE-3C-40 &#xff08;每一个数可以用四个…

PCA(主成分分析)核心原理

一、PCA&#xff08;主成分分析&#xff09;核心原理 即主成分分析技术&#xff0c;又称主分量分析技术&#xff0c;旨在利用降维的思想&#xff0c;把多指标转化为少数几个综合指标。在统计学中&#xff0c;主成分分析PCA是一种简化数据集的技术。它是一个线性变换。这个变换…

SpringBoot-模拟SSE对话交互

SpringBoot-模拟SSE对话交互 后端使用SSE进行会话&#xff0c;前端使用Html模拟大模型的问答交互->【前端】【后端】 1-学习目的 本项目代码仓库&#xff1a;https://gitee.com/enzoism/springboot_sse 1-核心知识点 1&#xff09;什么是SSE协议->客户端发起一次请求&am…

2025DNS二级域名分发PHP网站源码

安装教程 1.程序必须使用PHP8.1 2.将扩展ixed.8.1.lin放入/www/server/php/81/lib/php/extensions/no-debug-non-zts-20210902 3.打开宝塔→软件商店→PHP8.1→配置文件 4.放入&#xff1a;extensionixed.8.1.lin 5.重启PHP8.1 6.新建站点&#xff08;mysql5.6-5.7andPHP8.1&a…

Matlab实现车牌识别

车牌识别技术作为现代智能交通系统、安防监控以及诸多车辆管理应用场景中的关键环节&#xff0c;正发挥着日益重要的作用&#xff0c;它能够自动、快速且精准地从车辆图像或视频流中提取车牌信息&#xff0c;实现车辆身份的智能化识别。 技术原理 车牌识别主要依托于图像处理、…

C语言——链表

大神文献&#xff1a;https://blog.csdn.net/weixin_73588765/article/details/128356985 目录 一、链表概念 1. 什么是链表&#xff1f; 1.1 链表的构成 2. 链表和数组的区别 数组的特点&#xff1a; 链表的特点&#xff1a; 二者对比&#xff1a; 二…

国产化板卡设计原理图:2330-基于FMC接口的JFM7K325T PCIeX4 3U PXIe接口卡

基于FMC接口的JFM7K325T PCIeX4 3U PXIe接口卡 一、板卡概述 本板卡基于 FPGAJFM7K325T 芯片&#xff0c;pin_to_pin兼容FPGAXC7K410T-2FFG900 &#xff0c;支持PCIeX8、64bit DDR3容量2GByte&#xff0c;HPC的FMC连接器&#xff0c;板卡支持PXIE标准协议&#xff0c;其中XJ3…

【网络】HTTP协议、HTTPS协议

HTTP与HTTPS HTTP协议概述 HTTP(超文本传输协议):工作在OSI顶层应用层,用于客户端(浏览器)与服务器之间的通信,B/S模式 无状态:每次请求独立,服务器不保存客户端状态(通过Cookie/Session扩展状态管理)。基于TCP:默认端口80(HTTP)、443(HTTPS),保证可靠传输。请…

设计AI芯片架构的入门 研究生入行数字芯片设计、验证的项目 opentitan

前言 这几年芯片设计行业在国内像坐过山车。时而高亢&#xff0c;时而低潮。最近又因为AI的热潮开始high起来。到底芯片行业的规律是如何&#xff1f; 我谈谈自己观点&#xff1a;芯片设计是“劳动密集型”行业。 “EDA和工具高度标准化和代工厂的工艺标准化之后&#xff0c;芯…

K8S学习之基础十七:k8s的蓝绿部署

蓝绿部署概述 ​ 蓝绿部署中&#xff0c;一共有两套系统&#xff0c;一套是正在提供服务的系统&#xff0c;一套是准备发布的系统。两套系统都是功能完善、正在运行的系统&#xff0c;只是版本和对外服务情况不同。 ​ 开发新版本&#xff0c;要用新版本替换线上的旧版本&…

STM32之I2C硬件外设

注意&#xff1a;硬件I2C的引脚是固定的 SDA和SCL都是复用到外部引脚。 SDA发送时数据寄存器的数据在数据移位寄存器空闲的状态下进入数据移位寄存器&#xff0c;此时会置状态寄存器的TXE为1&#xff0c;表示发送寄存器为空&#xff0c;然后往数据控制寄存器中一位一位的移送数…

Linux基础--用户管理

目录 查看用户 使用命令: id 创建用户 使用命令: useradd ​编辑 为用户设置密码 使用命令: passwd ​编辑 删除用户 使用命令: userdel 创建用户组 使用命令: groupadd 删除用户组 使用命令: groupdel 用户设置 使用命令: usermod 将用户从组中去除 使用…

VSTO(C#)Excel开发3:Range对象 处理列宽和行高

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

本地YARN集群部署

请先完成HDFS的前置部署&#xff0c;部署方式可查看:本地部署HDFS集群https://blog.csdn.net/m0_73641796/article/details/145998092?spm1001.2014.3001.5502 部署说明 组件配置文件启动进程备注Hadoop HDFS需修改 需启动: NameNode作为主节点 DataNode作为从节点 Secondary…

每日一练之移除链表元素

题目&#xff1a; 画图解析&#xff1a; 方法&#xff1a;双指针 解答代码&#xff08;注&#xff1a;解答代码带解析&#xff09;&#xff1a; //题目给的结构体 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* }…

黑金风格人像静物户外旅拍Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色教程 针对人像、静物以及户外旅拍照片&#xff0c;运用 Lightroom 软件进行风格化调色工作。旨在通过软件中的多种工具&#xff0c;如基本参数调整、HSL&#xff08;色相、饱和度、明亮度&#xff09;调整、曲线工具等改变照片原本的色彩、明度、对比度等属性&#xff0c;将…

【GPT入门】第8课 大语言模型的自洽性

【GPT入门】第8课 大语言模型的自洽性 1.自洽性概念2.代码&#xff08;观察执行结果&#xff09;3.自洽性核心思想 1.自洽性概念 大模型的自洽性&#xff08;self - consistency&#xff09;是指在推理阶段&#xff0c;大模型通过生成多个答案并选择出现频率最高的那个&#x…

深度学习(斋藤康毅)学习笔记(六)反向传播3

上一篇文章介绍了反向传播的自动化&#xff0c;但也存在一些问题&#xff0c;本章用于说明这些问题&#xff0c;并修改原有框架&#xff0c;使其支持复杂计算图的运行&#xff1a; 问题一&#xff1a;重复使用一个变量&#xff0c;梯度不会累计 也就是说&#xff0c;反向传播时…