【unity】分享一个2D小游戏的完整制作教程——涂鸦跳跃demo
文章目录
- 前言
- 1.贴图准备
- 跳板的逻辑
- 人物的逻辑
- 相机的逻辑
- 如何自动生成跳板
- 如何赢得游戏
前言
- 这个只是练手的一个2D小游戏,不许商用哦
- 完成了原版的一个关卡的内容,跳板也只有一种,但是如果需要的话可以往深了做的
- 项目地址+Demo试玩(win64的exe在Client文件夹中)
1.贴图准备
- 使用到的工具是ps,切一个板,切一个主人公,再找一个背景墙,这样材料就准备齐全了~
跳板的逻辑
将跳板放入场景中后,因为涉及到了碰撞,因此给一个碰撞体组件
之后有个细节,就是如果任务触碰到板子的下方,是不会算作踩到跳板获得向上的速度的!这个需求可以从两方面来实现(一个就是当角色下落的时候才判断碰撞回调;二就是使用到下面这个Platform Effector 2D啦)注意需要在collider中的use by effector打钩
最后再给板子一个tag,用来判断碰撞,这样就可以将板子作为预制件,然后拖走啦 ~
人物的逻辑
- 首先人物会受到重力作用,因此加入Rigibody2D组件,并给其一个重力规模
- 需要计算碰撞,因此给一个碰撞体!记得把Is Trigger勾上,不√的话,我们用不了碰撞回调的OnTriggerEnter2D方法,因为角色会停在板子上,不会进入!
- 下面我们给角色一个控制的脚本
- 下面这个脚本的功能,有查看左右的越界(当左边越界的时候,角色会从右边出来,看起来左右地图不会出界,是联通的)
- 当角色触碰到板子上的时候会得到一个向上的速度
- 角色受到方向键的控制(细节:角色的朝向也会受到向左向右的影响)
public class Player : MonoBehaviour
{public Rigidbody2D rb;public float sensitive = 10f;private void Update(){PlayerController();//查看越界checkOverEdge();}private void checkOverEdge(){if (transform.position.x < -6f){transform.position = new Vector2(6f, transform.position.y);}if (transform.position.x > 6f){transform.position = new Vector2(-6f, transform.position.y);}}private void OnTriggerEnter2D(Collider2D col){//下落的时候才计算碰撞。不然角色只要碰到东西就会往上飞if (rb.velocity.y <= 0){if (col.CompareTag("board")){rb.velocity = new Vector2(0f, 10f);}}if (col.CompareTag("win")){SceneManager.LoadScene("Win");}}private void PlayerController(){float horizontalAxis = 0;horizontalAxis = Input.GetAxis("Horizontal");if (Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.LeftArrow)){transform.rotation = Quaternion.Euler(new Vector3(0, 0, 0));}if (Input.GetKeyDown(KeyCode.D) || Input.GetKeyDown(KeyCode.RightArrow)){transform.rotation = Quaternion.Euler(new Vector3(0, 180, 0));}rb.velocity = new Vector2(horizontalAxis * sensitive, rb.velocity.y);}
相机的逻辑
- 相机的话就跟上一个小球跳圈的游戏是一样的道理,如果角色y大于相机y,那么相机跟着向上走
- 角色如果一下子跌落(与相机的y轴相差一定的大小,记作失败,重新加载游戏场景),游戏回到起点~
public class PlayerFollow : MonoBehaviour
{public Transform PlayerTransform;private Vector3 currentVelocity;public Rigidbody2D playerRigidbody2D;private void LateUpdate(){if (PlayerTransform.position.y >= transform.position.y){Vector3 tmpv = new Vector3(transform.position.x, PlayerTransform.position.y, transform.position.z);transform.position =Vector3.SmoothDamp(transform.position, tmpv, ref currentVelocity, .3f * Time.deltaTime);}//掉入谷底,回到原点if (PlayerTransform.position.y < transform.position.y - 3f){SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);}}
}
如何自动生成跳板
在场景中,专门有个空物体是用来自动生成板子的。就是个空物体,放在原点就好,方便地图生成。
这里生成地图的逻辑是在游戏开始的时候,在Start的时候就将本关卡所有的板子位置生成好了
在下面脚本中,按照一定的高度差,和一定的水平差随机生成numberOfPlatforms-1数量的板子,并在最后一次生成一个win point(在游戏中就是一面红旗,触碰到了算胜利!)
游戏中的板子水平距离不能太宽,不然跳不过去,因此这里写个while循环,如果生成过宽,则重新生成。
public class LevelGenerator : MonoBehaviour
{public GameObject platformPrefab;public int numberOfPlatforms;public GameObject winPointPrefab;public float levelWidth = 3f;public float minY = .2f;public float maxY = 1.8f;private float lastx;private void Start(){Vector3 spawnPosition = new Vector3();for (int i = 0; i < numberOfPlatforms; i++){spawnPosition.y += Random.Range(minY, maxY);float tmpx = Random.Range(-levelWidth, levelWidth);while (Math.Abs(tmpx - lastx) > 4f){tmpx = Random.Range(-levelWidth, levelWidth);}lastx = tmpx;spawnPosition.x = tmpx;if (i == numberOfPlatforms - 1){//生成win pointInstantiate(winPointPrefab, spawnPosition, Quaternion.identity);}else{Instantiate(platformPrefab, spawnPosition, Quaternion.identity);}}}
}
如何赢得游戏
- 做一个标志物(这里用的是红旗),给其一个tag,作为预制体,被自动生成
- 当角色触碰到后,加载win场景~
- 这样好玩又解压的Demo就大功告成啦!具体可以查看工程代码~
【unity】分享一个2D小游戏的完整制作教程——涂鸦跳跃demo相关推荐
- 【unity】分享一个2D小游戏的完整制作教程——小球跳圈
文章目录 前言 1.准备游戏材质 2.进入编辑器,处理四色环的逻辑 3.玩家控制小球逻辑 4.关于摄像机部分 前言 看到了个不错的unity3D游戏教程,于是记录一下 这是工程地址+游戏Demo 1. ...
- 一个2d小游戏c++
#include<iostream> #include<windows.h> using namespace std; string fk[41][41]; string ba ...
- Unity中FPS类小游戏的简单制作
1.摄像机放Player上,射线机代码 using UnityEngine; using System.Collections;public class Camera : MonoBehaviour ...
- 大家都在发圣诞树,我偏偏要发一个圣诞小游戏给大家玩【内附源码】
大家好,我是辣条. 前言 圣诞节快来了,热榜都被一堆圣诞树攻占了,这样的流量密码我怎么会错过,大家都发圣诞树,我就不发啦,直接分享一个圣诞小游戏给大家玩,代码太长一定要先赞和收藏. 领取福利 300 ...
- 【phaser】快速实现HTML5 2D小游戏
原文链接 前言 最近忙着看项目和写项目,在 github 上无意中发现了别人用 phaser 实现的2d小游戏,代码简单易懂,而且phaser框架本身就是非常的简单,非常适合想快速开发小游戏的开发者. ...
- 基于Unity的2D小游戏 SpeedDown 开发笔记(学习bilibili@[M_Studio]的教学视频
基于Unity的2D小游戏 SpeedDown 开发笔记(学习bilibili@M_Studio的教学视频) 主要内容:在Sunnyland游戏的设计基础上,新增了物理组件Joint系列.DrawGi ...
- 「Unity2D」使用Unity创建一个2D游戏系列-1
「Unity2D」使用Unity创建一个2D游戏系列-1 安装unity并且创建你的第一个场景 在第一章,你将会学习到一些非常基本的内容:首先是unity的下载和安装,其次是准备创建我们游戏内的第一个 ...
- Unity 之 转微信小游戏本地数据存储方法分享
Unity 之 转微信小游戏本地数据存储 问题背景 微信小游戏读写本地文件 WebGL平台的一些限制 报错查看方法分享 问题背景 近期在将Unity转换为小游戏的时候发现在读写本地文件的时候,使用Ap ...
- 学习用C#在Unity中创建一个2D Metroidvania游戏
学习用C#在Unity中创建一个2D Metroidvania游戏 你会学到: 构建2D Unity游戏 用C#编程 玩家统计,水平提升,米尔和远程攻击 敌方人工智能系统 制定级别和级别选择 Lear ...
最新文章
- Transformer在CV领域有可能替代CNN吗?还有哪些应用前景?
- 对于python来说、一个模块就是一个文件-PYTHON中的包和模块
- 总线制和多线制示意图_再谈总线制与多线制的区别
- [深度学习] DeepFM 介绍与Pytorch代码解释
- SQL Server代理(11/12):维护计划作业
- java 圆的交点_java – 获取线条和形状的交点
- Hibernate的数据删除,更改
- RocketMQ入门到入土(六)发消息的时候选择queue的算法有哪些?
- 基于postman的api自动化测试实践
- Python socket – network programming tutorial
- 微信模拟器不显示鼠标解决办法
- 好好编程-物流项目01【搭建maven工程】
- 人工智能数学基础8:两个重要极限及夹逼定理
- python倒计时器-带图像
- Workgroup 协议
- iVMS-4200 Vs区别_菲尔·杰克逊揭示了迈克尔·乔丹和科比·布莱恩特之间的关键区别...
- 终生学习者,永远劳苦命!
- 机器人学笔记(01):1.绪论
- 文件系统区别ntfs ext fat、mbr guid
- elementPlus el-dialog 自适应