[Unity小项目]3D像素跑酷游戏
FFFFFlipping
1. 游戏截图
[待补充]>>>emm录制gif的时候出错了…
2. APK下载
FFFFFlipping-V1.1.apk
3. 怎么玩?
- 点键help按钮, 会显示操作提示
- 你可以向左跳, 向右跳, 每次只能跳一步
- 你可以向后跳一步来调整战略, 防止陷入僵局, 或者踩爆更多的敌人!
- 你可以收集金币, 然后打破纪录! (但是现在还没有商店)
- 踩爆敌人获得加血, 踩到陷阱☠则会死亡
- 长时间没有加血, 呼吸和速度都会变慢! 然后死掉!
- 开始弹跳之旅吧
4. 开发环境
- Unity 2018.1
5. 技术关键点解析和拓展
5.1 碰撞检测
项目中的使用场景
- 无限地图的拼接: 通过在相机处设置碰撞体, 当相机看不见某一行block时, 将该block移到最后一排, 实现无限地图
- cell(金币/敌人/陷阱☠)的处理: 主角跳到敌人或陷阱的cell, 会有不同的反馈
拓展:
- 游戏引擎架构----物理部分
5.2 相机跟随
效果图:
实现细节:
- 只做前后跟随, 即只需要z值跟随就好了
- 跟随有延迟效果, 采用
Mathf.Lerp
插值实现 - 具体操作介绍: Unity 实现人物相机前后跟随, 带延迟效果
关键代码如下:
using UnityEngine;
public class CameraMovement : MonoBehaviour {public GameObject followTarget;public float moveSpeed;void Update() {if (followTarget != null) {//相机位置Z值与目标点的Z值做插值, 实现相机前后跟随, 而目标点运动不影响var newZ = Mathf.Lerp(transform.position.z, followTarget.transform.position.z, Time.deltaTime * moveSpeed);var newVector3 = new Vector3(transform.position.x, transform.position.y, newZ);transform.position = newVector3;}}
}
5.3 无限地图拼接
效果图:
关键代码如下:
using UnityEngine;
public class BlockMovement : MonoBehaviour {void OnTriggerExit(Collider other) {//当相机看不见某一行block时, 将该block移到最后一排, 实现无限地图if (other.gameObject.tag == "Floor") {BlockManager.Instance.ChangeBlockPosition(other.transform);}if (other.gameObject.tag == "PoolItem") {var poolItem = other.transform.GetComponent<Cell>();poolItem.ReleaseIntoPool();}}
}
5.4 敌人视觉模拟和角度跟随
敌人看到主角时, 会转向主角
怎样算看到呢? 项目中, 主角与敌人的z值距离小于指定值时, 可以断定主角进入敌人的视觉范围
要怎么转向主角呢? 用四元数来表示旋转, 同时限制欧拉角中的y值, 来限制旋转角度
关键代码如下:
protected virtual bool SeesPlayer =>((Player != null) && (Mathf.Abs((int)(transform.position.z - Player.transform.position.z)) <= visionRange));
//...
protected virtual void Update() {if (Player != null) {if (SeesPlayer) TurnTowardPlayer();}
}
//...
private void TurnTowardPlayer() {Vector3 position = Player.transform.position;//忽略y值的影响position.y = transform.position.y;Vector3 forward = transform.position - position;if (forward != Vector3.zero) {Quaternion b = Quaternion.LookRotation(forward);transform.rotation = Quaternion.Lerp(transform.rotation, b, Time.deltaTime * turnRate);float y = transform.eulerAngles.y;//确定旋转角度if (y > 180f) y -= 360f;//将旋转角度限制在-45度和+45度之间transform.rotation = Quaternion.Euler(0f, Mathf.Clamp(y, -mLookLimit, mLookLimit), 0f);}
}
拓展:
- 3D数学中表现旋转的方式有:
- 旋转矩阵: 行列式为1的正交矩阵
- 旋转矩阵有9个量,但是一次旋转只有3个自由度,因此这种表达方式是冗余的
- 旋转矩阵自身带有约束:它必须是个正交矩阵,且行列式为1
- 欧拉角: 最直观的旋转描述方式,也是一个3维向量,分别代表绕某个轴的旋转角度
- 相同的角度,旋转次序的不同,旋转结果不一样。一般常见的是rpy角(旋转顺序是ZYX)
- 最大的缺点是万向锁问题:俯仰角为±90度时,第一次旋转和第三次旋转将使用同一个轴,使得系统丢失了一个自由度
- 无法实现球面平滑插值
- 四元数: 四元数就是一个高阶复数,也就是一个四维空间
- 它们结构紧凑
- 不受万向节锁定的影响
- 可提供球面平滑插值
- 不够直观
- Unity内部使用四元数来表示所有旋转
- 旋转矩阵: 行列式为1的正交矩阵
- 参考:
- Unity学习笔记10——旋转(四元数和欧拉角)
- 三维空间刚体旋转描述
5.5 主角跳跃穿越效果
效果图为:
关键代码为:
/// <summary>/// 左右跳时, 主角也向前跳/// </summary>/// <param name="direction">-1表示向左跳, 1表示向右跳</param>private void ForwardJump(int direction) {mCurrentX += direction;if (direction == -1) {//越界了if (mCurrentX < 0) {mCurrentX = 2;var newVector3 = transform.position;newVector3.x = 2 * characterPositionOffset;transform.position = newVector3;}transform.Translate(Vector3.left * characterPositionOffset);}if (direction == 1) {//越界了if (mCurrentX > 2) {mCurrentX = 0;var newVector3 = transform.position;newVector3.x = -2 * characterPositionOffset;transform.position = newVector3;}transform.Translate(Vector3.right * characterPositionOffset);}JumpForward();}
5.6 血量不足时的减速处理
public void LowBlood() {Time.timeScale = 0.5f;lowBloodView.SetActive(true);}public void ResumeNormalBlood() {Time.timeScale = 1;lowBloodView.SetActive(false);}
5.7 重载场景后灯光变暗问题处理
原因:
- 选择的光照是GI realtime实时光照,编辑器在当前场景时,它的灯光是已经渲染好了,但重新加载的时候灯光没有进行渲染
解决方法:
- Window->lighting->settings->右下角取消勾选auto,这时候是没有烘焙灯光的情形,重新加载场景后不再会变暗。
- 如果需要烘培灯光,则点击Generate按钮即可,这时候将保存光照贴图信息,重新加载后也不会再变暗。
解决方法参考:
- Unity 2017 重新载入场景与灯光变暗问题处理
6. 哪些还可以做得更好
敌人AI, 项目当中暂时没有实现AI功能. 后期有机会我将会补上.
参考:
- 基于 Unity 引擎的游戏开发进阶之 敌人AI
- 给猫看的游戏AI实战(二)视觉感知初步
7. 为什么叫做FFFFFlipping呢?
纯属因为个人喜欢的两款放荡不羁的游戏
(1)Eggggg(喷蛋狂人)
(2)Flipping Legend (弹跳传奇)
8. 个人博客
CSDN: jingangxin36
9. 项目地址
jingangxin36/FFFFFlipping
[Unity小项目]3D像素跑酷游戏相关推荐
- java 拼图游戏_Java小项目之:拼图游戏!
Java小项目之:拼图游戏! 今天教大家用java做出一个拼图游戏,很适合java初学者练手. 所用素材: 部分代码: package picture_mosical; import java.awt ...
- C#小项目飞翔的小鸟游戏详细教程(Flying bird),基于Winform框架
C#小项目飞翔的小鸟游戏详细教程(Flying bird),基于Winform框架 实现效果: 1.空格,鼠标左键控制小鸟跳 2.管道随机大小 3.小鸟与管道碰撞,小鸟碰到地面 4.小鸟煽动翅膀动画 ...
- Unity 小项目:模拟太阳系
Unity 小项目:模拟太阳系 太阳系是以太阳为中心,和所有受到太阳的引力约束天体的集合体.包括八大行星(由离太阳从近到远的顺序:水星.金星.地球.火星.木星.土星.天王星.海王星 ).以及至少173 ...
- HTML小游戏13 —— 仿《神庙逃亡》3D风格跑酷游戏《墓地逃亡》(附完整源码)
- [Unity小项目]俄罗斯方块
Unity实现俄罗斯方块 Demo: 使用方法: 安卓手机: 直接点击游戏界面按钮 Editor: 直接点击play 开发环境: Unity2018.1 部分实现介绍 UI界面使用的MVC架构 Vie ...
- java 小项目:简单扑克牌游戏
项目要求 1>新建两个玩家 2>创建扑克牌,洗牌 3>发牌,每个玩家没人拿两张,比较大小 4>比较规则:两个玩家选出各种最大的牌,进行游戏,先比较点数大小,点数大的获胜,点数相 ...
- C语言小项目——井字棋游戏(升级版)
- [教程] 使用3D Infinite Runner Toolkit打造僵尸跑酷游戏
使用3D Infinite Runner Toolkit打造僵尸跑酷游戏 3D Infinite Runner Toolkit是一款风格特异的3D版跑酷游戏开发包,其优点是容易使用与修改场景内的所有组 ...
- Unity小游戏-惊爆游戏(PC)3D联网大逃杀游戏 项目展示+完整项目源码
游戏录像 游戏玩法 1.类似吃鸡的小游戏,但是这里没有毒圈,武器只有炸弹,没有枪. 2.游戏开始后所有人的体力会不断下降,当体力下降到0就会死亡. 3.玩家只有吃食物增加体力才能活下去,而食物只能通过 ...
最新文章
- QT系统性总结(推荐新手看)
- [转]jkeyll的安装步骤
- 比较OpenDDR和WURFL
- uva 11536——Smallest Sub-Array
- 你觉得我的这段Java代码还有优化的空间吗?
- Flink对比Spark以及流计算发展趋势分析
- azw3转换为pdf_怎么合并几个PDF为一个?快用这个PDF转换器!
- react 源码概览
- java 字符串 移位_算法学习之字符串左移和右移
- 浅析Mysql的隔离级别及MVCC
- 一款完整的多用户微信公众平台开发源码,带文档免费分享
- 论文阅读(4) 游泳水母对被动能量再捕获的广泛利用(2018)
- RTMP网页视频抓取
- C语言学习-翁凯(第四章笔记)
- SpringBoot_01_初窥门径
- 汽车加油问题 贪心算法 Java(详细注释)
- js前端导出Excel(可自定义文件名称,后缀,有边框样式)
- 04-MPI几个基本函数
- Win7中双击bat文件变成打开文本编辑器后如何恢复
- 华为 watch fit 鸿蒙,华为新款智能手表 Watch Fit 曝光,矩形表盘,支持近 100 种运动模式...
热门文章
- Shader山下(十七)语义Semantic
- 使用客户端等远程连接mysql数据库
- Linux 解压tar
- mysqlsql怎么比较当前月与去年的这个月的同比_【头条】11月CPI同比上涨4.5%,猪肉供应紧张状况有所缓解...
- 第十章 设计模式/垃圾回收/装饰器/闭包
- 计算机创新者印象(2):从罗伯茨到比尔.盖茨
- 想学尤克里里吗?新手如何挑选一把适合自己的尤克里里!
- 【AJAX】给你不一样的用户体验
- java 词根_英语词根与单词的说文解字---词根示例1、第10页 st(at)
- 切换鼠标左右按键引发的思考(批处理、VBS、DynamicWrapper)