Date: 20220820
Version: 1
- 這幾天在試試看TTS,看可不可以將自製桌遊放進去,以後也可以進行線上測試。
- 推薦Youtube頻道「Ludo Lodge」,有基本介紹如何使用TTS做自製桌遊。
- TTS的官方操作文件「Tabletop Simulator Knowledge Base」和「Tabletop Simulator API」,建議實作之前應該至少瀏覽一次,後續就當作工具書使用即可。
- 個人操作說明如下:
- 選擇custom進入遊戲後,先依照桌遊人數設定選擇相對應的table。
- 因為我的是卡牌類型的,所以選擇component/custom deck,準備將卡牌堆匯入。
- 匯入前須要先準備以下東西:
- 我是用「Card Creator」在Steam有販售,目前作者還有另一款是「Tabletop Creator」,但目前還在EA階段,且價格大概1400左右,我覺得有點貴,可能等之後完成後特價再買吧,目前基本夠用,主要我的設計都還是卡牌類型的。
- 用Card Creator產出tts可用的圖檔,使用預設值即可,產出前後面圖檔。
- 該圖檔是由10*7張圖片組成,共70張。
- 匯入選項將前後面圖檔匯入,如果想與其他人測試,請選擇cloud,如果背面圖檔都一樣的話,可以使用1張卡片的圖檔即可,若有不一樣的話,記得勾選unique選項,將最後一個選項back is hidden勾選起來,完成後匯入即可。
- 建議全部一起匯入,意思是如果有7個牌堆,每堆10張,不要分成7次匯入,應該1次匯入1個牌堆,共70張,等全部匯入後再自行分開即可。
- 接著在操作牌堆前,先介紹幾個TTS常用的動作:
- shuffle洗牌
- deal發牌,發牌到玩家手牌
- cut切出XX數量的牌
- split將原牌堆平均分成XX個牌堆
- 透過上述動作,就可以將步驟5中合起來的牌堆一一分開,分開後就可以準備進入到coding的階段,這時候建議先進行存檔。
- 如果你的桌遊需要一定程度的設置,真心建議寫個程式讓其可以自動完成設置,當然除了設置之外,還有很多動作可以用程式達成,可以參考「肥龍實況➤Pathogen 疫途 | #攻鎖棋 下一作! 病毒變種跑到冥界去啦!!!!! (同場加映攻鎖棋規則+遊玩!)」,裡面的自動動作都是透過程式達成,真的厲害。
- 進入coding前,點選牌堆右鍵取得其GUID,也就是這個物件的代號,具有唯一值,有幾個需要操作的,就記錄幾個。
- 從面板上方進入到Modding/Scripting,起始會有幾個區塊如下:
- Save/Play儲存運行的地方
- 這邊給幾個建議,當你場上有手動新增/修改/刪除物件時,請使用Menu中的存檔,override覆蓋原本的檔案進行存檔。
- 而這邊的Save/Play是單純給程式碼使用的,換句話說,當你調整了物件後,又跑去改程式碼,當Save/Play運行時,會儲存程式碼,但物件環境會使用當初載入的狀況。
- 以上這兩點在使用上請多加留意。
- Lua程式碼
- TTS程式碼的語言是使用Lua,算是一種非常簡單程式語言,建議開始寫前可以先了解一下Lua相關語法,不用太多。
- 選擇此區域,表示要開始寫程式碼了。
- UI介面
- 玩家可操作介面建置的地方,採用XML為架構,也是很常見的形式。
- 可以在這裡建立相關操作介面,例如:按鈕。
- Global全域
- 可以算是整個環境參數,會影響到整個環境。
- 選擇Lua和Global,表示你要寫有關Global的程式。
- 選擇UI和Global,表示你要寫有關Global的UI介面。
- 當然有Global,就有區域,你可以給每一個物件都寫相對應的程式碼或UI。
- 準備進入正題,Setup的部分,有幾種方式可達成:
- onLoad在遊戲loading時完成設置
- button on object在一個實體物件上建立一個按鈕(實體按鈕),例如: token
- button on screen在螢幕上建立按鈕(虛擬按鈕)
- 以上3種我都是過,最後我是選擇第3種,第1種在loading時自動完成,沒辦法手動控制,第2種需要先放一個token在桌面上,我覺得不直覺,但有很多遊戲是這樣設置的,且上方教學影片也是採用此方法,好處是可以用簡單的方式讓按鈕不見(讓物件消失即可),反而第3種要讓按鈕不見有點困難(虛擬無實體),應該可以,但我還沒研究出來。
- UI
- 建立按鈕:主要設置的按鈕
- <button
- id="setUpButton"
- height="100"
- width="150"
- onClick="setUp"呼叫setUp的function
- rectAlignment="MiddleRight"會對齊畫面右側中間
- fontSize="32"
- textColor="red"
- >Set Up
- </button>
- 建立按鈕2:介紹另一種設置的方法
- <button
- id="missionButton"
- height="100"
- width="150"
- onClick="missionSetUp"
- rectAlignment="MiddleRight"同上,一樣是畫面右側中間,但會重疊
- fontSize="32"
- textColor="blue"
- offsetXY="0 -100"使用這個參數調整XY,會在上面按鈕的下方,XY座標是base on ectAlignment為基礎座標
- >Mission
- </button>
- Lua
- 建立GUID清單
- mainGUID = "b37b47"牌堆的GUID
- missionPublicGUID = "9a21d7"牌堆的GUID
- missionPrivateGUID = "e64367"牌堆的GUID
- 建立bool參數,另一種方式讓按鈕失效,畢竟setup只要一次就行
- isSetUp = true
- isMission = true
- 建立function
- function setUp()設置的功能
- if isSetUp then如果是true則執行,完成後變false,這樣按鈕只會執行一次
- print("setUp")會在聊天室印出,提供確認用而已,非必要
- local mainDeck = getObjectFromGUID(mainGUID)重點,從GUID辨認是哪一個物件,宣告並使用此物件,後續才能操作此物件
- mainDeck.shuffle()洗牌,很多次只是洗爽的
- mainDeck.shuffle()
- mainDeck.shuffle()
- mainDeck.shuffle()
- mainDeck.shuffle()
- mainDeck.shuffle()
- mainDeck.shuffle()
- mainDeck.shuffle()
- mainDeck.shuffle()
- print("shuffle")
- mainDeck.setPositionSmooth({0,0,0},false,true)移動到桌面中央,setPositionSmooth可以設定是否碰撞,但如果是setPosition,則無法,會造成牌堆碰撞,導致牌堆歪掉,會不正,所以使用setPositionSmooth,另外,畫面正中央為0,0,0,很重要,下方就是依據這個去擺放
- print("setPosition")
- subDecks = mainDeck.split(9)分成9個牌堆,原牌堆90張,9個牌堆,每堆10張,其預設會在原地分成9個牌堆,且會垂直交互放置,就像-|-這樣,90度旋轉交互放置
- print("split")
- subDecks[1].setPosition({-3,0,4})左上角,面對桌子其方位為(左右,前後,上下)
- subDecks[1].rotate({0,-90,0})轉正
- subDecks[2].setPosition({0,0,4})中間上方
- subDecks[3].setPosition({3,0,4})右上角
- subDecks[3].rotate({0,-90,0})
- subDecks[4].setPosition({-3,0,0})左側中間
- subDecks[5].setPosition({3,0,0})右側中間
- subDecks[5].rotate({0,-90,0})
- subDecks[6].setPosition({-3,0,-4})左下角
- subDecks[7].setPosition({0,0,-4})下方中間
- subDecks[7].rotate({0,-90,0})
- subDecks[8].setPosition({3,0,-4})右下角,而第9堆就是原牌堆,其GUID是一樣的,一開始就放在(0,0,0),所以不用異動
- print("Set Up!!!")
- isSetUp = false當完成設置後,將參數改為false,這樣再點按鈕就不會觸發,避免場面錯誤
- end
- end
- 建立function-2
- function missionSetUp()提供另一種設置的方式,相同的部分就不再贅述
- if isMission then
- print("missionSetUp")
- local missionPublic = getObjectFromGUID(missionPublicGUID)
- local missionPrivate = getObjectFromGUID(missionPrivateGUID)
- missionPrivate.shuffle()
- missionPrivate.shuffle()
- missionPrivate.shuffle()
- missionPrivate.shuffle()
- missionPublic.shuffle()
- missionPublic.shuffle()
- missionPublic.shuffle()
- missionPublic.shuffle()
- missionPrivate.deal(1)發1張牌到玩家手牌,預設是發給所有玩家
- print("privateDeal")
- for i=1, 3 do迴圈,預設為++,所以不用特別寫,執行以下程式碼3次,可以使用這個方法來進行設置也是可以的
- missionPublic.takeObject({position={7,0,-8+(i*4)}})這句意思是,從object A中拿object B,被拿的object B要做甚麼處理,所以可以看到object A是一個容器類型,例如: 牌堆deck、抽袋bag...等,object B就是裡面的單一物件,例如: 卡牌card、代幣token...等,()裡面就是來說明要如何處理object B,依序放到定位,會在上方3*3牌堆的右側,由下往上放3張
- end
- print("publicTakeObject")
- print("Mission Set Up!!!")
- isMission = false
- end
- end
- 以上就是有關自製桌遊的自動設置,感覺還行,沒用到很難的程式碼,大概花了2天的時間閱讀資料,第2天就可以寫出來了,應該是沒有很難,之後就可以線上找人協助測試了,但不清楚其他玩家是否看得到按鈕。
沒有留言:
張貼留言