【MonumentVally】纪念碑谷技术实现

是什么

《纪念碑谷》(Monument Valley) 是一款由Ustwo独立游戏工作室在2014年开发和发行的解谜游戏。在游戏中,玩家引导主人公“公主”艾达在错视和不可能的几何物体构成的迷宫中行走,达到每个关卡的目的地。依靠强大的视觉错位设计获得2014年苹果设计奖,并获得苹果2014年最佳iPad游戏的提名。下面将针对游戏中如何实现视觉错位进行剖析。

怎么做

彭罗斯三角

下图是纪念碑谷官方透露出来的一个设计图纸,我们发现里面大量的使用了彭罗斯三角)的各种变种。

下面我们来看个最终实现的gif效果图

我们打开对应的Unity工程发现其实旋转的几何体实际上并不是像你看到的那样在一条直线上,是有一个视觉错位的。如下图所示

新建一个Slot.cs脚本

using UnityEngine;public class Slot : MonoBehaviour
{public Cube cube;public Slot matched;void OnDrawGizmos(){if (matched == null) {Gizmos.color = Color.red;} else {Gizmos.color = Color.green;}Gizmos.matrix = transform.localToWorldMatrix;Gizmos.DrawCube (Vector3.zero, Vector3.one*0.1f);Gizmos.matrix = Matrix4x4.identity;}
}

我们在Cube的四个方向上面绘制可以行走的点(绿色)和不可行走的点(红色),后面会根据这些点来控制艾达的移动路径。

新建一个Cube.cs脚本

using UnityEngine;public class Cube : MonoBehaviour {public Slot[] slots = new Slot[4];void OnDrawGizmos()
{Gizmos.matrix = transform.localToWorldMatrix;Gizmos.color = Color.green;Gizmos.DrawSphere (Vector3.zero, 0.2f);Gizmos.matrix = Matrix4x4.identity;foreach (var s in slots){if (s.matched){Gizmos.DrawLine (s.transform.position, transform.position);}}
}
}

可行走的两个绿点通过直线连接起来,目的是便于在Scene场景下观察。

原理

当点击屏幕的时候,算出玩家选中的是哪个Cube,然后计算玩家当前的位置和目标Target之间的方向,通过一定的速度及时设置玩家坐标即可。

Update函数为

void Update (){if (player.path != null) {float d = player.walkSpeed * Time.deltaTime;Cube targetCube = player.path.First.Value;Vector3 target = player.path.First.Value.transform.position;float dist = Vector3.Distance (player.transform.position, target);if (dist < d) {player.transform.position = target;player.path.RemoveFirst ();if (player.path.Count == 0)player.path = null;player.current = targetCube;player.gameObject.transform.SetParent (player.current.transform);} else {Vector3 dir = Vector3.Normalize( target - player.transform.position );player.transform.position += dir * d;}}}

计算路径的代码如下

static LinkedList<Cube> FindPath(Cube source, Cube dest){if (source == dest) {return null;}var path = new LinkedList<Cube>();var nodes = new Dictionary<Cube, int>();nodes [source] = 0;var prev = new Dictionary<Cube, Cube> ();var todo = new LinkedList<Cube>();todo.AddLast (source);bool found = false;while (todo.Count > 0) {Cube cur = todo.First.Value;todo.RemoveFirst ();int distance = nodes [cur] + 1;foreach (var s in cur.slots) {if (s.matched) {Cube other = s.matched.cube;if (!nodes.ContainsKey (other)) {nodes [other] = distance;todo.AddLast (other);prev [other] = cur;}if (other == dest) {found = true;break;}}}if (found) {break;}}if (!found) {return null;}string path_str = "";Cube p = dest;while (p != source) {path_str += p.name + "<-";path.AddFirst (p);p = prev [p];}path_str += source.name;
//      Debug.Log (path_str);return path;}

项目的完整地址可参考yushroom大佬的Github(https://github.com/yushroom/MonumentVally-Demo)

【MonumentVally】纪念碑谷技术实现相关推荐

  1. 纪念碑谷背后的故事:不差钱!8人团队研发十月

    [摘要]ustwo的8人团队用了10个月的时间,研发出了<纪念碑谷>这款在iOS应用商店大热的小清新游戏.那么在这款游戏的背后,有着怎样的故事呢? 腾讯游戏 4月17日 杨亮编译 白豆整理 ...

  2. 从纪念碑谷的收益看小而美的游戏的盈利困境

    引文地址http://www.cocoachina.com/appstore/case/2014/0709/9074.html 原文如下 本文转自游戏小伙伴 "我们必须承认错过了赚钱的机会. ...

  3. 纪念碑谷复刻教程 - 基于Unity引擎

    目录 前言 视觉错位效果 寻路系统 PathNode Agent PathManager ClickEffect 旋转机关 Rotator RotatorActivator 工程链接 前言 之前一直很 ...

  4. 游戏场景设计干货:《纪念碑谷》潘洛斯视觉效果分析

    在我寻找自己感兴趣的项目时,偶然间看到了荷兰艺术家?MC.Escher?的等距视觉作品,虽然之前在朋友家看到过他的画,但是当时并没有意识到这些也都是他创作的,于是我决定尝试在 Blender 中实现一 ...

  5. 《纪念碑谷》是如何欺骗人们的视觉的?

    本人研究生程序猿一枚,毕设做的Unity游戏设计,最近刚刚玩通了<纪念碑谷>,被这款完美的作品震撼了.由于了解到<纪念碑谷>是用Unity进行开发的,本着个人兴趣和对这个游戏的 ...

  6. 游戏《纪念碑谷》介绍

    <纪念碑谷>及其续作<纪念碑谷2>分别于2014年和2017年由USTWO公司开发制作的解谜类手机游戏.玩家在游戏中,通过探索隐藏小路.发现视力错觉以及击败神秘的乌鸦人来帮助沉 ...

  7. 《纪念碑谷》美术风格制作

    经典独立游戏<纪念碑谷>艺术化的美术风格颇受赞誉,曾经获得过多项大奖.最近正好在玩,对于制作流程比较好奇,于是趁周末做了下研究. 跟我猜想的差不多,总的来说不算复杂.它属于LowPoly的 ...

  8. 最火手游《纪念碑谷》,设计灵感来自于他…… (转发自微信公众号文艺sao客)...

    原创 2015-12-07 Dionysus 文艺sao客 转发自:Dionysus 文艺sao客 这几天,朋友圈流行玩一个"纪念碑谷"的游戏,对,就是那个<纸牌屋>里 ...

  9. 「纪念碑谷」你不知道的 8 个故事

    2014 年最受好评的游戏「纪念碑谷」终于在豌豆荚「应用发布会」栏目发布官方正式 Android 版了.本次国内正版集合了原作和「被遗忘的海岸」资料片在内的全部 18 个关卡. 或许在此之前,你早已经 ...

最新文章

  1. Arista将Spine-Leaf路由/交换产品进行芯片升级
  2. NetDevOps — YANG 协议
  3. 卡扇区数据教程_硬盘有坏道了?如何对硬盘进行扇区级复制及数据恢复?
  4. 推自己的镜像到网易云
  5. Struts2请求处理的内部流程说明(版本一)
  6. 最大流问题 Edmonds-Karp算法
  7. Matlab Tricks(二十五) —— 二维图像的 shuffle
  8. Python文件中,reload(sys)找不到的问题
  9. 获取图像像素点的概率分布图
  10. Android优雅地判断软键盘弹出状态
  11. emouse思·睿—评论与观点整理之一
  12. Gof23设计模式速记(迷你图)
  13. RGB565常见颜色对照表
  14. 服务端安全之信息泄露
  15. 免费调用快递鸟物流跟踪轨迹订阅接口技术文档
  16. 如何将一个逻辑库下所有数据集的名称汇总生成新的数据集BY:crackman
  17. 基于photoswipe实现的vue图片预览组件vue-image-swipe
  18. 加工Altium Designer的PCB出现大部分丝印丢失
  19. 内网渗透中的域管与域控快速定位
  20. Web前端期末大作业-网上订餐系统网站设计模板(HTML+CSS+JS)

热门文章

  1. 超实用的10款研发工具,你知道几种呢?
  2. 二进制学习基础文章整理
  3. 错误C4996 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. 最高效解决办法!!
  4. 如何在工作中调整自己的心态
  5. iOS开发笔记--OC工程中调用不了Swift代码
  6. 产品外观设计有哪些表面处理工艺
  7. SHA256加密之显示明文密码的处理方法
  8. 智能软开关 配电网重构matlab 二阶锥 以33节点为研究对象,编制配电网故障重构模型
  9. python不允许使用关键字作为变量名、允许使用内置函数_【判断题】Python不允许使用关键字作为变量名,但是允许使用内置函数名作为变量名,不过这会改变函数名的含义,所以不建议这样做...
  10. 【oP07CP运放电路简记】