さけのさかなのブログ

同人ゲーム開発やってます。Unity使ったりする。

【Unity】麻雀ライブラリ 2

前回の麻雀ライブラリをちょいちょいバージョンアップし、機能追加した。詳しくはREADMEに書いてある。

優先行動処理

 チーよりポンの方が優先して実行するとかの対応。

シリアライズ処理

 状態をjson文字列にシリアライズできる。保存、通信、巻き戻しとかに使える。

github.com

toriden.hatenablog.com

【Unity】麻雀ライブラリ

github.com

何をするライブラリなのか

 麻雀のルール部分を実装したライブラリです。

 卓上にある牌を管理して、鳴いたりロンしたりといったAPIを提供します。

 あるのはルール部分の実装のみなので、「牌を画面に表示する」「ユーザー操作を受け付ける」「AIが打つ」といった部分は別途開発する必要があります。

使い方

半荘の開始

 GameCreateしてルールを定める

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(); 

ゲームの終わり

 RoundResultgameResultを持っている場合はゲーム終了。

if (roundResult.gameResult != null)
{
    // 終了処理
}

できていないこと

 ローカルルールは設定で切り替えられたらいいなあ

  • ダブル役満
  • 国士無双の暗槓の槍槓
  • オープンリーチ
  • 花牌、季節牌(赤牌は実装済み)
  • 九種九牌処理(流せません)
  • 四家立直(流れません)
  • 三家和(通常通り点の支払いが行われます)
  • トビ無し(トビあり固定)
  • 食いタン禁止(アリ固定)
  • 喰い替え禁止(あり固定)
  • 焼き鳥(なし固定)
  • 八連荘(何も起こりません)
  • 二翻縛り(常に一翻縛り固定)

追記

 そういえば壁牌や山牌の状態については無頓着で、とりあえずシャッフルしてListにしてある牌を前からとっていくだけというものになっています。 何がまずいかというと、鷲巣麻雀のような山牌もちゃんと管理しなきゃいけない変則ルールに対応できないんですね。要る?

追記2

 鷲巣麻雀では山牌は見えずにランダムでしたね

コミケで頒布予定だったもの

 アクリルフィギュア2種類。イラストは茹でピーさんに描き下ろしていただきました。

f:id:enuenupi:20200430080359p:plain  かわいいですね。

f:id:enuenupi:20200430080406p:plain  サイズ参考。

 というわけで次以降サークル参加したら持っていきます。

4月10日にMagicScrollTactics PS4リリースです

f:id:enuenupi:20200408134359j:plain

 といっても特に追加要素とかはなし! 細かいバグが見つかったのを直したりとかはあるんですが(効果音まわりとか)、ゲームプレイに関して影響のある変更はありません。遊びたいハードで買おう!

 ということで、これがMSTに関して現状最後の弾(正月に言ってた「やり残し」)です。なんかSwitch版からえらく時間がかかりましたが、振り返ってみれば燃え尽きてました少々。もう何回通しプレイしたか分かんない。これ以上ゲームが長くなると通しプレイが日をまたぐことになって体力精神ともにきっついなーという感じなので、開発者の皆様におきましては長いゲームにとりかかる時は正気を投げ捨てましょう。二周目とかどうすりゃええねん。

 オートプレイは(デバッグ用ではなく)標準機能として実装しとくととても助かります。おすすめ。

store.playstation.com

【Unity】CameraのViewportRectのレイアウトが崩れないようにする

 Cameraのスクリーン上の描画範囲はViewportRectによって設定できる。が、そのままだと使いづらいので、補助のためのスクリプト

 具体的には画面アスペクト比が変化してもレイアウトが崩れないようにできる。(UIのCanvasScalerと同じような感覚で使える)

github.com

f:id:enuenupi:20200218092514p:plain

【Unity】自作パッケージのサンプル作成

 ようやく自作パッケージのサンプルコードに着手しはじめた。とりあえず分かりづらそうなところで、翻訳、ルビ表示、ファイル読み書き。

github.com

github.com

github.com

 サンプルコードはpackageManagerからインポートできる。

f:id:enuenupi:20200215213215p:plain

参考

https://forum.unity.com/threads/samples-in-packages-manual-setup.623080/