一个属于左半红印的Avalon

Copyright @ 2008-2024
Powered by WordPress
Use theme BlackCooler
Created by Redonleft
鄂ICP备19016979号-1
川公网安备51011202000667
文章归档
理解Sawtooth Wave Node

这也是一个Shader Graph中的一个常用节点,例如当我需要一个不断重复的0到1,就会利用这个节点。但是网上对这个节点的介绍并不全面甚至有些是错误的,所以这里我梳理了一下这个几点的内容。首先还是先看源码

void Unity_SawtoothWave_float4(float4 In, out float4 Out)
{
    Out = 2 * (In - floor(0.5 + In));
}
  • 1
  • 2
  • 3

这个方法计算非常简单,我可以带入0.1,0.2,0.3等等,就能算出结果。所以从计算结果来看,首先需要确认的是,这节点的起始点是0。说准确点就是当输入是0的时候,输出也是0。然后随着输入增大开始变化,根据这个变化我可以画出这个图形

从这个图形可以看出,这个节点的幅度是(-1, 1)。所以如果我想要一个上面所说的(0, 1)就需要把这个节点的输出加1,再除以2。但这样的结果会导致起始点不是0。

另外还有一点非常重要,实际上这个节点永远也到不了1。所以上面所说的幅度其实并不准确,从图形中也很难看出。但只要我把数字带入上面的源代码中,就可以轻易发现问题。当我把0.5,1.5,2.5等等带入源代码中,可以轻易算出结果都是-1。而如果把0.49或者0.4999带入的话,结果会无限趋近于1但永远达不到。

左半红印创作于2024.05.20th
理解Tiling And Offset Node

在Unity中的Shader Graph中的一个常用节点Tiling And Offset Node,最常用的方法是把offset和time相连,这样就可以让图案运动起来。现在,要讲的是tiling和offset的关系。首先看一下源代码。

void Unity_TilingAndOffset_float(float2 UV, float2 Tiling, float2 Offset, out float2 Out)
{
    Out = UV * Tiling + Offset;
}
  • 1
  • 2
  • 3

让我们来快速理解这个公式。UV是变换前的坐标,Out是变换后的坐标。我用一个例子来帮助理解,我们在使用这个节点的时候通常会有一个期望,就是变换后的图案的中心点和材质的中心点重合,即图像不管是扩大还是缩小,都应该以中点为锚点。在这个需求下,上面的公式中UV=0.5,这是图案的中心。Out = 0.5,这是(缩放后)材质的中心点。于是我们得到了下面的推导公式

0.5 = 0.5 * Tiling + Offset
(1 - Tiling) / 2 = Offset
  • 1

可以简单验证,比如放大Tiling是(0.3, 1),此时的Offset = (0.35, 0)

缩小Tiling是(3, 1),此时的Offset = (-1, 0)

所以使用时,可以遵循上述逻辑。用对齐的方法,图案的坐标(UV)对齐材质的图标(Out),然后代入这个公式即可。

左半红印创作于2024.05.19th
关于FixedUpdate()的进一步理解

关于Unity中FixedUpdate()的意义已经在网络上有很多了,这里不再赘述那些,只是记录一下我对它的理解。

首先,关于FixedUpdate(),能不用就不用。因为它是一个固定帧率调用的方法,默认是50帧。它额外于Update方法独立运行,尤其对于配置较低的电脑来说,游戏的帧率可能都没有50帧,再额外来个50帧的负载,对性能会有影响。另外,Unity默认50帧,这个数字其实看起来怪怪的。我们都知道游戏的最低理想帧率是60,这个默认50帧的设定我想本来就是考虑到性能消耗的结果。

当然如果你在网上搜索,会搜到FixedUpdate()其实是用于物体运动控制的方法。因为Update会受到游戏运行帧率影响,调用有快有慢,所以用调用帧率相同的FixedUpdate()来处理就会防止物体运动速度随着帧率波动。这种说法是对的,但是在实际操作过程中又有问题。首先要明确的是这里指的物体移动是利用Rigidbody组件移动,当然,你会在网上搜到类似Unity中控制物体移动不推荐使用transform.Translate这样的内容。实际上这完全依据你的实际使用情况,没有什么推荐不推荐的。这里就说Rigidbody,控制其运动的方法在于给他的velocity变量赋值即可,赋值越大跑的越快。而只要velocity不是0,物体就不会停。所以首先不用在FixedUpdate()中赋值,同样也不用在FixedUpdate()中将其置0好让物体停下来。所以除非是精确控制,可以尽量不用FixedUpdate()。那么什么是精确控制呢?比如让物体从A点移动到B点,我们给在A点的物体的RigidBody一个朝向B点的velocity,现在物体开始动了。然后,问题是什么时候停下来,如何在程序中体现物体到达B点这个状态。这里我们要物体精确停留在B点,所以有个很容易想到的方法就是在物体运动的时候不断测量自己与B点的距离,如果距离非常小了就认为到了B点。那么这个测量距离的方法就要写在FixedUpdate()中。因为Rigidbody的运行方法是依照固定频率来的,即可以这么理解,它没写在FixedUpdate()中,但是也是在FixedUpdate()中更新自己的位置。所以在FixedUpdate()检测距离,其检测的频率刚好就和Rigidbody更新自己位置的频率一致,所以控制就很准确。

除此以外,就是配合TIme.timeScale使用。我们都知道一种情况就是,如果是游戏,那么当我呼出菜单或者其他情况下,游戏是会暂停的。那么这里就会利用timeScale来完成。但是问题是,我们这个时候并不希望程序这个时候真的全部暂停。很简单就能理解,呼出菜单后游戏暂停,但是菜单本身属于UI界面,我并不希望菜单本身也暂停。再比如游戏中有一些过场演出,在演出的同时,我需要游戏内物体停止运动,但是演出本身不能停止。这时timeScale的用处就体现出来了,它只会暂停FixedUpdate()的调用,而不会暂停Update()的调用(timeScale = 0时,Time.deltaTime = 0)。这就方便了我们编写内容。

那么问题来了,如果一定要在Update()中移动物体,又不想让物体移动速度受帧率影响该咋办呢。这里方法有很多,我们先说上文提到的transform.Translate。其实只要看一下官方文档就能明白。

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour
{
    void Update()
    {
        // Move the object forward along its z axis 1 unit/second.
        transform.Translate(Vector3.forward * Time.deltaTime);

        // Move the object upward in world space 1 unit/second.
        transform.Translate(Vector3.up * Time.deltaTime, Space.World);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

官方文档中给出了上面这个例子,上面已经注释的非常清楚,物体以1 unit/second的速度移动,这个速度是固定的。其实很好理解,每一帧有长有短,但其实无论长短多少,都会体现在Time.deltaTime中。它会随着帧率下降而增加,随着帧率上升而减小。那么1秒钟内,有多少帧就会有多少次deltaTime,每次的deltaTime都是距离上一帧的时间间隔,那么所有deltaTime加起来就还是1秒。

左半红印创作于2024.04.2nd
《沙丘 PART TWO》

电影看完了,拍的不错相当震撼。网上已经有了太多关于电影的解读,所以这里我就不班门弄斧了。关于第一步的感想以前也写过了。这里只是简单说一些细枝末节的地方。

首先电影PART TWO的剧情结束点也是小说第一部的结束点。所以如果你对这部科幻作品慕名而来但又不想看小说的话,看完这两部电影也就够了。实际上沙丘系列后面还有海量的内容,但就我个人来说不太喜欢。小说第一部已经是一部完整的王子复仇记,当然如果说沙丘就是一部科幻王子复仇记显然过于狭隘。下面我谈一下我的看法。

这部小说发行于1965年,必须承认沙丘是具有当年的局限性的,但这种局限性在现今看来也许还有好的地方。接下来我说的沙丘仅仅局限于系列的第一部。小说也好电影也好,剧情主线是一致的。主角无疑是一个名为保罗的家族少主,这里的家族相当于中国历史上春秋战国时期的诸侯。那么反方是谁呢?从电影第一部看是另一个敌对家族哈克南家族,到了第二部又似乎是后面才正式登场的帝国皇帝,还有一个从头到尾都全程谜语人的贝尼杰瑟里特姐妹会。这种多反派在电影中的表现并不好,会导致观众的迷糊。再加上主角保罗可以看见未来的描写,这加重了观众的理解门槛。我在以前的日志中就提到过,没事不要轻易用时间操控的方式来做故事叙述的方法,无论是遇见未来还是平行时空都非常容易造成阅读门槛。尽管原著中也是这样,但是显然即便搬到电影上,这种方法也表现的不好。

下面我来先说说反派们吧,剧情从始到终主角保罗的敌人其实是命运。按照小说中强烈的宿命论的特性,保罗一开始就在拒绝成为救世主,在遭受家族灭亡后也如此,其实他在反抗的就是自己命运。保罗是一个可以看到未来的主角,他在明知自己的命运的同时也在反抗它,但是显然反抗不了。于是后面保罗开始接受并利用命运。那么这里的命运具象化的表现出的敌人是谁呢?是的,无论是写小说还是拍电影都得有这么个具象化的反派,不让观众看什么呢。首先是帝国皇帝和哈克南家族的联手阴谋,阴谋的目的是消灭保罗所在的厄崔迪家族。阴谋的具体方法是传圣旨将香料星球厄拉科斯行星的管理权从哈克南家族转移到厄崔迪家族,作为地方诸侯的哈克南家族肯定不会放弃香料星球,于是势必会发生两个家族的战争。在战争中,皇帝在暗中派遣自己的军队帮助哈克南家族夺取战争的胜利并消灭厄崔迪家族。所以明面上,作为保罗的复仇对象,显然有两个对象,即哈克南家族和帝国皇帝。然而幕后还有两个势力,一个就是贝尼杰瑟里特姐妹会。这个姐妹会的势力在90代人类繁衍史上就已经开始渗透进宇宙的各个角落里,甚至包括厄拉科斯行星。弗雷曼人信仰中的救世主和圣母就是姐妹会的遗产。所以我们可以理解,姐妹会在各种政治平衡和势力平衡中始终是超然的存在。就像保罗的母亲是姐妹会成员,帝国皇帝的女儿也是姐妹会成员,从立场上讲无论谁胜利还是失败都无关姐妹会,她都会是胜利的一方。但是保罗的存在打破了姐妹会的计划。前面说了因为姐妹会的地位超然,那么姐妹会到底要什么呢?从剧情上讲似乎是打造一个完美的救世主来引领人类。其实不是,姐妹会的真正的目的是能够深度影响各方势力,她们一直也是这么做的。打造救世主只是一个幌子,打造一个受姐妹会控制的救世主才是真正目的。那么现在救世主有了,就是保罗,但是保罗不受姐妹会影响,于是姐妹会站在了保罗的对立面。剧情中的菲德罗萨哈克南,也可以是救世主或者说是未来救世主的父亲,而且受到姐妹会控制,所以姐妹会支持他。说到这里,电影中的全部反派都有了,希望能够帮助你理解剧情。

此外,还有一个小说中存在,但是在电影中着墨很少的势力,宇航公会和宇联公司。有些地方的解读说宇航公会的势力非常大,就连沙丘世界的纪元也是以公会为标准。但实际上我的理解这个势力是一个顽强中干的存在,表面上他们控制着整个宇宙航路,为所有可以在宇宙中航行的星舰提供导航。但说到底,他们只是一个没有武力的公会,他们需要各大家族供养,需要源源不断的香料。所以说到底他们只是一群有着独门绝活的人的群体,谁当权就依靠谁,谁当权就服务谁。而宇联公司本来就是各大家族共同管理的公司,用来分配宇航公会的服务。

左半红印创作于2024.03.26th
《圣兽之王》

香草社的新作,也许是上一作《士三机兵防卫圈》在去剧情上发力过猛,到了这一作,剧情反而成了最短的那块板。那么关于SPRG的玩法和图像,我有一些想说的内容。

我记得网上有个信息是说《圣兽之王》的开发时间远在《士三机兵防卫圈》的时候就开始了。我从游戏的核心玩法看来似乎是那么回事。两款游戏的战斗部分,都是类似RTS的玩法。区别与以往的SRPG走格子的方式,很显然实时RTS更符合市场潮流。话虽这么说,但其实所有人都知道,RTS的操作性在手柄输入端是有些问题的。往往的操作设定是,一个手柄摇杆控制屏幕中的虚拟鼠标,另一个手柄摇杆控制屏幕镜头。这种设计可以算是目前来看,鼠标最好的平替方案。但是问题在于一只手可以控制的鼠标在手柄上需要两只手才能完成相同的动作。而且感受很不好,比如框选单位。手柄可以利用摇杆下压并移动来完成,但是操作过的人都知道这么做很别扭。亦或者利用肩键或者扳机键配合摇杆完成,操作的结果依然是感觉很别扭的同时占用了更多的键位。这种别扭从文字上看起来似乎只是一个习惯与否的感觉,但实际上手柄控制无法实现精确控制是事实。所以在这两款游戏中,单位对虚拟鼠标的吸附效果显得尤其有用。除此以外,游戏还提供了列表选择的方式,方便玩家利用RTS操作以外的方式选择单位。

另外关于画面,香草社的2D作画几乎已经成为了日式游戏中的瑰宝。确实如此,游戏几乎在所有界面中都提供了制作精良2D资产尤其是在交代剧情的重要场合中,不仅角色和背景绘制非常出色,每个角色本身也制作了各种动作、待机等动画。可以说与场景背景配合的非常丝滑。这里我具体说一下,在其他的游戏中可能会存在这种情况,举个例子,在一个以森林为背景的场景中,有一棵树是可以与玩家互动的,或者这棵树一个具备独立动画的角色。那么这棵树的2D资产放在背景中,总会觉得两者在某些程度上不一致。当时《圣兽之王》的设计就非常平和毫无突兀的感觉。我个人觉得这可能是跟游戏背景的独特透视关系有关。从下图中可以看到,远处的景观并不是在一条直线上,而是一个向内弯曲的弧线上,这符合我们用全景镜头拍摄照片时的效果。这样在凸显近景同时,将近景角色放很大乃至占据半个屏幕也不会给人奇怪的感觉。

另外,还有光影的利用。我们都知道在2D游戏中的光照系统区别与我们传统认知中的3D光照,它在一定程度上是在模拟简单的3D光照。而香草社在这方面进行了额外的着力。通过下面这张图可以看出,整个场景有一半处于阴影中。于是位于左半边阴影中的角色的色调也是相对应的发暗。而右侧位于黄色阳光下的角色整体也会随之发黄。同时我们再注意最右侧的角色在阳光下具有轮廓非常清晰的影子,而左侧角色的影子都很模糊。再看场景中的两个火把,左侧处于阴影的火把将旁边的柱子照亮了。这些正确的光照处理方案让整个画面非常好看。

大地图是3D的,如果你仔细观察一下其实不难发现,游戏的大地图(同时也是战斗场景地图)其实是3D的。我想这么做的原因是为了增加地图的真实性。因为在3D视角下,镜头的运动其实和人眼的运作方式是类似的。他的一些自然物理特性可以帮助游戏提升真实性,这里所说的自然物理特性包括比如近大远小,还有物体之间线性的遮挡关系。虽然游戏中的镜头视角是锁死的,但是在玩家移动的过程中,这些自然物理特性还是在发挥作用。再加上特别绘制的2D素材,让整个场景看起来既是2D的,同时还具备合理的透视效果。

所以相较于前作《士三机兵防卫圈》,我感觉在2D画面处理上,《圣兽之王》的着力更多。也许这就是其在故事剧情上投入的资源较少的原因吧。

左半红印创作于2024.03.24th
《最终幻想7Rebirth》

FF现在给玩家的印象就是可长可短,可厚可薄。有可以像FF16这样,简简单单的讲一个简单的故事;就也有像FFERB这样,全程谜语人的讲一个讲不完的故事。想一下,按照这个速度,下一作FF7重制要做到PS6时代了。

让我先放下剧情问题后面说,我先聊一下游戏玩法本身。经历过早期电子游戏时代的人其实都知道,当年的JRPG,已FF为代表吧,世界观都非常大。动不动就是以整个星球为地图,以前后几万年的上古神话为故事背景。好像不这么做就体现不出来游戏的体量一样。所以到今天我们都可以看到,随便拿一个JRPG来看,大世界地图的存在都是必不可少的。游戏为了表现不同的地貌、种族,不同幻想中的文明,往往都需要玩家去经历各种风格迥异的地点。于是世界地图就成了一个非常好的载体,因为够大,就给予玩家一种畅游世界的感觉。然而以这种需求而建立起来的世界,相比于实际世界地图来看还是太小了。所以我们在早期的游戏中看到的世界地图通常会有一个特点就是非常空旷。当然了这种空旷会被大世界遇敌来填充,相当于变相延长游玩时间了。但这毕竟是枯燥的,时到现今,再做大世界地图遇敌这种就显得太过时了。于是,除了开放地图的玩法以外,大型箱庭地图的设计出现了。在旧时代一个大地图上的一个点可能是一座城市,玩家除了可以进入这座城市切换场景以外,都会在大地图上行动。到了现在,一个大型的箱庭野外场景会替代大地图。制作者会在这个野外场景中塞入各种事件点,比如讨伐怪兽啊,比如宝箱啊等等。再然后将它链接进城市场景。这就是现代JRPG的处理方式。于是我们在FF7RB中,玩到了4-5个(包括游戏后期出现的海洋地图)嗷嗷大的野外场景。这么做好不好呢?当然好了,一个充分设计的野外场景能够带给玩家足够多的乐趣。就像上面所说,这个足够大的场景内可以塞入各种玩法剧情,可以是一些小游戏,也可以是另一些直线剧情,这种做法的优秀代表就是巫师三。而FF7RB,至少可以看出正在努力达到这个目标。即充分利用上述这种场景,做巧妙的设计。

但他们做的并不十分出色。首先这里我想说的,游戏本身在上述目标上的尝试是值得鼓励且已经达到一定成功的,但是他们做的并不出彩。为什么这么说呢,我举个例子。游戏中关于巴雷特的剧情会使用到科雷陆沙漠中的一处地点,整个剧情演出,包括BOSS战都很不错。同样,在游戏早期,在格拉斯兰上方,一处废弃场地中涉及到了一个采花的直线剧情。这些都是好的,但是做的还是过于简单了。就像上面说的那个支线任务,玩家到了地点后也就是照着提示选了三朵花就结束了。偌大的场景利用率非常低。这就导致现在很多玩家在吐槽的地方,虽然那些任务不像通马桶了,但感觉还是通了。改变是有的,但是还需要改。

关于游戏中的小游戏先提一嘴,在原版FF7中就存在一些小游戏,这在当年是加分项。能用小游戏的方式体现一部分游戏内容,比单纯通过人物对话或者演出要高级很多,这毕竟是游戏。所以到现在FF7RB中的小游戏多到令人发指,我个人不想评论。

最后聊一下关于游戏剧情。早在FF7RM的结尾,我就猜到但又不愿意承认的就是野村丫要玩平行世界了。我本人在任何剧情包括影视、小说、漫画等,都非常不喜欢平行世界的设定。我认为这是剧情圆不下去了才会采用的手段。在平行世界的设定下,一切皆有可能。原本的剧情逻辑在平行世界的加持下,会令人困惑。再加上野村的讲故事的方法,大量谜语人,大量抽象剧情表现等等,也难怪会有很多玩家反馈游戏结局看不懂的情况发生。

左半红印创作于2024.03.21st
请留下您的足迹

你可以在这里对本站直接评论

也可以在任意日志文章内进行评论

如果你对本站的隐私保护有疑问,请参照上方“关于我”页面

左半红印创作于2008.11.21st

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注