又過了一年
這篇的進度約略是從 12 月的第二週才開始的,開發進度有點少純屬正常現象。
11 月期間盡可能地去消化了一些囤積起來的遊戲,想說今年比較有花時間去碰遊戲已經是 1~2 月那時候的事了。
提 2 款最有印象而且遊戲體驗不錯的:
東方同人的魔塔類 RPG,還在 Demo 階段,預計明年上架。
說是東方的同人作品,但除了斯卡蕾特姊妹以外,其他角色跟劇情都是原創的,大概是我玩過東方含量最低的同人作了。
魔塔的討論度在臺灣可以說是幾乎不存在,畢竟魔塔圈子本來就小,百度魔塔吧最近回去看文章量也大不如前,自己體感現在也只能到 B 站還有 H5 魔塔會比較有活人了。
緋紅編年史 Demo 我初見是直接用災厄模式玩一遍(最高難度,禁止回到舊圖農資源),不少近年魔塔主流上會有的技能流派跟配裝機制都有。
遊戲體驗上,怪身上沒有顯示攻擊臨界還挺可惜的,開發團隊的解釋是由於在計算上較為複雜,數值上的變數較多所以不予顯示。
看完整版的預計規模,做為長篇魔塔,它在避免後期數值嚴重膨脹的處理上,做了不錯的應對方式。
就我曾玩過的其他長篇魔塔,像是正灌的《永不復還》或是一條池魚《宿命的終曲》,遊戲後面無論是玩家還是敵人的能力數值都是成億上兆的天文數字在跑。
原因就是魔塔類遊戲需要玩家在區域內獲取能力資源,在有限的選擇下,以較低戰損路線來擬訂策略,推圖進而拆塔。為了要讓玩家到新的區域後,讓敵人對於玩家產生更上一層數值壓倒性的輾壓,隨後如此反覆就產生了數值膨脹,也導致了後期在數值設計上可能會更加難以掌控。
緋紅編年史不同於傳統魔塔,把區域內獲得的能力數值都設計為臨時性的,僅作用於該區域中,只提供少量的永久能力值、金錢還有經驗值是能夠在不同區域間帶著走的。
這也包含魔塔中相當重要的機制之一:鑰匙
鑰匙是魔塔遊戲中選擇路線還有資源取捨的關鍵,把前一個區域積攢的鑰匙帶到新的區域來揮霍,在緋紅編年史裡是不存在的。
也就是說,每個區域都是一次新的開始,玩家可以在各個區域 Boss 戰前,能把手邊的資源給悉數用完,也就不用擔心前期資源沒帶到,導致後期直接卡關,全盤皆輸。
這或許間接地也提高了容錯率還有一定的重玩性,不意外是屆時上架第一時間就會買來玩的了,如果你也是魔塔類遊戲的愛好者的話,非常推薦可以嘗試看看它的 Demo。
一代經典 RPG《月藍傳奇》的重製版,有鑑於遊戲是跟天使蛋糕申請序號的,想說至少也得要今年內破完吧。
11 月遊戲時數最長的就屬它了,通關心得都打在 RPG Maker 板的集中串,雖然沒有主要劇情的雷,但還是有一些遊戲主要流程跟少許內容要素的提及,不介意的話再點來看吧。
比較可惜的是沒有二周目跟繼承的要素(但有作弊碼),當倉鼠型玩家囤了不少東西,打 Boss 都捨不得用,破關後只能拿來當觀賞物了。 除非預定追加的高難度地城 DLC 能把所持物品帶進去,那當然就另當別論。
未來有時間的話,找個機會可能會試著重玩一遍,但改成最低難度,然後把能幹走的東西都拿一拿,初見期間為了民望的關係,這個不能偷那個不能動的,玩起來挺窒息的。
不確定我這種玩 RPG 遊戲的偷竊習性哪來的,連我巴哈的職業可以看到也是盜賊,跟盜人講座或多或少有關係嗎…?
有生之年看能不能期待看看二代重製吧,當初二代是在一代破完後接著玩的,但時間上鄰近升學大考,不得已只能先擱置一旁,最後也就不了了之。
月藍系列的重心本身側重於劇情,月藍 RE 破完的當下我也很好奇二代會是怎麼發展的,假如等不到二代重製的話或許回去把二代給補完也不壞。
遊戲類的雜談就先這樣吧,將來如果有碰到什麼有趣的遊戲,會再放到日誌裡面提及,順便湊個字數讓篇幅好看一些。(不是)
專案現階段的開發進度是,針對 AI 敵人跨越不同平臺連續地形的移動行為。
為了避免遊戲中的敵人在移動期間,因為地形的中斷導致墜落或移動至未預期的位置,所以會在地形有一定程度的落差處,產生所謂的邊界牆(可以參考日誌 #11),使敵人維持在同一個連續性的地形之間。
之後製作的「連續地形標記」正是用以指示每個連續性地形的範圍,這種標記的功能可以延伸閱讀日誌 #28。
原先是打算在今年內完善敵人跨地形移動的,可惜實作期間才發現需要處理一些較為棘手的機制,待會馬上就會提及到。
假定普遍的 AI 敵人,均會受一般的自由落體影響,則敵人在有高度落差的地形間,主要移動的方式也很明顯,即為「跳躍」。
跳躍本身還好說,複雜的點在於,必須判定跳躍的路徑上是否會受到阻礙,總不能讓敵人在場上像無頭蒼蠅一樣在那邊示範撞牆吧。
直觀上來看,這個跳躍的軌跡所形成的即是拋物線。
然而,自己也是開始實作這個功能的時候才發現,Unity 本身沒有內建與拋物線關聯的功能(但有貝茲曲線相關的架構),無論計算還是繪製,看起來只能手動自己來。
◆【架構-拋物線】
拋物線的定義還有公式應該不需要額外提起,就算把學生時期學的給忘光了,上維基百科查一下也有需要的資訊。
為了要能夠因應此次角色跳躍路徑的判別,以及融入 Unity 本身的坐標系,我們製作拋物線的方向大概像是這個樣子:
角色跳躍期間,先假定起跳點 Start 與目標點 End 等高,且水平方向移動呈等速度。
時間關係上,起跳點 Start 時間計為 0,拋物線頂點 Vertex 為 0.5,目標點 End 為 1。
水平移動距離為寬度 Width,垂直最高點(即為頂點)為 Height。
綜上所得,我們將自訂一個拋物線的架構,並給定下列幾個參數:
有這些參數,在相關的屬性還有方法上,就能計算出拋物線的樣式、規格以及取點等功能。
比方說,我們想要輸入一個時間值 time 做為計算上的插值因子,獲取該時間在拋物線上的座標位置,它的方法大致上如下:
可以看到,這是基於拋物線公式轉換所得:
● 水平對稱
? y(t) = StartPoint.y + Height * t? x(t) = StartPoint.x + Width * (1 - t) * t * 4
● 垂直對稱
? x(t) = StartPoint.x + Width * t? y(t) = StartPoint.y + Height * (1 - t) * t * 4
截圖中的 AdjustedWidth 跟 AdjustedHeight 即是 ×4 過後的寬與高,如果你對拋物線還熟悉的話,應該會知道像是 y^2 = 4cx 這種形式的式子。
為了求輸入的寬高能夠直接性地反映 Unity 的座標系統,我們想要輸入 Width = 2; Height = 2; 的時候,拋物線能夠呈現寬高各佔 2 世界座標單位的樣子。
拿水平對稱的拋物線來說,假設直接把上面的值拿去套公式的 x, y 軸的話,繪製出來的拋物線會是長這樣的:
這也是需要 ×4 的緣由,否則對稱拋物線的另一軸向只會剩下四分之一的大小。
隨後就進而實裝需要的功能,包含但不限於:
● 根據平行於對稱方向的軸向值,獲取對應的另一軸向值;又或是根據垂直於對稱方向的軸向值,獲取對應的兩個可能的平行軸向值。當獲得對應的值之後,也能進一步轉換為座標,或是該點的時間位置。
● 根據拋物線上的點計算時間參數給定的座標點若不在拋物線所經的位置上,則會返回為無效值。然而浮點數會存在其不精確性,一般我們會給定容許值,如果偏差量在範圍內,則返回之。實現原理是(假設為水平對稱拋物線):先根據傳入座標值的 X 軸,推算拋物線在該 X 座標處需要的 Y 座標值。將它與傳入座標的 Y 座標值進行比對,如果它們的差值在設定的容許值內,則返回該處的時間參數。
● 判斷指定的點是否位於拋物線的開口內側或在拋物線上這與上一個方法的實現概念類似,只是從原本的判定差值是否於容許值內,改成目標值是否 ≥ 或 ≤ 期望值內。此方法對於後面一些較為進階的功能有相當大的功用。
● 動態生成拋物線上的一系列點分別指定起始與結束的時間位置,在該時間範圍內,從拋物線上取出複數個座標點來執行自訂的內容。取點密度高的情況下,也可以用來繪製更為平滑的拋物線。該功能即為 AI 角色用來判定跳躍軌跡上,是否會有地形阻礙移動過程的主要方法。
拋物線的基礎功能大致上就這些。然而,這些是建立在拋物線的寬高還有起始點皆為已知資訊的情況下。實際要進行地形狀況的判讀時,將會有可能缺乏部分資訊,甚至是需要加入額外的拋物線控制條件的場合。也因此,接下來要探討的兩個功能,方向將會集中在於反向推算出所我們需要的目標拋物線上。◆【經過指定座標的拋物線】試問:如果已經知道拋物線的起始座標點 StartPoint,寬高係數及頂點位置皆是未知,那繪製一個拋物線,經過指定點 TargetPoint,則將會有多少種可能?理論上這將會是無限種 ∞現在把這個概念應用到 AI 角色跳躍到指定位置上,角色跳起點為 StartPoint,指定位置即為 TargetPoint。然而,角色的垂直跳躍高度和水平移動速度將會是有限制的,這表示在跳躍軌跡上並不是無限可能。遊戲中,角色的水平移動速度是維持定值,也就是說,角色跳得越高,在水平方向的移動距離也就越遠。這麼一來,就能透過自由落體 h = 1/2gt^2 來推導跳躍高度與移動距離的關係了。※ 目前專案中的物理演算有經過調整,所以有使用額外的非線性轉換表。回到上面的問題,既然知道了要尋找的拋物線,其寬高會隨一定的比例縮放,這樣可能性就限縮到了相當小的範圍了。(這個範圍將視誤差的容許值而定)於設計走向上,我們將與拋物線對稱方向垂直的軸向稱為「基準軸」(水平對稱的拋物線即為垂直高度軸),反之與其平行的稱為「乘算軸」。方法內,我們將給定基準軸的允許最大值,預設為遊戲中角色的最高跳躍力值,設為 20。這個數值已經可以從畫面底部跳到高過整個遊戲畫面了。然後,根據調整基準軸的值來進行迭代,生成大小不等的拋物線,來逐步進行比對。這邊就用上了我們前面製作的功能,判定目標點是否於拋物線的開口內側:而這個基準軸值的迭代處理,想必不是從最小值逐步遍歷到最大值。我們可以模擬類似於二分搜尋的演算法,每次迭代都把處理範圍進行折半,讓調整基準值的過程中,使拋物線逐步逼近我們所設的目標點。迭代的次數會受到容許值的大小,以及處理範圍偏差允許值來決定。就現在的設置來說,比較極端的場合最多也只需要 20 次上下的迭代而已,且該結果都會進行額外的暫存。如果有必要的場合,像是針對地形會有頻繁移動的狀況,僅讓特定的敵人 AI 常駐即時運算在效能上應該也是可以接受的。當能夠獲取兩點間的拋物線後,就能得知 AI 角色跳到指定地點所需的跳躍力,還有移動速度了。最後則是對該拋物線上進行碰撞體的判定,確認不會受到其他地形的阻礙,再進而實行跳躍這個行為:然而,這個生成拋物線的方法,比較適合的作用目標是跳上單向平臺地形時使用,因為該地形可以由下往上穿越。但如果目標的地形是實心地形,這代表根據拋物線往上跳的時候,會受到目標地形的阻擋,故我們需要另一種拋物線生成方法來應對。◆【“拐杖型”拋物線】這是一種存在抽象概念上的拋物線,建立於角色貼牆跳躍時,垂直速度不會被其影響作為前提。拐杖型拋物線一詞,指的是當基準軸判定值未達到高度點處時(該高度點亦為目標點的對稱點),將它的乘算軸值無視。當到達對稱點時,與目標點的中心乘算軸處將構成拋物線頂點,並繼續延伸為一拋物線。由於此方法主要用於 AI 角色貼牆並跳上牆上特定目標點,貼牆時乘算軸的座標會維持不變,整體的移動軌跡會像是拐杖般,故稱為拐杖型拋物線。Δ 角色的移動軌跡呈拐杖般的樣貌由於角色在高度點處時,其加速度並非為零,故我們直接生成拐杖上半弧狀處的拋物線的話,可能會增加計算上的困難。但我們已經確定了高度點還有目標點,也知道了拋物線會經過它們,這麼一來就可以推算出頂點的 X 座標處,根據這個頂點,反推出我們需要的拋物線。而「拐杖」的底部 Y 軸,這相當於角色起跳的位置,也就是拋物線起始座標 StartPoint 的 Y 座標,這也是後面拋物線的限制條件之一。也就是說,我們的目標即為尋找這個除了寬高大小不被確定,連起始座標 StartPoint 的 X 軸也是未知數的拋物線。所幸的是,有了前面生成經過指定座標拋物線的概念,配合上頂點的 X 座標已經確定的條件,還是能夠透過迭代基準軸的值來尋找目標拋物線:由於高度點跟目標點呈對稱關係,故只要判定其中一個點是否被拋物線所經過,即表示該拋物線即為我們所要尋找的。找到拋物線後,同樣對移動路徑進行碰撞體的判定,這與上一個方法後面所提及的功能是一樣的。Δ 拋物線在高度到達地形上方之前,水平軸位置會被目標地形所限制,模擬貼牆跳躍的路徑。AI 角色在不同平臺之間移動最複雜的部分應該就屬這些了,總算知道為什麼有幾款玩過的橫向平臺類的遊戲,敵人在追擊玩家時不是突然瞬間移動,就是無視地形直接穿過來。看起來不外乎就是運算上的效能考量,或是嫌麻煩乾脆就用其他替代方案來應對。自己是認為如果敵人會在平臺之間跳躍,也替玩家提供了一定的優勢,能夠預測敵人跳躍的時機對它來個出其不意的攻擊。所以一些比較強的菁英怪或是 Boss,應該還是會讓它們採用瞬間移動的方式,至少這個實裝起來會比去計算拋物線還要簡單上個好幾倍。先說一下,這是個人的體驗,可以當作參考聽聽就好。如果你也打算開發有橫向平臺要素的遊戲,或是還在開發初期的階段,條件允許且有需要的情況下,我會建議把這類跟物理演算或是尋路系統有關的用插件來先行補足。自己是因為平臺地形相關的功能已經寫了大半,再買新的插件除了需要額外的學習成本,還有可能會和已有的機制產生不兼容的狀況,所以才作罷。使用插件的重點當然是能夠節省大量的時間成本,不用在前人已經走過的路上再折騰一遍。當然,除非是想在這塊的功能上從中學習汲取經驗,去享受那個過程。又或是有高度的自訂需求的話,那就是另當別論囉。以上是我試驗拋物線機制這段期間的心得,挺希望能有辦法給數年前的自己看看的。接下來的進度就是補上 AI 角色跳下平臺的判定行為,以及讓敵人能夠掌控場景內連續地形的位置關係,從而嘗試尋找最佳路徑,在地形之間穿梭。預計應該是不會再碰上比拋物線還難搞的東西了啦??先預祝大家新年快樂這個 2024 自己是一刻也待不下去了,我現在只想看母雞卡。