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内部使用四元数来表示所有旋转
  • 参考:
    • 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像素跑酷游戏相关推荐

  1. java 拼图游戏_Java小项目之:拼图游戏!

    Java小项目之:拼图游戏! 今天教大家用java做出一个拼图游戏,很适合java初学者练手. 所用素材: 部分代码: package picture_mosical; import java.awt ...

  2. C#小项目飞翔的小鸟游戏详细教程(Flying bird),基于Winform框架

    C#小项目飞翔的小鸟游戏详细教程(Flying bird),基于Winform框架 实现效果: 1.空格,鼠标左键控制小鸟跳 2.管道随机大小 3.小鸟与管道碰撞,小鸟碰到地面 4.小鸟煽动翅膀动画 ...

  3. Unity 小项目:模拟太阳系

    Unity 小项目:模拟太阳系 太阳系是以太阳为中心,和所有受到太阳的引力约束天体的集合体.包括八大行星(由离太阳从近到远的顺序:水星.金星.地球.火星.木星.土星.天王星.海王星 ).以及至少173 ...

  4. HTML小游戏13 —— 仿《神庙逃亡》3D风格跑酷游戏《墓地逃亡》(附完整源码)

  5. [Unity小项目]俄罗斯方块

    Unity实现俄罗斯方块 Demo: 使用方法: 安卓手机: 直接点击游戏界面按钮 Editor: 直接点击play 开发环境: Unity2018.1 部分实现介绍 UI界面使用的MVC架构 Vie ...

  6. java 小项目:简单扑克牌游戏

    项目要求 1>新建两个玩家 2>创建扑克牌,洗牌 3>发牌,每个玩家没人拿两张,比较大小 4>比较规则:两个玩家选出各种最大的牌,进行游戏,先比较点数大小,点数大的获胜,点数相 ...

  7. C语言小项目——井字棋游戏(升级版)

  8. [教程] 使用3D Infinite Runner Toolkit打造僵尸跑酷游戏

    使用3D Infinite Runner Toolkit打造僵尸跑酷游戏 3D Infinite Runner Toolkit是一款风格特异的3D版跑酷游戏开发包,其优点是容易使用与修改场景内的所有组 ...

  9. Unity小游戏-惊爆游戏(PC)3D联网大逃杀游戏 项目展示+完整项目源码

    游戏录像 游戏玩法 1.类似吃鸡的小游戏,但是这里没有毒圈,武器只有炸弹,没有枪. 2.游戏开始后所有人的体力会不断下降,当体力下降到0就会死亡. 3.玩家只有吃食物增加体力才能活下去,而食物只能通过 ...

最新文章

  1. QT系统性总结(推荐新手看)
  2. [转]jkeyll的安装步骤
  3. 比较OpenDDR和WURFL
  4. uva 11536——Smallest Sub-Array
  5. 你觉得我的这段Java代码还有优化的空间吗?
  6. Flink对比Spark以及流计算发展趋势分析
  7. azw3转换为pdf_怎么合并几个PDF为一个?快用这个PDF转换器!
  8. react 源码概览
  9. java 字符串 移位_算法学习之字符串左移和右移
  10. 浅析Mysql的隔离级别及MVCC
  11. 一款完整的多用户微信公众平台开发源码,带文档免费分享
  12. 论文阅读(4) 游泳水母对被动能量再捕获的广泛利用(2018)
  13. RTMP网页视频抓取
  14. C语言学习-翁凯(第四章笔记)
  15. SpringBoot_01_初窥门径
  16. 汽车加油问题 贪心算法 Java(详细注释)
  17. js前端导出Excel(可自定义文件名称,后缀,有边框样式)
  18. 04-MPI几个基本函数
  19. Win7中双击bat文件变成打开文本编辑器后如何恢复
  20. 华为 watch fit 鸿蒙,华为新款智能手表 Watch Fit 曝光,矩形表盘,支持近 100 种运动模式...

热门文章

  1. Shader山下(十七)语义Semantic
  2. 使用客户端等远程连接mysql数据库
  3. Linux 解压tar
  4. mysqlsql怎么比较当前月与去年的这个月的同比_【头条】11月CPI同比上涨4.5%,猪肉供应紧张状况有所缓解...
  5. 第十章 设计模式/垃圾回收/装饰器/闭包
  6. 计算机创新者印象(2):从罗伯茨到比尔.盖茨
  7. 想学尤克里里吗?新手如何挑选一把适合自己的尤克里里!
  8. 【AJAX】给你不一样的用户体验
  9. java 词根_英语词根与单词的说文解字---词根示例1、第10页 st(at)
  10. 切换鼠标左右按键引发的思考(批处理、VBS、DynamicWrapper)