【Unity】麻雀ライブラリ
何をするライブラリなのか
麻雀のルール部分を実装したライブラリです。
卓上にある牌を管理して、鳴いたりロンしたりといったAPIを提供します。
あるのはルール部分の実装のみなので、「牌を画面に表示する」「ユーザー操作を受け付ける」「AIが打つ」といった部分は別途開発する必要があります。
使い方
半荘の開始
Game
をCreate
してルールを定める
var beforeRoundStart = Game.Create(Random.Range(0, 4), new RuleSetting() { end = new Mahjongs.Rules.EndRule() { extraRoundScoreThreshold = 30000, lengthType = Mahjongs.Rules.LengthType.東風戦, suddenDeathInExtraRound = true, }, payment = new Mahjongs.Rules.PaymentRule(30000, 20, 10, -10, -20), initialScore = 25000, redTile = Mahjongs.Rules.RedTile.赤ドラ3 } );
局の開始
var afterDraw = beforeRoundStart.StartRound();
局を進める
APIを呼ぶと戻り値としてIController
が返ってくるので、これを使ってゲームを進行していく。
// 牌を選択して捨てる var afterDiscard = afterDraw.Discard(tile, riichi: false); // 捨てられた牌を鳴く if (afterDiscard.CanChi(player)) { var afterDraw = afterDiscard.Chi(player, tile); } else { // 鳴かないなら下家へ手番を移す // このとき流局判定も行われる var afterDraw = afterDiscard.AdvanceTurn(out var roundResult, out var finishRoundStates); }
局の終わり
流局や上がりを処理するAPIは、RoundResult
を返す。
// ツモ if (afterDraw.CanTsumo()) { var roundResult = afterDraw.Tsumo(out tsumoResult); }
// ロン if (afterDiscard.CanRon(player)) { var roundResult = afterDiscard.Ron(out ronResult, player); }
// 次の局を開始する
var afterDraw = roundResult.beforeRoundStart.StartRound();
ゲームの終わり
RoundResult
がgameResult
を持っている場合はゲーム終了。
if (roundResult.gameResult != null) { // 終了処理 }
できていないこと
ローカルルールは設定で切り替えられたらいいなあ
- ダブル役満
- 国士無双の暗槓の槍槓
- オープンリーチ
- 花牌、季節牌(赤牌は実装済み)
- 九種九牌処理(流せません)
- 四家立直(流れません)
- 三家和(通常通り点の支払いが行われます)
- トビ無し(トビあり固定)
- 食いタン禁止(アリ固定)
- 喰い替え禁止(あり固定)
- 焼き鳥(なし固定)
- 八連荘(何も起こりません)
- 二翻縛り(常に一翻縛り固定)
追記
そういえば壁牌や山牌の状態については無頓着で、とりあえずシャッフルしてList
にしてある牌を前からとっていくだけというものになっています。
何がまずいかというと、鷲巣麻雀のような山牌もちゃんと管理しなきゃいけない変則ルールに対応できないんですね。要る?
追記2
鷲巣麻雀では山牌は見えずにランダムでしたね
コミケで頒布予定だったもの
アクリルフィギュア2種類。イラストは茹でピーさんに描き下ろしていただきました。
かわいいですね。
サイズ参考。
というわけで次以降サークル参加したら持っていきます。
コミケで頒布予定だったアクリルフィギュアが届いた! 描きおろしイラストで2種類。自作品のグッズは作らにゃ存在しねーぞということに気づいたのでやっていく。画像2枚目はサイズ参考ね。#magicscrolltactics pic.twitter.com/FC3VrU8cJE
— enu@C98火南カ15a (@_enu) 2020年4月29日
4月10日にMagicScrollTactics PS4リリースです
といっても特に追加要素とかはなし! 細かいバグが見つかったのを直したりとかはあるんですが(効果音まわりとか)、ゲームプレイに関して影響のある変更はありません。遊びたいハードで買おう!
ということで、これがMSTに関して現状最後の弾(正月に言ってた「やり残し」)です。なんかSwitch版からえらく時間がかかりましたが、振り返ってみれば燃え尽きてました少々。もう何回通しプレイしたか分かんない。これ以上ゲームが長くなると通しプレイが日をまたぐことになって体力精神ともにきっついなーという感じなので、開発者の皆様におきましては長いゲームにとりかかる時は正気を投げ捨てましょう。二周目とかどうすりゃええねん。
オートプレイは(デバッグ用ではなく)標準機能として実装しとくととても助かります。おすすめ。
【Unity】CameraのViewportRectのレイアウトが崩れないようにする
Cameraのスクリーン上の描画範囲はViewportRectによって設定できる。が、そのままだと使いづらいので、補助のためのスクリプト。
具体的には画面アスペクト比が変化してもレイアウトが崩れないようにできる。(UIのCanvasScalerと同じような感覚で使える)
画面アスペクト比が変わってもCameraのViewportRectによる描画範囲が崩れないようにするスクリプト。https://t.co/unNIbK8yA7 pic.twitter.com/toBB4FuV5v
— enu (@_enu) 2020年2月17日
【Unity】自作パッケージのサンプル作成
ようやく自作パッケージのサンプルコードに着手しはじめた。とりあえず分かりづらそうなところで、翻訳、ルビ表示、ファイル読み書き。
サンプルコードはpackageManagerからインポートできる。
参考
https://forum.unity.com/threads/samples-in-packages-manual-setup.623080/
2020年のこと
去年振り返り
やること
MST
去年に海外のSwitchで出せて一区切りついた……んだけど、実はまだやることが残ってたりする。というわけで今年はまずそれだ。そのうちなんか出せると思います。
次作品
なんやかんやで伸び伸びになってますね! この時点で難産なんですが。がんばる。
出すとすればまずはSteamアーリーアクセスになると思います。そこでバグ対応しつつ翻訳対応して正式リリースの流れかなあ。
(それはそれとしてさっさとストアページは作ろう つくりたい)
裏方
去年はあんまりなんもできてないなーみたいな感じなんですが、見えないところでちょこちょこ動いてたりします。
開発に全速を出すのも一つのやり方だとは思うんですが、そうではなくもうちょい防御的に、見えてる爆弾を片づけたり。とにかく即死しないように布石を置いてみたりだ。
というわけで去年に仕込んでおいたものを今年は回収していこう。まあ見えないんですが。
イベント
コミケとかのイベントで何をやるか?というのは、すっかりWebが主戦場になった当サークルではずっと課題なんですが、冬コミでMSTの小説本を書いてみて、こういうのでもいいかなあ。とか思ってみたり。
リリース済み作品関連で何か出す感じ。アクスタとか……アクスタとか
GitHub
去年の後半ぐらいからなんですが、UnityPackageという形でリポジトリをちょいちょい公開しています。まあ基本的に自分用なんですけど(複数プロジェクトでモジュール共有しようとするとこうなる)、コード公開は良い文化なので今年もやっていく。
欲を言えば他の開発者の役に立てれば良いんですが、ドキュメントなりサンプルなりを用意せえという話なのでメンドクササが倍増し、まあでも今年は欲をかいてその辺を目標にやっていきましょう。
【Unity】音まわりパッケージ
ナニコレ
そろそろ音まわりの処理が共通化できそうだなーということでやってみる。
とはいえ音に関してはこだわったことをしたことがないので、機能は必要最低限という感じ。FPSなんか作るともう少し演出的にやるべきことができるんだろうけど…。
リポジトリ
機能
- BGMのフェードアウトつき遷移
- BGMアセットの読み込み先切り替え(アセットバンドル or 内部アセット)
- ただし、アセットバンドル版だと起動時に全部読み込んでメモリに乗せるというゴリ押しの実装になっている。
- というのもロード処理に関してはハードの影響をモロに受けるので、ベストプラクティスな書き方がないように見える。なのでとりあえずはロード時間が問題にならない方式を用意しておいた。
- ロード処理はある程度アプリ側で書けるようにしてある。
IMusicStore
を実装すればいい。
- ただし、アセットバンドル版だと起動時に全部読み込んでメモリに乗せるというゴリ押しの実装になっている。
- 効果音同時再生の抑制
- 同じ音が大量に同じフレームに鳴って潰れる、みたいなのを回避する。
- ちょっとした工夫として、使い終わった音声ファイルは(設定されていれば)
AudioClip.UnloadAudioData
を呼んで使用メモリを減らすようにしている。
TODO
これまで作ったパッケージの機能を網羅するサンプルプロジェクトがあればいいかなあ。