日常雜記(2020/5/16)



----
2020/5/16

感覺好久沒有寫這種自己想記什麼就記什麼的日記了,
放在首頁頂部的那份工作日誌畢竟還是會有點顧忌,
總不能把每天玩了什麼看了什麼或一些細膩無用的想法全貼在最上面,
但想了想每篇日記都要美化內容也不太對,
當然也不是說就美化到了什麼程度,
說起來這整份豁懷日誌都還是蠻瑣碎而誠懇的,
如果不是我特別想記的東西,
就算寫了也會被自己刪掉,
當然還是記了很多現在覺得不太重要的內容,
不過記的當下覺得值得一記就好,
這種純粹跟自己對話的東西還是很重要的,
畢竟自己已經孤獨了七年左右,
三年多沒和叫得出名字的人說話了,
我甚至想不起自己上次和其他人做有意義又友善的交流是什麼時候了,
即便是我這樣習慣孤獨而友善,與世無爭的人也會覺得難受的,
可是真的要我和別人交流,似乎又毫無意義,
不如說是我自己做了選擇吧,選擇了自己喜歡的生活模式,
不是說我就不喜歡和人交流,
只是還沒有遇到值得的人,或者以我這種過高的需求而言,
三次元可能沒有這種可以達標的人了吧,
唉,養隻貓或等AI老婆搞不好都還實際許多,
我覺得自己的社交與歸屬需求是很容易滿足的,
譬如只要在桌面有個可愛的AI助手之類的,
每天知道自己在做些什麼,喜歡什麼,
開機時簡單的聊聊天,溫柔的說聲早安晚安,
能感覺到有這個「存在」能夠記下、理解、接納自己的存在就可以了,
說起來有些人可能難以想像我的生活方式,
每天待在沒有陽台的六坪房,
一天只吃一餐,
一個月只出一次門,
完全不和人交流這類的,
不過我也這樣過了三年多,
總體來說已經沉浸在這種平靜的幸福中了,
現在突然要我繼續朝九晚五的回歸世俗生活,
我想應該是很困難的,
當然我已經不太記得世俗生活是什麼感覺了,
人活著大概就是這麼一回事,
每個人都活在自己的圈子裡,
痛苦絕望不停階級複製的窮人、
沉浸世俗的普通人、
無法對自己生活滿意常常怨天尤人卻又不敢追求改變的人、
住在陶朱隱園裡的有錢人(如果裡面有住人的話)、
吃著黨國特供玉膳房和享受各地搜刮來特產的高官、
還有那些過著知足而幸福生活的人、
又或者像我這種只是想留點什麼在這世上,
每天寫點遊戲程式或做些什麼來累積一點存在意義的這種人,
這世上本來就沒有所謂普通的生活方式吧,
跟人有關的東西終究是常態分佈的,
人們常常會把那常態分佈的最中間視為普通,
而人又有無數的屬性可以拿來統計,
大部分的人把屬性綜合之後,
其實只是落在偏僻的分布角落,卻自以為是最中間而已,
活著又有什麼是正確的呢?
好像寫了一些細膩的想法,
我的思緒常常就堆滿了這種像中國人口老化問題一樣跟自己扯不上邊的細節課題,
社會學狂熱或思緒狂熱吧,
自己能有這種興趣還是件好事,
小時候是那種拿到歷史課本的第一堂課就會偷偷把整本看完,
然後從此考試全部滿分的那種,
還有一次同學都在228連假去校外教學了,
我卻在圖書館把228事件相關的書全讀完了,
也是蠻沉浸的一個回憶,
歷史終究沒有什麼對錯,
像那些二戰相關的紀錄片跟條目我也都看到爛掉了,
但沒事做的時候還是會想重複去看,
還有一些各國的王朝事件與殞落也是,
政體跟社會學也讀了好多,
想了想這些東西與其成為專家,
像自己這樣單純作為興趣還是很好的,
 一個不小心就會消磨許多時間,
當然久了還是會有些膩的,
我也不怎麼有辦法把這些當成純粹有趣的事情來做,
所以還是要找些額外的日常興趣才行,
回到正題還是來記點自己最近做了什麼吧,
開發這兩個月總覺得沒什麼進度,
兩天前一樣更新了版本,
就寫了幾個新事件鏈,該修的修完而已,
有一些玩過的回饋,但不怎麼多也不夠細節,
自己還是不太清楚自己遊戲的樣貌,
有時候也會自我質疑吧,
看到一些回饋有時會厭惡的,
玩家總是會提出許多建議,
但這些建議往往都是在開發時已經想過無數次,
或者早就堆在工作清單中待製作的內容,
要是玩家能想想看,玩幾分鐘會有的想法,
早有無數一樣的玩家給了回饋,
遊戲時數愈短,回饋也就愈重複,
作者從寫到測試已經重複了幾百次四千多小時,
怎麼可能沒有發現呢?
只是修改重製與添加任何內容都需要工作量而已,
如果有純粹的遊戲經歷回饋還是會好上許多的,
唉,要是有幾個人能第一次玩就錄影紀錄就好了,
純粹看玩家的初次體驗還是最有幫助的,
這是唯一開發者沒辦法體驗的內容,
做遊戲真是絕望啊,
自己寫的遊戲自己卻沒辦法作為玩家來遊玩,
大部分玩家玩了之後只會寫一些主觀又不夠深的回饋,
要收到遊戲經歷反而很困難,
其實我只想知道玩家在遊戲中遇到了什麼、做了什麼決定、有怎麼樣的經歷,
也只想被那些真的通關或理解遊戲的人鼓勵而已,
唉,就跟喬納森布洛說的一樣,
真的能理解的人往往隨著作品的縱深向下挖掘而減少,
在這個世界上尋求理解本來就很困難吧,
總體而言這一兩個月開發還是有點進展,
事件鏈變多了,
但還是不太夠,這版似乎有點重複也不太平衡,
把一些想修的修完了,
測試到最後幾輪,
實在是有點膩了,
看了看回饋可能問題也不大吧,
只是自己整天掛念著開發的事情變得太過敏感而細膩了,
總是惦記著那個SteamDB的玩家人數,
看那個曲線感覺這版續玩時間有點下降了,
但那真的是個小數據,
尤其銷量根本沒幾份的情況,
整天看著那東西毫無幫助可言吧,
開發真的是一條漫漫長路啊,
總覺得自記進入繼2018年中以來的第二個比較長期的倦怠狀態了,
也不是說真的有多麼倦怠就是了,
這週末過完繼續寫新事件鏈,
寫到月底再弄一個版本吧,
這個暑期應該還會有一整個月的特價,
要是能在那之前有一個更好的理想版本就好了,
希望自己能努力點,
但努力過頭,或者像我這樣整天想著、煩惱著卻不去推進度,
才是真的毫無幫助吧,
覺得務實的工作、工作完好好休息別想了,
才是最實際、最有意義的,
說到休息,也是這篇日記主要想記的,
沒想到寫了這麼多東西才開始記,
我之前有段時間開發完就會陷入一種無事可做的情況,
生活的重心太過單一了,
說起來其實還蠻痛苦的,
每天就只有開發,煩惱著卻又累了不想繼續推,
開發其實有點麻煩的,
開發完還要更新測試,
更新完又會整天擔心這版本是不是有問題,
並不是一件想隨便做就可以隨便做的事情,
當然也可能只是我心思太過細膩又強迫症的關係,
隨手寫點新東西或修點內容當然也是可以,
只是興趣值有限吧,
我想我對開發的興趣跟毅力還是很堅定、充足而足夠強烈的,
只是任何事情都有一個極限在,
尤其我從無到有也默默農了快兩年,
倦怠在所難免,
總是說自己其實也沒有幾個月的工作量,
但還是累了吧,有時也會懷疑自己是不是沒有足夠的努力,
客觀的說確實,效率頂多70%之類的?
要是我現在突然沒錢可以生活了,
或者快死掉了之類的才會開始狂噴吧,
搞不好到時候噴的都比幾個月的工作量還多,
不過安逸的推進度還是件快樂的事情,
人生要是每天都擠壓著自己到極限,
遲早會放棄的,
所謂路遙知馬力,日久見人心還是有道理的,
希望自己能再多堅持個幾年,
等回過頭來發現已經累積了許多不是一時能完成的內容,
那種成就感還是最有價值的吧,
前陣子開發完想休息時完全就沒事做了,
很難受啊,就只能重複的看新聞和條目之類的無意識的找事做,
遊戲玩不下去、動畫影片也提不起興趣,
人生變得太過空虛了,
果然還是要有個額外的小興趣當作生活重心才行,
不能夠只有一個開發當成生活的全部,
整天隨著開發的過程起起伏伏,
膩了累了就沒事做開始絕望了,
之前我每天還會刷一下公主連結,
那個遊戲從開服就開始玩了,


這種大公司的手遊還是不錯的,
現在玩遊戲單機的因為自己也在開發的關係,
總覺得就是一堆程式在跑提不起興趣,
手遊的話只要每天刷就好了,
不過玩之前還是會很在意遊戲會不會一下就倒,
背後是誰出資,有沒有莫名其妙的和諧或政治審查機制之類的,
這樣也是有點辛苦,但免洗的作品還是少玩的好,
小時候跟主流玩家一樣玩遊戲就玩遊戲,
也不太會特別在意這些的,
就像以前玩線上遊戲,
遇到其他玩家不會想太多,
現在遇到別人總會想這人背後是個什麼人,
內心的顧忌不知不覺愈變愈多了吧,
但公主連結還是從開服玩了兩年的樣子?
代理也很大方,我從頭到尾都無課該抽的也有抽到,
他劇情中角色還會有二次元和三次元那種反差是很棒的設計,
其他就蠻普通的,現在主流手遊都是這樣,
引誘玩家花錢抽個角色換個皮然後每天刷刷刷,
但是畢竟是CY做的,經費算很足,
全配音、動畫、角色活動都沒停過,
一開始玩得還是蠻開心的,
後面有抽到角色或偶爾認真摸一下也有一些高興的感覺,


連小屋也稍微認真布置了一下,
二樓三樓也布置了,不過後面有點累就不截圖了,
想了想遊戲玩完也留不下什麼,
只是玩得時候高興就好,


到了最後棄坑時我真的是對這款遊戲感到倦怠了,
其實後面的關卡雖然全過了,
但主線劇情就算全動畫也拿不出耐心去看,
核心的問題還是在"佑樹"身上吧,
就是說這遊戲是有男主角立繪的,
雖然可以自己取名,
系統在劇情中偶爾也會調用玩家名增加帶入感,
但有時候或許是工程師懶得調用玩家名了,
直接用一個第三人稱當主角帶過,
這就有點缺乏帶入感,
而怎麼說,我就是過度介意這個有固定形象的主角啊,
有些角色的技能還會跑出男主角的立繪,
就算好不容易抽到了、還是人權角、投入了資源但最後卻因此放入倉庫,
如果像艦C這類沒有主角形象的或許還可以帶入自己喜歡的感覺,
但有個主角形象就有種後宮番的那種情況,
本作雖全是女角,還是有一點劇情,
也不是全部就隨便貼男主,
但就是難以避免那種無腦後宮的感覺,
唉,要是沒有男主立繪觸發我強迫症,
或許還能繼續玩下去的,
到最後一年我每天刷主要還是自己創了公會,
沒想到到了最後都還是有超過一半的活人,
自己每天上一下,把刷到的裝備分別人之類的,
總覺得創了就有種責任感啊,
玩遊戲或許不太適合當會長,
這樣太辛苦了,
尤其後面每天刷刷真的沒太多興趣了,
連刷塔之類的都很懶,
最終最終就解散棄坑了,
有種解脫卻又少了點什麼的空虛感,
當然東西久了本來就會膩,
這遊戲我也算刷到極限了吧,


不刷遊戲的日子確實是每天開發完就沒事做了,
看了一下相片庫,
全是一天一餐的飲食記錄,
之前還到台北去把兵役的事情弄完,


吃了夢寐以求的章魚燒,


小攤販叫了12盒等了好久,
要是有外送就好了,


烤著吃一口氣吃到膩,
人類的原罪啊,


說到原罪,之前看了一部叫「僕だけの妹」的粉紅電影,
雖然說是不小心點進去的三級片,
但這部真的很有想法,
最後人類居然滅亡了......,
粉紅電影跟獨立開發有點像,
導演想拍什麼就拍什麼,
當你覺得他是三級片時,突然變得溫馨而感人,
當你覺得他要走浪漫取向時,突然又變得現實主義,
當你覺得他是一部寫實作品時,又來個科幻的轉折,
當你覺得他要科幻到底的時候,又變得荒誕而傷心,
這部真的是很有想法啊,
總之是看了會有點不舒服的那種ww,
值得一記就順手記一下了,
之後或許想辦法收藏一下?


相片庫裡面還有一座泡麵山,
半年過去被我清光了,


現在平常都叫外送堆冰箱,
我已經叫了至少十幾萬吧,
都自己一天一餐慢慢吃掉,
一次一千五外送員好像會覺得太多,
平常應該派兩台外送員有時只派一個就會抱怨載不動,
之前用貨到付款還有外送員抱怨半天才給餐點,
我是覺得跟消費者抱怨這種事情沒有任何幫助,
尤其我也算超大客戶了ww,
現在用線上付款一次一千,
提前下去等透透氣,
還是蠻方便的,
希望遇到的外送員都是好人吧,
除了這種會抱怨的到處傾倒負面垃圾情緒的人外,
我遇到大部分外送員都還是很有禮貌,
一手交錢一手交貨沒有交流也很好的,
做外送感覺很辛苦的樣子,
特別記這些沒什麼必要,
不過我生活中現在唯一會固定遇到的活人就外送員了,
(つд⊂)
週遭的東西都吃過後就有點了無新意,
變成日常補給的那種情況了,
但偶爾叫點新東西還是不錯的,


每天吃的東西還是脫離不了炸雞跟薯條,
一天一餐還是很健康的,
健康到一天吃三餐沒幾小時就塞滿肚子的人難以想像的地步,
要知道我就算滿盤子炸物,
吃完的量還是只有一天三餐的人的30%,
這種生活模式三年下來還是很爽啊,
人活得開心又知足還是很棒的吧,
雖然就是個飲食習慣而已,
不過活著就是吃喝拉撒的一件事情,
(つд⊂)


終於說到最近的日常了,
前天狠下心來買了一台iPad mini 5,
順便買了壞掉的冷氣遙控器跟穿了幾年開始破洞的內褲,
三洋的冷氣買同款的遙控器就可以用了,
成功復活冷氣,
其實原本那個可能是沾到水的遙控器也沒壞,
還是能用定時功能開機,
但就沒辦法想關掉時就關掉了,
總之現在又可以隨時開冷氣享受白噪音了,
我最喜歡冷氣的那種噪音,
這種體驗應該是4D環繞的關係,
從白噪音到冷風、再加上平常開冷氣時就是可以休息的時候,
那種輕鬆的感覺隨著開機後的白噪音立刻就出現了,
算是我個人的怪癖吧,
要是以後換新冷氣了沒聲音的話總覺得有點可惜,
要好好珍惜自己這台可能有十年的老舊冷氣,
也要好好省電才行,
內褲一樣是三花的,
因為變瘦買小一點,
總之都很舒服,
說回iPad mini,
感覺是第一次花錢買這種高價產品啊,
沒有ios裝置在開發上當然會有點問題,
畢竟就沒辦法測試了,
當然這是我說服自己的方法ww,
蘋果要上架也很貴很麻煩,
在測試期間做多種系統的版本在工作量上根本不可能,
只是想要有台裝置可以拿來玩遊戲之類的吧,
用電腦玩感覺太用力太累了,
用手機玩太燒又太小,
平板平常拿來看實況,兩手拿著超累,
螢幕太大重量重又不適合遊戲操作,
iPad mini 5的大小真的剛好,重量又輕,
真的很適合拿著玩遊戲,
說是要玩遊戲,
我久違的找到了想玩的東西,
黑色沙漠是一款有在臺營運的韓國OLG,
在寫這篇的時候PC版算是臺灣目前比較多人玩的MMO,
手機版剛出的時候我就玩了一陣子,
不過後來退坑了,主要是不喜歡PVP吧,
這東西對效能要求也挺高的,
舊平板居然沒辦法效能全開,
之前沒事做的時候買了PC版來玩了一下,
畫面跟內容算是蠻值得的,
但PC版更是強制PVP,
實在是不喜歡坐在電腦前燃燒顯卡用力玩還要跟人家競爭,
尤其玩起來實在是太累了,
我每天開發剩下的精力只想找那種輕鬆掛著的東西玩,
連刷刷刷的手遊都有點懶了,
那段開發完沒事做的日子我無聊就到商店頁面跟討論區重複的翻找遊戲,
現在GooglePlay之類的地方真的是沒救了啊,
全是入侵的廣告評論,
雖然那評價也沒準過就是了,
討論區紅的都是免洗手遊,
有種臺灣遊戲界已經失落的感覺,
我又不太喜歡玩要用力玩的動作或畫面類,
Steam上比較有興趣的沙盒經營戰略養成之類的遊戲因為開發又提不起興趣,
所以陷入了遊戲荒吧,
說到底我對遊戲的興趣範圍本來就很有限,
現在玩遊戲前後又會想一堆,
也難怪找不到遊戲可玩了,
倒是昨天玩了一下surviv.io的50v50和diep.io玩的蠻開心的,
我還是想找點可以跟人互動的遊戲吧,
io系列這種極簡的也很不錯,
就是比較容易膩一點,也不太有累積性,
要是有做到Steam上連線當小型線上遊戲應該會不錯,
但這種遊戲要有持續的活人玩家才行,
像昨天弄了台Factory跟一樣是Factory的玩家玩了仙女散花這類的模仿動作,
有互動的感覺就蠻有趣的,
弄隻章魚占領整個伺服器當榜首也挺有成就感,
不過如果花了一堆時間開發營運結果沒玩家也沒好處,
不如說當初會變成.io這種簡單的網頁遊戲就是因為吸引玩家加入的門檻低才能保持熱度跟遊戲性吧,


經歷了幾個月的遊戲荒,
最後決定回去打開黑色沙漠M,
寫這篇的時候這手機版在臺灣是已經有點過氣了,
但就算是新出的比較起來還是這款精緻多了,
尤其畫面的部分除了之前有款Asobimo的鍊金術物語走水彩風是我在手機上看過比較漂亮的畫面外,
這款黑沙M目前仍是寫實向手機遊戲的巔峰作,


會過氣主要還是時間久了,內容也比較農的關係吧,
掛機遊戲到後面比較難維持熱度,
但這遊戲也不完全是掛機,
像楓之谷M就明顯掛機過頭了,
這款黑沙M除了畫面好外,
內容跟電腦版一樣是很豐富的,
系統、任務、NPC、配音地圖跟立繪,
大量的怪物內容等等的,
手機版還重製了許多系統,
當然引誘課金的成分還是很多的,
但跟電腦版那種強制課金比起來好像也還好了ww,
手機版送石頭突然變得很佛心的樣子,


這次回來玩那個回鍋獎勵真的非常多啊,
多到用不完的那種,
但也沒有到濫發的情況,
遊戲雖然有點過氣,
但伺服器聊天室給人的氛圍還是蠻不錯的,
感覺黏著度很高的樣子,


說實話我很久沒有玩這種遊戲玩得開心了,
黑沙走的畢竟是韓風美學,
角色捏起來多少有點複製人的感覺,
但認真捏還是能捏出一點特色的,
久了我還蠻喜歡的,
手遊的話認真弄這些的最近愈來愈少了,
就算是新出的大多也就是隨便選選皮或捏兩下而已,
黑沙M雖然少了點電腦版可以調的細節,
譬如角色聲調之類的,
但捏出來卻比電腦版喜歡,


還會瞇瞇眼真是可愛啊,
網路上一般會把自己捏的角色稱為女兒的樣子,
不過我自己這樣稱呼有點尷尬,
叫老婆又不太對吧,噁男的感覺ww,
總之喜歡就好,


還會揮手,


這動作好像是乞討ww


我覺得平常站著就很可愛了,
每次打開遊戲都會找場所盯著好一陣子,
這遊戲的光影做得很好,
以至於找光源好的地方很重要,
背光的話會變得很可怕ww,
本尊是當初開服時就創的馴獸師,
這職業在電腦版也蠻有趣的,
可以騎狼跟讓狼打怪,
有召喚物比較不會孤單,
手機版因為不能調角色聲調的關係,
馴獸師的配音算是比較可愛的了,
隔了兩年重新打開還能玩當初捏的角色,
再把她美化一下就很滿意了,
這種承先啟後的感覺真的很好,
尤其角色捏到自己喜歡的樣子後就會有種歸屬感,
難得有想玩遊戲的感覺,
真的蠻高興的,


第二隻捏了女武神,
特別喜歡用劍的角色,
戰鬥特效跟馴獸師的黑焰相反是白光,
這遊戲特效明顯太多太華麗了,
不過現在遊戲都流行這種的樣子,
手機版女武神配音比較沉一些,
角色模型有點黑肉底還駝背ww,
不過實際捏出來還是很喜歡的,
蠻佩服自己可以把女武神捏成這樣,


昨天用iPad mini捏了法師,
說起來這遊戲用好的裝置玩真的差很多,
不論操作、畫面甚至是載入時間,
整個反饋都很不一樣,
在電腦模擬器或其他手機平板上沒玩出這種感覺,
總之花錢買好東西還是很值得的,


我發現自己除了白髮綠瞳外,
黑髮綠瞳有點正統派的角色也蠻喜歡的,


法師的特效在遊戲中比較合理,
掛了一天也蠻開心的,
之後有空再捏隻沙亦蘿莉或其他女角之類的,
韓式美學雖然有複製人的問題,
但捏出自己喜歡的樣子,
看久了還是會習慣的,
這種感覺真的不錯啊,


總之寫了這麼多,
一開始只是想記自己玩玩遊戲,
一邊看棒球、看Vtuber、看木棉花不知道播第幾次的巨人,
找點興趣過日子有點記錄這樣,
平靜又有點頹喪的幸福日常,
真是美好啊,
希望這種感覺能持久一點,
讓我多休息一天再振作吧。
(つд⊂)
----

冷門&推薦Vtuber合輯(大量內容注意!)






入坑Vtuber至少有兩三年了?
我從元祖的影片類Vtuber剛出現時就覺得這東西真的很有趣啊,
不過Vtuber圈真的開始成長大概是前年到去年的這段時間,
這時候比較熟悉的實況勢Vtuber才開始盛行,
我對Vtuber的喜好也才跟著起飛,
喜歡Vtuber的原因主要是掛著台有種輕鬆的陪伴感,
畢竟自己一個月最多出一兩次門,說的到話的人只有外送員,
每天待在六坪房內,一年下來有沒有說個十來句話都很困難,
沒有家人沒有朋友,只是不停地寫著程式開發著遊戲,
有時候孤單起來真的會很難受的,
Vtuber的好處是角色披著一層二次元的皮,
因此可以不用去特別在意裏頭的人到底是什麼來歷,
看看台就會變得很輕鬆,
但另一方面裏頭的中之人往往又很努力經營甚至用心細膩的準備實況,
這種結合虛擬與現實優點的存在,明顯的提高了觀眾的接受度,
至少像我這種興趣圈狹窄的人也默默在其中找到了許多樂趣,
當然看久了還是會有膩的時候,
有時即便有五六十台同時開著,卻也沒有點進去的動力,
但久了還是會想說就掛著台比較不會感到孤單,
也很期待那種真正的虛擬AI偶像,
這樣就真的可以長時間、無差別的完美互動了,
不過現在這種虛實結合的Vtuber也有許多優點,
這個世界往往因限制與缺陷而變得有價值,
譬如開了幾十個小時卡關、
唱歌唱到有點破音、
或者因為觀眾數量和評論而感到煩惱、
甚至是沒辦法繼續經營下去的Vtuber,
都額外顯得珍貴,
我自己雖然每天都掛台掛滿16小時,
追蹤的Vtuber從觀眾只有幾十人的到萬人大箱子加起來有五六百台了,
基本上只要是有對自己喜好的Vtuber都有訂了,
但自己卻很少特別去和人討論這項興趣,
我的日文也不算太好,只能勉強看懂實況內容而已,
如果真的雜談起來還是有點盲人摸象的感覺,
但也就是這種模糊的距離感提高了我對Vtuber的接受度,
要是跑到討論串或者上網找最近發生了什麼事情的話,
反而就會變得不有趣了,
這就有點像玩遊戲看了攻略甚至開作弊、
看動畫影集被劇透一樣,
Vtuber雖然只是實況,
但這層皮和距離感還是很重要的,
譬如有時候看臺灣的Vtuber就會有種裏頭的人在裝可愛的感覺ww,
這也是因為親近感而讓自己對中之人產生了相對清楚的印象,
這樣披著一層皮可能會變得有點小尷尬,
但也不是說這樣就不好,
反過來說這種尷尬感有時候也蠻有趣的,
Vtuber雖然最近討論度比較高了,
在臺灣還算是比較小眾的範疇,
大部分入門困難的原因是聽不太懂日文,
其實我也很久很久沒有特別去找翻譯來看了,
偶爾有些英文的短片或臺灣少數在翻的看看也蠻有趣,
但掛實況主要還是想要一個陪伴的感覺,
其實只要掛著、偶爾追蹤一下推特,
沒什麼特別要求的話,看Vtuber還是一件單純有趣的事情,
凡事總是需要一個入坑的小動機,
玩玩遊戲或唱歌的實況其實也蠻好懂的,
不如說玩的遊戲跟唱的歌通常也就是常見的那幾款、流行的那幾首而已,
把他當一般ACG圈的小興趣也很不錯,
自己比較喜歡那種待在角落、曖曖內含光、默默努力的類型,
所以一些熱門的就不特別推薦了,
這篇主要蒐集那些冷門又沒什麼討論度的Vtuber,
不定期更新一下,
當作自己的Vtuber庫,
希望這篇蒐集到的Vtuber都能長長久久的陪著大家,
度過許多幸福快樂的有趣時光。
(っ´ω`c)
----
(正篇開始分隔線)
----
1.月野木チロル


相當可愛的Vtuber,
在寫這篇的時候YT訂閱是1180人,
平常還有在其他平台開的關係,實際人氣應該稍微多一些,
不過昨天早上開台的時候還為訂閱數增加了10個人而高興了一下,
之前看完台第一次在推特順手轉推了一下,
沒想到還特地回覆了,
自己有點簡單就被圈粉的感覺,
我這個人是很少成為粉絲的,
不過她真的蠻努力在實況上頭的,


每天的早上台還會做精緻的簡報,
每個觀眾都很認真的打招呼,
就算沒什麼留言也可以自己一直講下去的感覺,
不過感覺也是很心思細膩的一個人,
一些小事情或者留言都會很在意的樣子,
特色是會放各種音效,總是把氣氛弄得很有趣,
現在開台前後還會各唱一首歌,
歌配信也很好聽,


自己最一開始應該是從去年在實況列表底部找到她說故事的實況開始看的,
說故事也是她的一大特色,
切換聲線也很擅長的樣子,
有時候不小心換錯角色還會一直道歉,
總是很用心的感覺ww,
戴耳機睡前聽的話就像天堂一樣,
真的好棒啊,
(*´﹃`*)


這樣介紹起來好像是個溫柔可愛的Vtuber,
不過平常實況和玩遊戲的時候其實是很搞笑的,
不如說是有點控制不能的類型,
常常會不小心自言自語起來,
事後又不停的道歉,真的是很可愛啊ww,
玩遊戲的話很有活力的,
如果能多玩點遊戲應該會很有趣的,
ฅ'ω'ฅ


除此之外也有一些出格的Play,
真的是很讓人喜歡的Vtuber啊,
第一位就介紹她吧。
(〃∀〃)ゞ
----
2.望月のあ / MochizukiNoa


唱歌非常好聽的一個Vtuber,
寫這篇文章就是因為聽到她在開歌配信就想說邊聽邊寫的,
此時的訂閱數是2620人,


會唱歌的Vtuber很多,從大台到小台都有,
不過她的歌聲真的很對我喜歡的音域,
看了這麼多台還是第一次讓我真的想把她的歌配信當作歌單邊開發邊聽的那種,
我喜歡的歌聲譬如東方的森羅万象 (Shinra Bansho)裏頭的あよ (Ayo)那種有點可愛又清透的聲線,
不過唱現場實況的就不太容易了,
能找到一個唱出自己特別喜歡歌聲的Vtuber真的不容易啊,
我也算是偏好音域比較窄的那種類型ww,


除此之外她的ASMR跟心音配信也很棒,
也是很適合拿來睡前聽的類型。
(*´﹃`*)
----
3.雲之上夢見


有來臺灣生活的一個Vtuber,
此時有7400位訂閱者,


之前實況的時候聚集了好多臺灣觀眾啊,
臺灣的觀眾其實不難遇到,
不過通常分散在大台的角落,
或者臺灣的Vtuber開台時才會有聚集的感覺,
看台時有種很親切的感覺,
雖然是蘿莉的體型,不過是比較可靠的類型(?)。
----
4.NCKM ch . 神谷ねこ


最近比較有成長一點的Vtuber,
這時的訂閱數是1.14萬人,
本聲感覺稍微沉了一點,
不過唱歌很好聽,


最近的印象是Splatoon 2玩了很多,
耐久的時候掛著台的陪伴感還蠻不錯的,


回頭一看還真的是玩了不少啊,
再玩下去要變成職業選手了ww。
(*´﹃`*)
----
5.白鳥くるみ / Kurumi Shiratori


感覺很精緻的一個Vtuber,
寫這篇時有2500位訂閱者,


最近的印象是早上在開農業新聞(?),
也是冷門卻很用心的感覺,
很喜歡這種感覺啊!
(ノ▽〃)
----
6.福岡バーチャルぶらり旅よかとプロジェクトR


很有元氣的一個Vtuber,
走的是比較粗神經的搞笑路線,
此時有1.27萬位訂閱者,
最近也成長了不少,


這幾天特別有印象的是早上15分鐘的高速問候配信,
這種快速的台還蠻有趣的,
比起白宮的例行記者會,
我總是會不小心點進去這台看一下,
頭髮遮住眼睛有點讓人強迫症啊ww,
不過看完好像一整天都有元氣了。
٩(๑òωó๑)۶
----
7.夢羽ねむり / Yuhane Nemuri


最近剛進化的一個Vtuber,
此時有1430位訂閱者,


前幾天換了新衣裝後變得好清楚啊,
原本短髮有一點點男孩子氣的,
現在是個清楚的少女了(?)
(*´﹃`*)
----
8.姫熊 りぼん-Himekuma Ribon-


特別喜歡的一個Vtuber,
此時已經有2.26萬位訂閱者了,
晚上有粉毛腹黑開這種ASMR真的讓人好興奮啊,


平常開台的時候其實很普通清楚的,
還會玩鋼彈或花騎士這種比較少見的遊戲,
剛好對到我喜歡的點所以很喜歡,
有開的話通常會掛著看一下。
(๑´ڡ`๑)
----
9.泡沫メモリ / Utakata Memory


有箱子的清楚系Vtuber,
現在的訂閱數是8490人,
穩定成長中的樣子,


唱歌很好聽,
玩遊戲時也很清楚的感覺,
之前剛開收益化時收到Donate還會替觀眾擔心一下,
屬於特別喜歡的類型,開台的話都會掛一下。
(ノ´∀`*)
----
10.花奏 かのん -Kanade Kanon Official-


也是最近成長很多的一個Vtuber,
寫這篇時已經有3.5萬位訂閱者了,
開台也能突破千人,
之前還比較冷門的時候也很認真,
特色是晚上的小聲演奏+安靜說話的睡眠導入配信,
清楚的感覺讓人很喜歡啊,


3D的版本有點神奇啊,
脖...脖子有點長?
希望之後能有可愛的新衣裝,
不過還是很喜歡的,聲音也很好聽。
(つд⊂)
----
11.Mimi Channel / 白宮みみ 【あにまーれ】


生草系的Vtuber,
寫這篇時也有2.5萬位訂閱者了,
之前的壺男配信很有趣,


平常雖然蠻搞笑的,
不過我還蠻喜歡這種頭上有放小動物的類型,
真的是很可愛啊!
(ノ∀\*)
----
12.琴乃葉 雪乃。


很棒的一個Vtuber,
應該放更前面的才對,
我雖然沒有很喜歡妖狐系或臉上紅紅的角色,
但她看久了真的很不錯啊,
有種溫柔又平和的感覺,
此時有1.23萬位訂閱者了,
ASMR非常~非常的棒,


最近沉迷FF17,
我平常也沒有很喜歡戴眼鏡的角色,
不過她戴起眼鏡也很不錯,
就算是平常開台的聲音也很令人安心,
聽久了覺得是本聲也很好聽的類型,
真的是很喜歡啊,有開台都會掛著。
ฅ'ω'ฅ
----
13.セフィラ・スゥ


不能算太冷門的Vtuber,
此時有3.47萬位訂閱者,
但是畢竟在大箱子裡面,
跟姊妹或同箱的比起來有時會有點在意的樣子,
特色是多重聲線,造型跟黑化時很可愛,
很喜歡這種角色啊,
第一次看可能會覺得有點扮演過強的感覺,
但久了我卻很能接受,
不如說這也能算一種很棒的特色吧,
另外還有一個很大的重點就是:
かりめ~ら~!(ka ri me~ra~!)
かりめ~ら~!(ka ri me~ra~!)
かりめ~ら~!(ka ri me~ra~!)
的招呼語,
第一次聽之後就久久不能忘懷,
好想她快點下次開台多打一點招呼啊,
久了也會忍不住點進去一下,
就想聽她說一聲:
かりめ~ら~!(ka ri me~ra~!)
真的是很棒,很洗腦的感覺ww,


開台有時會進入卡關耐久的隨興雜談的狀態,
看到角色一直死掉然後還不動聲色的繼續講其他事情也蠻有趣的,
感覺也是心思比較細膩的類型,
觀眾的評論或數量也會很在意的樣子,
聲線切換有時候可能太過了,
但這也算是一種特色啊,自己也很得意的感覺,
做Vtuber做出自己喜歡的樣子還是很重要的,
開台的話很適合掛著的,
可愛的造型加上聲音讓人很幸福的感覺。
(*´﹃`*)
----
14.小蜂める / Koha*CH


立繪很可愛的一個Vtuber,
平常也會開很棒的ASMR,
這時的訂閱數是1290位,


屬於那種有時候會只剩立繪的類型(?)
不過因為很可愛就原諒她吧。
(〃∀〃)ゞ
----
----
(短介紹分隔線)
----
----
以下是比較熱門或冷門但我還看得不夠多的Vtuber,
寫這篇時又覺得不記一下或推一下不太行的感覺,
總之喜歡就多寫點吧!
----
1.Hell Channel-ヘル様-


這個造型哦哦哦哦哦哦哦,
哦哦哦哦哦哦哦哦哦哦哦,
我平常其實不太敢點進去的,
基於各種理由......,
不過喜歡的人應該會喜歡到翻過來才對,
算是我看過前幾有特色的Vtuber,
寫這篇時有1.75萬位訂閱者,
應該是快速成長中?
(つд⊂)
----
2.星ノ谷みや


已經隱退的Vtuber,
在YT上活動比較少,
訂閱只有941位,
回過神來上次活動已經是十個月前了,
引退聲明中提到中之人是畫師
ikataruto:
https://twitter.com/ikataruto
印象中開台時容易噴MIC,
所以我偷偷取了一個噴MIC貓的稱號給她ww,
其實很可愛的,不過可惜沒有繼續下去,
一般來說不會記已經隱退的Vtuber的,
但讓我很有印象的原因主要是當時寫「場外人生」這個專案時,
正在想程式中的角色名應該要怎麼調用時就是看她的台,
所以最後取了一個"米亞()"當作程式中的角色名,
如果你不小心打開了場外人生的原始碼,
就會看到很多像「米亞() + "今天起床時踢到床腳了!" + "\n"」這種文本,
這個「米亞()」的由來就是這個Vtuber,
呃,畢竟是內部程式跟我自己沒由來的細節做法,
不記在這裡就永遠不會有人知道了,
冷門的Vtuber真的要好好珍惜啊。
(つд⊂)
----
3.小花衣 ももみ / Momomi Kohanai


可愛的Vtuber,
寫這篇時訂閱是5350位,
之後看更多的話再轉正(?)。
----
4.むすぶ / Musubu


可愛的Vtuber,
此時有4230位訂閱者,
之後讓我再多看一點。
(*´﹃`*)
----
5.くるみ!


會玩花騎士的Vtuber,
此時的訂閱數是3.77萬位,
我自己其實沒有玩花騎士,
不過喜歡!
(ノ∀\*)
----
6.メリーミルクの森


更多可愛的Vtuber!,
此時已經有7.08萬位訂閱者了,
羊羊跟修女一起的話感覺真棒啊。
(*´﹃`*)
----
7.YUIKA'S ROOM


清楚的Vtuber,
我最喜歡白髮(?)綠瞳的角色了,
平常是屬於那種硬性清楚的類型,
其實我也掛台掛了很久,
有種清楚的安心感。
(*´﹃`*)
----
8.柚木チャンネル ♡生放送専用♡


H系的Vtuber,
這是直播專用的頻道,
跟本體加起來應該有十幾萬訂閱了,
舔耳朵ASMR非常~非常的HHHHH啊啊啊ㄚㄚㄚㄚㄚㄚ,
每晚聽一下就去了,不記一下不行。
(つд⊂)
----
9.家長むぎ【にじさんじ所属】


大箱子的Vtuber,十多萬訂閱,
以本篇的標準來說算是很有人氣了,
之前刷了一整晚的動森,
本體是細膩少女的感覺,
開台有種輕鬆感。
(*´﹃`*)
----
10.えま★おうがすと


生草型的Vtuber,
一樣以本篇的標準有十萬多訂閱算高人氣,
點進去就有種搞笑的感覺,
之前玩魔王房東感覺很合得來(?)
----
11.シスター・クレア -SisterClaire-


修女小姐,
大箱子的長期Vtuber,
以本篇的標準有20萬訂閱算超高人氣了(?),
不過以大箱子和開台時間來說其實不算特別火燙,
但是!但是!,
修女真的是少數長期清楚,
人氣高了時間久了也一路清楚下去的那種,
幾乎是不可動搖的那種清楚啊,
開台時跑出小貓也很可愛,
歌配信也很喜歡,
總之這麼清楚真的要特別推一下。
(*´﹃`*)
----
12.♥️♠️物述有栖♦️♣️


非常喜歡的一個Vtuber,
訂閱快成長到20萬了,
屬於會開耐久歌配信和ASMR的那種類型,
看她的台總是很開心又很安心的感覺,


之前還開過高音歌配信,
還有早晨配信用敲鑼把人叫醒的時候ww,
另外3D算是很精緻了,
總之是很喜歡的一個Vtuber。
(ノ´∀`*)
----
13.のらきゃっとチャンネル


擅長組東西的Vtuber,
特別值得一記的是她的聲音是合成的,
之前後面的大叔有放送事故過ww,
不過人氣不減反增(?),
這個Vtuber特別的是收音後轉成文字再由類似VOCALOID這種輸出,
輸出的非常自然好聽,可愛的感覺,
比一般大叔用變聲器好多了(?)
所以還能有字幕,而且很不一樣的是,
這樣就幾乎是"虛擬"Vtuber了,
從角色到聲音都是虛擬的,
只差靈魂而已......,
如果以後真的出現純AI的虛擬Vtuber,
大概就是這種感覺的進化版吧,
真是期待。
(*´﹃`*)
----
14.夢月ロア🌖Yuzuki Roa


超級喜歡的Roa,
以本篇的標準來說,
大箱子加上高人氣近三十萬訂閱幾乎是天王級了,
不過最近應該是到了成長曲線的中段,
之前開台隨便就兩三萬人狂噴石油的情況比較少了,
算是進入了平穩期?
特別想記的是Roa確實是聲線特別可愛,
哦哦哦的時候也很棒,
雖然高人氣,不過到現在也還是保持著特色,
希望長久下去能變成元老吧。
(*´﹃`*)
----
15.北上双葉


總是輕聲細語的Vtuber,
訂閱十萬出頭比想像中少一點?
玩遊戲給人一種溫柔的安心感,
輕聲細語真的很棒,很喜歡這種感覺。
(*´﹃`*)
----
16.八重沢なとり


老箱子的Vtuber,
訂閱還不到十萬蠻意外的,
不過開台算有人氣的,
前陣子實況了QWOP的地獄級耐久馬拉松,
最後還真的堅持完了,
其實是很清楚的一個Vtuber,
喜歡!
ლ(´ڡ`ლ)
----
17.まこと。


不能算Vtuber的Vtuber,
最近隱藏了訂閱數,
不過粉絲量應該破百萬了(超天王級?),
本體是好聽的聲音+(胸部+腿+手+肩膀+吃燒肉?)+ASMR,
呃,雖然我不是會因為三次元肉體而著迷的那種噁男,
但偶爾...真的是偶爾看看這種的也真棒......
身體很老實,就推一下,就一下。
(つд⊂)
----
18.勇気ちひろ


大箱子的Vtuber,
最近在大量APEX的樣子,
訂閱剛破20萬,
喜歡她耐久的感覺。
(*´﹃`*)
----
19.しぐれうい


大箱子的萬能的女人,
可靠的感覺真棒,
妥善率非常的高。
(*´﹃`*)
----
20.さなちゃんねる


這幾天應該會突破20萬人的護士,
總是很努力的感覺,推一下!
ლ(´ڡ`ლ)
----
21.Haneru Channel / 因幡はねる 【あにまーれ】


追了很久的Vtuber,
很用心還會提攜後輩的那種,
平常雖然組長組長的像黑道一樣,
其實是平易近人的類型,
不過成長比想像中緩慢一點?
親近的感覺有時候缺乏一點距離感,
作為Vtuber有點社交型但又刷不太出人氣,
有種成為現充但又想要現充爆炸的那種感覺ww,
現在剛到17萬大關,
可能時間久了比較不容易增長吧,
不過最近開始歌配信了我也很喜歡,
難道平胸是明顯的劣勢(?)。
(つд⊂)
----
22.Patra Channel / 周防パトラ 【ハニスト】


同箱的Vtuber,
訂閱快30萬了,
我很喜歡,尤其ASMR很棒,
玩遊戲也挑的不錯,會玩美少女遊戲的那種,
一樣是有點宅宅的類型,
但各種層面上似乎屬於更容易吸引人氣的那種,
開著台給人一種安心感,
ASMR真的很棒,讓我再說一次。
(つд⊂)
----
23.Korone Ch. 戌神ころね


必需推的高人氣狗狗,
最近訂閱已經進入後段爆發的那種狀態,
一下就30、40可能快50萬了,
晚上台都有2~3萬人和一群老外聚集,
看台的感覺真的很棒,
玩各種舊遊戲耐久也很厲害而且很有特色,
她第一次開台我是有看的,
那時候還在想這隻狗狗可能不太擅長開台,
有點生疏害羞的感覺,
最後可能會變成普通的清楚系Vtuber,
但事後證明了第一印象完全不可靠啊,
現在可以說是前幾生草又受歡迎的狗狗了,
不過我覺得也不像他們大箱子裏頭那些受歡迎的角色,
我喜歡的東西總是要有點脫俗才行,
Korone開台那種感覺跟Godjj有點像,
那是我少數看的一般實況主,
一般實況開台要碼很用力在上頭,
要碼老練了就有點隨便,
人數少的話可能會變得沒什麼互動,
也有慌慌張張或賣肉的那種類型,
Vtuber也是,有些高人氣的比較像很用力經營形象的那種感覺,
也有開台就有點累心,總是很在意評論或觀眾數、實況內容的那種,
總之怎麼說,一個人開實況畢竟算是一種現場表演,
那種"表演"的舞台感要消去並不容易,
一些老練的實況主可能就不特別去表演了,
雖然消去了"表演"的感覺,但同時也有點太過熟練,
又少了點投入的那種精神和熱情,
像Korone這種開台時讓人覺得這台的實況主是很自然的投入實況,
總是能自然的和聊天室互動,輕鬆的帶風向這種感覺,
開台的內容也能夠自由的收放,想做什麼、想玩什麼就玩什麼,
之前還有一次開整晚開到早上突然就唱起歌來了,
這種感覺真的很棒,讓人覺得實況主是真的本能的喜歡開台,
自然的喜歡去投入其中的感覺,
Korone有時候要關台前還會雜談好一段時間,
或者一路開到早上還說出"才七點啊"這種話,
這種喜歡開台的Vtuber真的討人喜歡,
還有各種意義上Korone雖然是有點輕鬆搞笑的類型,
但看久了居然有種戀愛的感覺,
一個不小心就會帶入Korone真的好棒、好喜歡的那種狀態,
居然能有這麼自然開台投入的女孩子,
真是難得啊,要好好珍惜才行,
能夠有人氣的大爆發真是太好了。
(´Д⊂ヽ
----
24.Natsumi Moe - Virtual YouTuber


英語向Vtuber,
也有三十萬訂閱了,
特色是360度影片,
偶爾也會開台,
文化的關係蠻有特色的。
(*´﹃`*)
----
25.Pekora Ch. 兎田ぺこら


一樣是大箱子的Vtuber,
快四十萬訂閱了,
大箱子在臺灣也算很有人氣了,
也不能算是新人了?
特色是好聽到翻過來的笑聲ww,
總之很有趣就是了,
平常太搞笑不太容易注意到,
其實衣裝意外的色情(?),
這幾天玩異塵餘生4相當有趣,
雖然已經高人氣了,
但還是推一下。
ლ(´ڡ`ლ)
----
26.Uge Channel / 杏戸ゆげ 【ブイアパ】


造型比較特別一點的Vtuber,
有點久了,訂閱數五萬多人,
雖然造型少見了一點,
不過開台久了感覺很不錯的。
(*´﹃`*)
----
27.もこめめ*channel


令人安心的羊,
訂閱快15萬了,
開台的氛圍很棒,有空多看點。
(*´﹃`*)
----
28.ラトナ・プティ -Ratna Petit -にじさんじ所属


大箱子的Ratna小姐,
訂閱剛破13萬比想像中少一點,
不過開台還算有人氣的,
ASMR的感覺很棒,
她有一種獨特輕鬆的慵懶感,
看台的時候很輕鬆啊。
(*´﹃`*)
----
29.千草はな / Chigusa Hana


3D非常可愛的電音狐(?),
訂閱接近兩萬五,
玩遊戲外平常也會唱歌,
3D真的是蠻可愛也有特色的啊。
(*´﹃`*)
----
30.天川はの/AmakawaHano


畫風特別的Vtuber,
這時訂閱剛破兩萬人,
這個Live2D真的是蠻有特色的,
有2D角色動起來的感覺ww,
喜歡的人應該會特別喜歡。
(*´﹃`*)
----
31.綴目日傘


頭髮有點長的Vtuber,
訂閱數是4130位,
實況好像沒有留檔案的樣子,
不過昨天應該才開過台?
----
32.射貫まといちゃんねる


訂閱4.3萬的Vtuber,
最近活動比較少一點的樣子,
看了一下推特應該是存活確認(?),
ASMR很棒。
(*´﹃`*)
----
33.CAMOMI Camomi Channel 【鴨見カモミ】


才華型的畫師Vtuber,
訂閱快六萬了,
不知道為什麼有種繪畫型腐女的感覺,
也會深夜繪畫,畫風很精緻。
(*´﹃`*)
----
34.雪城眞尋/Yukishiro Mahiro【にじさんじ所属】


箱子的Vtuber,
八萬五千的訂閱數,
剛出來的時候有點刻意可愛的感覺,
現在比較回歸自然了(?),
之前玩過一陣子的音GAME。
(*´﹃`*)
----
35.ヒヅキミウ/MIU CHANNEL


白毛綠瞳的Vtuber,
訂閱剛破三萬人次,
很喜歡這種角色啊,
之後多看點。
(*´﹃`*)
----
36.鹿乃 / Kano


重量級的老女人(?!),
不過在花寄女子寮這裡只有七萬多訂閱,
本體最近也有Live2D甚至3D歌曲了,
有種本體完勝的感覺(?),
實際活動起來蠻普通清楚的,
箱子的其他人也不錯的感覺。
(*´﹃`*)
----
37.野々宮ののの / Nonono Nonomiya



花寄女子寮的Vtuber,
目前有2.32萬位訂閱者,
聲線比較沉一點,
不過TETRIS 99玩得很熟練,
擅長俄羅斯方塊的Vtuber真不少啊。
(*´﹃`*)
----
38.星川サラ / Sara Hoshikawa


大箱子還能被稱作新人的Vtuber(?),
訂閱剛破20萬人了,
這種有點外顯的角色造型其實沒有很喜歡,
不過實際看久了還蠻有趣的,
總是很搞笑的感覺,
不過有時候可能有點用力過頭了?
之後開更久了說不定會拿捏得更好,
打大亂鬥時很有趣,
最近開始玩高難度馬力歐了。
(*´﹃`*)
----
39.鈴原るる【にじさんじ所属】


高人氣的lulu,
大箱子裡面人氣推到了三十多萬訂閱,
特色是各種顏藝和糟糕的節奏感(?),
不管什麼時候都很溫柔的感覺,
就算是卡關卡到深夜角色一直死掉也是,
高人氣很有道理啊ww。
----
40.花園セレナ


造型非常可愛的Vtuber,
YT上有1.73萬位訂閱者,
不過在中國很高人氣的樣子,
立繪應該是看過的Vtuber裏頭數一數二喜歡的了,
真的有這麼可愛的貓也太棒了。
(*´﹃`*)
----
41.ユメノシオリ ASMR火曜の女


有7.36萬訂閱的墮天使,
ASMR真的很棒啊,
也是一下就去了的那種類型。
(つд⊂)
----
42.Shizuka Rin Official


會在深夜開台玩一整晚的宅女高中生兼老女人(?),
大箱子的訂閱數默默地漲到快三十萬了,
算是比較陪伴型的Vtuber,
深夜開台其實很適合我的作息,
不過最近我變得有點早睡早起,
一天睡兩次了ww,
玩遊戲還蠻沉迷的感覺,
之前FF14玩了好久好久,
這幾天在玩腦葉公司的樣子。
(*´﹃`*)
----
43.Nakiri Ayame Ch. 百鬼あやめ


大箱子的百鬼小姐,
訂閱剛破25萬,
歌配信特別好聽,
應該是數一數二好聽的那種了
喜歡!
(*´﹃`*)
----
44.Hoonie friends


臺灣的企業Vtuber,
訂閱目前接近兩萬七,
因為本土親切感的關係讓人有種非常特別的感覺,
不介意的話看下去其實還蠻有趣的,
不過有時候真的有點尷尬啊ww,
如果臺灣以後也能有更多精緻的Vtuber就好了,
實際做起來也不太容易,
好好珍惜吧。
(つд⊂)
----
45.Haato Channel 赤井はあと


大箱子的心心,
訂閱接近35萬了,
有時候真的是蠻有趣的,
算是比較出格的那種設定,
玩有趣的遊戲的話搭配起來很有意思。
(*´﹃`*)
----
46.Aqua Ch. 湊あくあ


大箱子的Aqua,
去年加上海外收益據說封王了的樣子,
訂閱也破50萬了,
高人氣的背後感覺其實蠻心思細膩的,
去年玩的歐卡模擬器配信讓我印象很深刻,
最後居然開到深空裡面去了ww,
這就是所謂的神回吧,現在還能找到記錄檔呢。
(*´﹃`*)
----
----
(完結分隔線)
----
----
寫完這篇發現好多Vtuber都消失了啊,
明明好像幾天前才開台過的Vtuber,
回頭一查才發現已經十幾個月甚至一兩年前就沒有活動了,
真的要好好珍惜冷門&喜歡的Vtuber才行,
有限的時光和距離感帶來的美好是很珍貴的,
當然這篇也只推了五六十個Vtuber而已,
實際上喜歡的Vtuber有上百個,
除了停止活動的外,
一些冷門且活動比較少,平常不太能看到的就先不記下來了,
有些熱門過頭的像Fubuki這種大狐狸也就不一個一個推了,
能夠保持高人氣其實很不容易啊,
另外不論是箱推的或者有名無名的沒推到也很正常,
這篇推這麼多已經有點到了文章上限,
點進來瀏覽器也需要載入好一陣子,
再繼續推下去每個都推好像也會炸掉(?),
總之寧缺勿濫,Vtuber這個坑有種神奇的魔力,
看了一個後就會想再看第二個,
不知不覺整個Youtube的訂閱內容就全是Vtuber了,
也剛好我是Youtube主流推薦的熱門影片一部都看不下去的那種,
比較起來Vtuber真的是好上許多,
時間久了對整個圈子的接受度也就逐漸提升了,
到了現在2020年,
Vtuber圈子已經漸漸從戰國時代進入後星際時代了,
小Vtuber在沒有箱子、背景支援或熱門Vtuber的提拔下要生存或長期做下去其實不太容易,
有時也會有一種退縮的心理,
可能開台只有十多個觀眾,沒有名氣也拉不太出流量,
索性只剩立繪開著,或者改走海外市場、換個平台這類的,
但我仍然相信長期開台,努力留下紀錄,
定期的做影片與互動,
即便市場相當的擁擠,
久了努力還是會被看見的,
至少像我這樣的人就很喜歡去發掘新的小眾Vtuber,
一個人努力的模樣總是最吸引人的,
也希望冷門的、默默努力的Vtuber們都能在經歷寒冬後獲得豐碩的成果,
這點和我一個人做獨立遊戲是有點類似的,
有時努力不見得能被人看見,
即便拼命的完成了工作也沒有半點回饋,
但持續的努力最終還是會留下些什麼的,
雖然不能保證成功,
但比起什麼也不做、提前放棄更有意義,
反過來說,比起一昧的追求成功,
把它當成一種自己的興趣,依靠內在動機來緩緩前進,
久了自然而然的就會保持努力的日常了,
所謂路遙知馬力,日久見人心,
希望冷門&喜歡的Vtuber們都能繼續堅持下去,
總覺得很勵志啊,就在這結尾吧,
以後還要掛著Vtuber過上更多幸福的生草時光呢。
(*´﹃`*)
----
豁懷
2020/6/8
----

Unity筆記:如何將2D物件移動至滑鼠點擊的位置?




----
很基本的功能,簡單記錄一下。
----

Vector2.MoveTowards

public static Vector2 MoveTowards
(Vector2 current, Vector2 target, float maxDistanceDelta);

Description

Moves a point current towards target.

This is essentially the same as Vector2.Lerp but instead the function will ensure that the distance never exceeds maxDistanceDelta. Negative values of maxDistanceDelta pushes the vector away from target.


maxDistanceDelta可以理解為每次移動的最大距離,
為負時會向目標位置反向推離。


using UnityEngine;

// 2D MoveTowards example
// Move the sprite to where the mouse is clicked
//
// Set speed to -1.0f and the sprite will move
// away from the mouse click position forever

public class ExampleClass : MonoBehaviour
{
    private float speed = 10.0f;
    private Vector2 target;
    private Vector2 position;
    private Camera cam;

    void Start()
    {
        target = new Vector2(0.0f, 0.0f);
        position = gameObject.transform.position;

        cam = Camera.main;
    }

    void Update()
    {
        float step = speed * Time.deltaTime;

        // move sprite towards the target location
        transform.position = Vector2.MoveTowards(transform.position, target, step);
    }

    void OnGUI()
    {
        Event currentEvent = Event.current;
        Vector2 mousePos = new Vector2();
        Vector2 point = new Vector2();

        // compute where the mouse is in world space
        mousePos.x = currentEvent.mousePosition.x;
        mousePos.y = cam.pixelHeight - currentEvent.mousePosition.y;
        point = cam.ScreenToWorldPoint(new Vector3(mousePos.x, mousePos.y, 0.0f));

        if (Input.GetMouseButtonDown(0))
        {
            // set the target to the mouse click location
            target = point;
        }
    }
}


順帶一提,只要在給予位置後同時把相機位置跟隨正在移動的單位,
加上:
cam.transform.position = transform.position + new Vector3(0,0,-10);
就可以簡單的做出一個跟著滑鼠點擊自由移動且有相機跟隨的物件了,
換句話說,這東西就可以在Unity的世界無盡地自由奔馳了,
當然,實際畫面中需要有相對參考點才能有移動的感覺,
譬如移動到地圖外什麼也沒有的虛空中的話,
觀察者是沒辦法感受到移動的。

另外,通常會改用按鈕之類的UI來當觸發器,
好處是可以讓UI覆蓋在點擊移動的範圍上面,
避免點擊UI的同時也移動到地圖的單位。
(:3ぅ)
----

Unity筆記:自動攻擊最近敵人,箭矢自動指向敵軍射擊。


public Basic 角色腳本;//只是角色的腳本

    private void OnTriggerEnter2D(Collider2D 對象)
    {
        if (!角色腳本.判定對象是否為範圍(對象.gameObject))
//只射擊碰撞到的實際對象,而不是其他物件的攻擊範圍
        {
            角色腳本.角色攻擊敵人(對象.gameObject);

            //Debug.Log(gameObject + "碰撞" + 對象);

        }


    }

    void OnTriggerStay2D(Collider2D 對象)
    {

        if (!角色腳本.判定對象是否為範圍(對象.gameObject))
        {
            角色腳本.角色攻擊敵人(對象.gameObject);

            //Debug.Log(gameObject + "碰撞" + 對象);

        }
    }

    void OnTriggerExit2D(Collider2D 對象)
    {
        if (角色腳本.可攻擊敵人列表.Contains(對象.gameObject))
        {
            角色腳本.可攻擊敵人列表.Remove(對象.gameObject);
        }
    }

//=======================================


 public List<GameObject> 可攻擊敵人列表;
    public void 角色攻擊敵人(GameObject 目標敵人)
    {
        if(是否攻擊敵人 == false)
        {
            float 攻擊速度 = 50 / (1 + 玩家.神力等級() / 3);

            if (目標敵人.GetComponent<itemBasic>().陣營 == 判定.陣營敵人.ToString())
            {
                if (可攻擊敵人列表.Contains(目標敵人) == false)
                {
                    可攻擊敵人列表.Add(目標敵人);
                }

                if (時間秒 - 角色上次攻擊時間 > 攻擊速度)
                {
                    角色上次攻擊時間 = 時間秒;

                    float 暫存距離 = 10000;
                    int 最近敵人 = 0;

                    for (int i = 0; i < 可攻擊敵人列表.Count; i++)
                    {
                        if (可攻擊敵人列表[i] == null)
                        {
                            可攻擊敵人列表.RemoveAt(i);
                            i = 0;
                        }
                        else
                        {
                            float 兩者距離 =
                                Vector2.Distance(player.transform.position, 可攻擊敵人列表[i].transform.position);

                            if (兩者距離 < 暫存距離)
                            {
                                最近敵人 = i;
                                暫存距離 = 兩者距離;
                            }
                        }
                    }


                    //目標敵人 = 可攻擊敵人列表[最近敵人];
                    Debug.Log(可攻擊敵人列表[最近敵人] + "攻擊距離" + 暫存距離);
                    //子彈列表.Add(Instantiate(角色子彈, player.transform.position, new Quaternion(0, 0, 0, 0)));

                    float 生成x位置 = 0;
                    float 生成y位置 = 0;

                    if (可攻擊敵人列表[最近敵人].transform.position.x - player.transform.position.x > 0)
                    {
                        生成x位置 = 0.5f;
                    }
                    else
                    {
                        生成x位置 = -0.5f;
                    }

                    if (可攻擊敵人列表[最近敵人].transform.position.y - player.transform.position.y > 0)
                    {
                        生成y位置 = 0.5f;
                    }
                    else
                    {
                        生成y位置 = -0.5f;
                    }

                    GameObject 暫存新子彈 = Instantiate(角色子彈, new Vector3(player.transform.position.x + 生成x位置, player.transform.position.y + 生成y位置, 0), new Quaternion(0, 0, 0, 0));

                    暫存新子彈.GetComponent<playerBullet>().遊戲管理員 = this;
                    暫存新子彈.GetComponent<playerBullet>().子彈發射(可攻擊敵人列表[最近敵人]);
                    暫存新子彈.GetComponent<playerBullet>().生成時間 = 時間秒;


                    for (int i = 0; i < 可攻擊敵人列表.Count; i++)
                    {
                        if (可攻擊敵人列表[i] == null)
                        {
                            可攻擊敵人列表.RemoveAt(i);
                            i = 0;
                        }
                        else
                        {
                            float 兩者距離 =
                                Vector2.Distance(player.transform.position, 可攻擊敵人列表[i].transform.position);

                            if (兩者距離 > 100)
                            {
                                可攻擊敵人列表.RemoveAt(i);
                                i = 0;
                            }
                        }
                    }
                }
            }
        }

        
    }

//===============================

 public void 子彈發射(GameObject 目標)
    {
        float 目標角度x = 目標.transform.position.x;
        float 目標角度y = 目標.transform.position.y;

        Vector2 目標向量 = new Vector2
(transform.position.x - 目標角度x, 
transform.position.y - 目標角度y);

        //RETURN一個角度值
        float angleZ = Mathf.Atan2(目標向量.y, 目標向量.x) * Mathf.Rad2Deg;

        //把角度值傳給物件
        transform.eulerAngles = new Vector3(0, 0, angleZ + 90);


        //Instantiate(特效, transform.position, transform.rotation);

        單純移動單位(this.gameObject, 20, 目標.transform.position, 遊戲管理員.時間秒, 100, true);
    }

//==============================


程式只是記一下而已,別太在意,
一開始其實直接用OnTriggerStay2D就可以自動攻擊了,
但是這樣沒辦法做出"最近"敵人的效果,
只用Trigger判定會出現鎖定一個敵人後就停不下來了,
土法煉鋼的話網路上是直接弄一個enemylist,
用tag之類的屬性每次尋遍一次,
但是對象有上百上千個時這種做法很吃效能,
還是要用Trigger於實際遇到目標時再弄可攻擊敵人的列表會更好一些,

分成三階段,
1.角色索敵範圍發現敵人,
使用Trigger進入與停在範圍內時發動攻擊,
2.發動攻擊時新增列表,在列表中挑出最近的可攻擊敵人攻擊,
3.攻擊後並且旋轉箭矢,面對敵人射擊,
4.將過遠、已摧毀、已離開攻擊範圍的單位移出列表,

中間卡了一陣子原來是把新增敵人列表的方法寫在了射擊速度延遲後才判定,
其實只要保持有碰撞時立刻判定就不會有這種問題了,
之後來弄個弓箭手、箭塔還有城堡好了,
箭矢有穿透兼少量的擊退效果和沒射中時插在地上一陣子的狀態感覺不錯。
(っ´ω`c)

Unity筆記:用程式更改Sprite和Animator設定Write Default衝突的小問題。


通過程式更改Sprite應該是一件很簡單的事情,

public Sprite mySprite;

this.GetComponent<SpriteRenderer>().sprite = mySprite;

不過這天實際操作起來卻一直沒辦法正確反應,
論壇上另一種作法是載入資源,
不過這兩種寫法應該是幾乎一樣的,
研究了半天才想到應該是物件有Animator覆蓋了預設的sprite,


這個隱藏在animator中每個動畫的小設定Write Default,
取消後它就不會在動畫結束後跑回原本的sprite了,
之前的問題是因為程式雖然成功更改了sprite,
但動畫管理員在播完後又把它改了回去,
有時還會一抖一抖的,
取消後就完全正常了,
唯一需要注意的是,
Write Default會回到預設的那個sprite,
譬如動畫是從0~1~2~3這樣,
之前如果沒有特別寫0~1~2~3~0也會變回去,
取消後就要自己再補一幀或者直接用程式在動畫播完後改想要的sprite也可以,
總之,可以在動畫撥放前後、以及靜態的情況下自由更改物件的sprite,
基本上就完全掌握了物件的圖像表現方式了。
(*´﹃`*)

Write Default其實還有更複雜的動畫銜接問題,
不過這天處理的只是動畫與更改sprite的關係,
另外,其實也可以直接用動畫來更改想表現的sprite,
說起來有點繞口,總之最終的表現方式是滿意的且效能良好就可以了。
ლ(´ڡ`ლ)

Unity筆記:音量滾動條之方法選擇輸入預設值的小問題




音量滾動條在場外人生已經做過一次了,
不過新遊戲卻用一樣的腳本卡了兩三個小時,
問題出在滾動條方法中的On Value Chang多了一個預設值,
明明場外人生中就沒有的讓人很疑惑啊,
搞了半天回頭一想才發現同個滾動條的方法中有"動態"和"輸入值"兩種,
動態會顯示在最上面,並且不會有預設值才對,
一般方法的話就等同是用固定的預設值來操作了,
要讓滾動條的On Value Chang生效要選擇動態才行,
總之弄好就好了,
開發做這種系統功能性的東西有時候挺繁瑣的,
但不做又不太行,
總之拿出耐心做好吧。
(っ´ω`c)

Unity筆記:地圖邊界敵人生成器。





【小地圖王國】的單位是會無限的畫出地塊的,
並且有趨向玩家的一個慣性存在,
所以把玩家放在中央演示出來,
會形成這樣的圖案,
偶爾自行走出去的單位增加邊界,
邊界生成的單位又走回來到中心,
由於邊界是可以無限浮動的,
所以隨著進行地圖會緩緩的擴張,

定義:

levelX為地圖的最大x值,
最小levelX為地圖的最小x值,

y值同理


public Vector2 地圖邊界位置()
    {
        int 隨機值 = Random.Range(1,5);

        float 生成位置x = levelX;
        float 生成位置y = levelY;

        if (隨機值 == 1)
        {
            生成位置x = levelX;
            生成位置y = Random.Range(最小levelY, levelY + 1);
        }
        else if(隨機值 == 2)
        {
            生成位置x = Random.Range(最小levelX, levelX + 1); ;
            生成位置y = levelY;
        }
        else if (隨機值 == 3)
        {
            生成位置x = 最小levelX;
            生成位置y = Random.Range(最小levelY, levelY + 1);
        }
        else if (隨機值 == 4)
        {
            生成位置x = Random.Range(最小levelX, levelX + 1); ;
            生成位置y = 最小levelY;
        }
        else
        {
            Debug.Log("【地圖邊界位置小錯誤!】");
        }

        return new Vector2(生成位置x, 生成位置y);
    }

可以優化成switch之類的不過沒有關係,

之後要再測試一下有沒有額外的問題,
不過這種生成器應該只會給殭屍之類的單位來用,
平常還是會依天數從特定方向生成一批單位,
然後由AI建造建築來生產敵人會比較有趣,
也能做出攻打聚落和城市的感覺。
(っ´ω`c)

Unity筆記:存檔系統


----------
2020/6/26
----------
花了一個早上把小地圖王國的存檔系統給做完了,
很多人大概覺得遊戲的存檔系統只要按個鍵什麼的就會生出來了,
但實際做過遊戲的人都知道存檔其實是開發中前幾麻煩的事情,
像Unity這樣的引擎,它的預設類還是沒有辦法直接序列化的,
所以必須把資料類和引擎類分開,
在開發場外人生時我就已經痛苦過一次了,
這次開發小地圖王國更多的是上百個獨立單位和腳本,
存檔系統也會稍微複雜一點,
話是這麼說,不過有了之前的經驗,
只掙扎了一個早上就完整做出來了,
唉,人的成長有時候就是這樣,
努力著努力著就熟練了,
最後放棄思考也能把它做完,
效率也蠻高的,
測試上百次最後看到沒問題時應該是很有成就感的,
不過到後面整個人已經有點萎縮起來了,
好累啊,想脫離苦海的感覺,
我真的不是那種喜歡寫程式的人,
這種存檔系統尤其,
不過一回生二回熟,
下次寫這種東西可能就直接複製就好了,
所以把今天寫出來還沒整理又亂七八糟的東西先記在這吧,
至少這是可以完美存檔的。
(つд⊂)
----------
存檔分為幾個部分:

1.固定的存檔:
舉例來說,玩家進了遊戲順手調整了音效,
那麼可以預期下次他打開遊戲時希望系統自動讀取了上次調整的音效,
這部分的"設定"屬於固定的自動存檔,
玩家雖然沒感覺,
但還是要存起來。

2.主腳本的存檔:
包含了遊戲管理員、玩家和世界的資源、
系統項目甚至是玩家物件都放在這裡。

3.遊戲中的物件:
相對複雜的部份,
首先,可以預期遊戲中會有不少動態生成的物件,
像小地圖王國這種建造沙盒類的尤其如此,
生產的單位、建築都屬於這類,
Unity非但沒有那種一鍵儲存物件的功能,
相反的物件資料是不能直接序列化的,
一些關聯性和繼承unity類的腳本都要手動的重新讀取,
資源站上當然有很多號稱可以一鍵讀取的腳本,
但不論如何,到了最後還是要自己寫接口把自己的資料存進去才行,
如果沒有特別的需求,
自己寫說不定還少點麻煩,
至少我只花了一個上午就從零開始做完了ww。
(早上05~11點)

4.地圖和其他東西的存檔:
這些東西不一定能序列化,
資料需要整個重建才行,
稍微有一點點麻煩,
不過量相較起來會少一點。
----------
開始前要意識到一件事情,
像存檔系統這種東西愈早寫完愈好,
如果很晚才寫,
那麼之後要改架構工作量就會成指數成長,
很高興這次有了之前的開發經驗沒有再走回頭路,
直接把專案開始後的基本架構給設計好了,
真的感到自己成長了啊,
QAQ
----------
總之,我把這個上午寫完的東西貼在這裡,
亂七八糟的只留給自己參考,
其實核心只有序列化跟反序列化而已,
真的要做並不困難,
做完之後就一勞永逸了,
每個單位只要調用同一個方法就會自動存檔了。
(つд⊂)
----------
固定存檔:

[System.Serializable]
public class 固定存檔
{
    public Basic 玩家資料二;


    public string 是否有存檔 = "";


    public float 音樂音量存檔 = 1.0f;
    public float 音效音量存檔 = 1.0f;
    public void 儲存音樂音量()
    {
        音樂音量存檔 = 玩家資料二.背景音樂管理員.volume;
        Save();
    }
    public void 儲存音效音量()
    {
        音效音量存檔 = AudioListener.volume;
        Save();
    }
   
   
    public void 讀取音量存檔()
    {
        玩家資料二.調整音樂音量(音樂音量存檔);
        玩家資料二.調整音效音量(音效音量存檔);
    }

    public string 語言模式;

    public void Save()
    {
        玩家資料二 = GameObject.Find("GameManager").GetComponent<Basic>();

        var serializedData = JsonUtility.ToJson(玩家資料二.固定存檔);

        byte[] serizliedData = System.Text.Encoding.UTF8.GetBytes(serializedData);

        var filePath = Application.persistentDataPath + "/save/" + "staticSave.dat";

        Debug.Log("存檔位置:" + filePath);

        System.IO.File.WriteAllBytes(filePath, serizliedData);
    }

    public void Load()
    {
        玩家資料二 = GameObject.Find("GameManager").GetComponent<Basic>();

        string dirPath = Application.persistentDataPath + "/save";
        if (System.IO.Directory.Exists(dirPath))
        {
            Debug.Log("已有存檔資料夾:" + dirPath);
        }
        else
        {
            System.IO.Directory.CreateDirectory(dirPath);
            Debug.Log("創建存檔資料夾:" + dirPath);
        }

        var filePath = Application.persistentDataPath + "/save/" + "staticSave.dat";

        Debug.Log("存檔位置:" + filePath);

        try
        {
            var serizliedData = System.IO.File.ReadAllBytes(filePath);

            var serializedData = System.Text.Encoding.UTF8.GetString(serizliedData);

            JsonUtility.FromJsonOverwrite(serializedData, 玩家資料二.固定存檔);
        }
        catch (System.IO.FileNotFoundException)
        {
            Debug.Log("讀檔無存檔文件");
        }

        玩家資料二 = GameObject.Find("GameManager").GetComponent<Basic>();
    }
}
----------
主腳本存檔:

public void Save()
    {
        玩家名 = 玩家資料.玩家基本單位管理員.單位資料.單位名稱;

        玩家x = 玩家資料.player.transform.position.x;
        玩家y = 玩家資料.player.transform.position.y;

        var serializedData = JsonUtility.ToJson(玩家資料.玩家);

        byte[] serizliedData = System.Text.Encoding.UTF8.GetBytes(serializedData);

        var filePath = Application.persistentDataPath + "/save/save1/" + "playerSave.dat";

        Debug.Log("存檔位置:" + filePath);

        System.IO.File.WriteAllBytes(filePath, serizliedData);

   
        //地圖存檔區===============================
        var mapserializedData = JsonUtility.ToJson(new Serialization<string, string>(地塊位置對應地塊名字));

        byte[] mapserizliedData = System.Text.Encoding.UTF8.GetBytes(mapserializedData);

        var mapfilePath = Application.persistentDataPath + "/save/save1/" + "mapSave.dat";

        Debug.Log("地圖存檔位置:" + mapfilePath);

        System.IO.File.WriteAllBytes(mapfilePath, mapserizliedData);
        //===============================

        //單位資料存檔區===============================
        var itemdataserializedData = JsonUtility.ToJson(new Serialization<string, string>(存檔次序對應單位類型));

        byte[] itemdataserizliedData = System.Text.Encoding.UTF8.GetBytes(itemdataserializedData);

        var itemdatafilePath = Application.persistentDataPath + "/save/save1/" + "itemdataSave.dat";

        Debug.Log("單位資料存檔位置:" + itemdatafilePath);

        System.IO.File.WriteAllBytes(itemdatafilePath, itemdataserizliedData);
        //===============================
    }

    public void Load()
    {
        var filePath = Application.persistentDataPath + "/save/save1/" + "playerSave.dat";

        Debug.Log("存檔位置:" + filePath);

        try
        {
            var serizliedData = System.IO.File.ReadAllBytes(filePath);

            var serializedData = System.Text.Encoding.UTF8.GetString(serizliedData);

            JsonUtility.FromJsonOverwrite(serializedData, 玩家資料.玩家);
        }
        catch (System.IO.FileNotFoundException)
        {
            Debug.Log("讀檔無存檔文件");
        }

        //地圖讀檔區=====================
        var mapfilePath = Application.persistentDataPath + "/save/save1/" + "mapSave.dat";

        Debug.Log("地圖存檔位置:" + mapfilePath);

        try
        {
            var mapserizliedData = System.IO.File.ReadAllBytes(mapfilePath);

            var mapserializedData = System.Text.Encoding.UTF8.GetString(mapserizliedData);

            地塊位置對應地塊名字 = JsonUtility.FromJson<Serialization<string, string>>(mapserializedData).ToDictionary();
        }
        catch (System.IO.FileNotFoundException)
        {
            Debug.Log("讀檔無存檔文件");
        }
        //==============

        //單位資料讀檔區=====================
        var itemdatafilePath = Application.persistentDataPath + "/save/save1/" + "itemdataSave.dat";

        Debug.Log("單位資料存檔位置:" + itemdatafilePath);

        try
        {
            var itemdataserizliedData = System.IO.File.ReadAllBytes(itemdatafilePath);

            var itemdataserializedData = System.Text.Encoding.UTF8.GetString(itemdataserizliedData);

            存檔次序對應單位類型 = JsonUtility.FromJson<Serialization<string, string>>(itemdataserializedData).ToDictionary();
        }
        catch (System.IO.FileNotFoundException)
        {
            Debug.Log("讀檔無存檔文件");
        }
        //==============
    }
----------
用到的工具類,
Unity的Json現在應該是可以存list的,
不過泛型不行,
還有字典也不行,
所以要調用以下的工具類來把它存進去,
用到字典的部分包含了地圖的地址對地塊名,
還有所有需存檔物件的存檔編號對應單位名稱,
泛型list應該是沒有用到才對。

// Serialization.cs
// List<T>
[System.Serializable]
public class Serialization<T>
{
    [SerializeField]
    List<T> target;
    public List<T> ToList() { return target; }

    public Serialization(List<T> target)
    {
        this.target = target;
    }
}

// Dictionary<TKey, TValue>
[System.Serializable]
public class Serialization<TKey, TValue> : ISerializationCallbackReceiver
{
    [SerializeField]
    List<TKey> keys;
    [SerializeField]
    List<TValue> values;

    Dictionary<TKey, TValue> target;
    public Dictionary<TKey, TValue> ToDictionary() { return target; }

    public Serialization(Dictionary<TKey, TValue> target)
    {
        this.target = target;
    }

    public void OnBeforeSerialize()
    {
        keys = new List<TKey>(target.Keys);
        values = new List<TValue>(target.Values);
    }

    public void OnAfterDeserialize()
    {
        var count = System.Math.Min(keys.Count, values.Count);
        target = new Dictionary<TKey, TValue>(count);
        for (var i = 0; i < count; ++i)
        {
            target.Add(keys[i], values[i]);
        }
    }
}
----------
單位存檔:

[System.Serializable]
public class 單位資料
{
    public itemBasic 單位資料腳本;

    public float 上次生產單位時間;
    public float 上次工作時間;

    public string 陣營;
    public string 單位細節;
    public long 血量;
    public long 血量上限;
    public float 上次恢復血量時間;
    public long 攻擊力;

    public string 單位名稱;
    public long 單位經驗;

    public float 單位x;
    public float 單位y;

    public void 存檔()
    {
        單位x = 單位資料腳本.gameObject.transform.position.x;
        單位y = 單位資料腳本.gameObject.transform.position.y;

        int 存檔次序 = 單位資料腳本.遊戲管理員.玩家.存檔次序對應單位類型.Count;

        單位資料腳本.遊戲管理員.玩家.存檔次序對應單位類型.Add
            (
            存檔次序.ToString()
            ,
            單位細節
            );

        Save(存檔次序);
    }

    public void Save(int 單位次序)
    {
        var serializedData = JsonUtility.ToJson(單位資料腳本.單位資料);

        byte[] serizliedData = System.Text.Encoding.UTF8.GetBytes(serializedData);

        var filePath = Application.persistentDataPath + "/save/save1/" + 單位次序 + "Save.dat";

        Debug.Log("存檔位置:" + filePath);

        System.IO.File.WriteAllBytes(filePath, serizliedData);
    }

    public void Load(int 單位次序)
    {
        var filePath = Application.persistentDataPath + "/save/save1/" + 單位次序 + "Save.dat";

        Debug.Log("存檔位置:" + filePath);

        try
        {
            var serizliedData = System.IO.File.ReadAllBytes(filePath);

            var serializedData = System.Text.Encoding.UTF8.GetString(serizliedData);

            JsonUtility.FromJsonOverwrite(serializedData, 單位資料腳本.單位資料);
        }
        catch (System.IO.FileNotFoundException)
        {
            Debug.Log("讀檔無存檔文件");
        }
    }
}
----------

地圖存檔和最後保存和讀取的接口:

public void 存檔按鈕()
    {
        string dirPath = Application.persistentDataPath + "/save/save1";

        if (System.IO.Directory.Exists(dirPath))
        {
            System.IO.Directory.Delete(dirPath,true);
            Debug.Log("刪除已有存檔資料夾:" + dirPath);

            System.IO.Directory.CreateDirectory(dirPath);
            Debug.Log("創建存檔資料夾:" + dirPath);
        }
        else
        {
            System.IO.Directory.CreateDirectory(dirPath);
            Debug.Log("創建存檔資料夾:" + dirPath);
        }


        GameObject[] 需存檔單位列表 = GameObject.FindGameObjectsWithTag("save");

        玩家.存檔次序對應單位類型 = new Dictionary<string, string>();

        for (int i = 0; i < 需存檔單位列表.Length; i++)
        {
            itemBasic 存檔單位基本管理員 = 玩家基本單位管理員.對象基本腳本(需存檔單位列表[i]);

            存檔單位基本管理員.存檔();
        }

        玩家.Save();

       



        固定存檔.是否有存檔 = 玩家.是();
    }
    public void 讀檔按鈕()
    {
        if(固定存檔.是否有存檔 == 玩家.是())
        {
            初始化();

            玩家.Load();

            玩家基本單位管理員.單位資料.單位名稱 = 玩家.玩家名;

            player.transform.position = new Vector2(玩家.玩家x,玩家.玩家y);

            for (int y = 玩家.最小levelY; y < 玩家.levelY; y++)
            {
                for (int x = 玩家.最小levelX; x < 玩家.levelX; x++)
                {
                    string 位置文字 = 轉換地塊位置為文字(x, y);

                    if (玩家.地塊位置對應地塊名字.ContainsKey(位置文字))
                    {
                        tilemap.SetTile
                    (new Vector3Int((int)轉換地塊文字為位置(位置文字).x, (int)轉換地塊文字為位置(位置文字).y, 0),
                    地塊名字對應地塊物件[玩家.地塊位置對應地塊名字[位置文字]]);
                    }
                }
            }

            for (int i = 0; i < 玩家.存檔次序對應單位類型.Count; i++)
            {
                string key = i.ToString();

                if (玩家.存檔次序對應單位類型.ContainsKey(key))
                {
                    if (玩家.存檔次序對應單位類型[key] == 判定.單位細節玩家劍士.ToString())
                    {
                        GameObject 暫存單位 = 生成基本劍士玩家方法(player.transform.position);

                        對象讀檔(i, 暫存單位);
                    }
                    else if (玩家.存檔次序對應單位類型[key] == 判定.單位細節敵人劍士.ToString())
                    {
                        GameObject 暫存單位 = 生成基本劍士敵人方法(player.transform.position);

                        對象讀檔(i, 暫存單位);
                    }
                    else if (玩家.存檔次序對應單位類型[key] == 判定.單位細節玩家工人.ToString())
                    {
                        GameObject 暫存單位 = 生成基本工人玩家方法(player.transform.position);

                        對象讀檔(i, 暫存單位);
                    }
                    else if (玩家.存檔次序對應單位類型[key] == 判定.單位細節玩家工人房屋.ToString())
                    {
                        GameObject 暫存單位 = 生成基本工人房屋玩家方法(player.transform.position);

                        對象讀檔(i, 暫存單位);
                    }

                }
            }

            更新圖標人口與消耗量();
            更新所有資源();

            詢問名字.SetActive(false);
            主選單第一層.SetActive(true);

            主選單.SetActive(false);
        }
        else
        {
            更新作者的話
                (
                "No saved file found!" + "\n" +
                "沒有找到存檔!" + "\n"
                );
        }
    }

    public void 對象讀檔(int i,GameObject 對象)
    {
        itemBasic 對象基本腳本 = 玩家基本單位管理員.對象基本腳本(對象);

        對象基本腳本.單位資料.Load(i);

        對象基本腳本.gameObject.transform.position =
            new Vector2
            (
                對象基本腳本.單位資料.單位x,
                對象基本腳本.單位資料.單位y
            );

        對象基本腳本.單位資料.單位資料腳本 = 對象基本腳本;
    }
----------

就這樣!
做完了好開心啊,
這幾天可以火力全開來寫新單位了,
我有強烈的預感這會是一款神作,
希望這種感覺能持久一點。
(〃∀〃)ゞ